Math et stats
Salut.
J'ai un petit problème de maths. J'ai une série d'équations qui me donne tout un tas de résultats. Je veux ensuite moyenner ces résultats. Or, dans ces résultats, il y en a qui sont absurdes.
Je m'explique avec un exemple réel : j'ai 83 valeurs, dans ces 83 valeurs, j'en ai 78 comprises entre -14 et +12, puis j'ai un 489, un531, un 8541, un 8789, et un 10213. Si je moyenne avec les 83 valeurs, j'obtiens un résultat qui ne représente pas la réalité. Il faudrais donc que je puisse supprimer les 5 valeurs absurdes.
En résumé, j'ai un nuage de résultats, je souhaiterais pouvoir virer tous ceux qui sont en dehors de ce nuage, par calcul, de façon automatique.
Comment je peux m'y prendre ?
J'ai un petit problème de maths. J'ai une série d'équations qui me donne tout un tas de résultats. Je veux ensuite moyenner ces résultats. Or, dans ces résultats, il y en a qui sont absurdes.
Je m'explique avec un exemple réel : j'ai 83 valeurs, dans ces 83 valeurs, j'en ai 78 comprises entre -14 et +12, puis j'ai un 489, un531, un 8541, un 8789, et un 10213. Si je moyenne avec les 83 valeurs, j'obtiens un résultat qui ne représente pas la réalité. Il faudrais donc que je puisse supprimer les 5 valeurs absurdes.
En résumé, j'ai un nuage de résultats, je souhaiterais pouvoir virer tous ceux qui sont en dehors de ce nuage, par calcul, de façon automatique.
Comment je peux m'y prendre ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourrais-tu nous donner en gros quelques "stats" sur tes valeurs ?
- 78/83 de bonnes, c'est toujours dans ces eaux-là ? où y'a des cas où c'est plus catastrophique que ça, genre 50/83 ?
- Les valeurs fausses sont de part et d'autres de la moyenne recherchée ? Ou toujours au largement dessus, ou largement au dessous ?
- Les valeurs fausses sont de l'ordre de combien, maximum, au dessus de la valeur moyenne recherchée ? Ca peut monter et descendre jusqu'à combien ?
- La valeur moyenne recherchée tourne-t-elle toujours autour du même chiffre (tu sais que tu vas avoir des valeurs autour de zéro, entre +/- 20, par exemple ? Ce qui pourrais te permettre de supprimer d'office les valeurs trop grandes ? J'imagine que ce n'est pas aussi simple)
Le plus simple à mon avis est de calculer la valeur médiane. Ou alors la valeur (arrondie à l'entier le plus proche si tes nombres sont des flottants) à plus forte fréquence d'apparition. Quitte à se prendre une fenêtre de plus d'une unité (calculer la fréquence d'apparition des nombres entre 0 et 5, entre 5 et 10, entre 10 et 15, etc, donc fenêtre d'histogramme de taille 5 unités, par ex)
Ca te donnera une valeur M qui va te donner une idée de la valeur centrale autour de laquelle tes valeurs tournent, en général. Et grace à cette valeur M, tu pourras zapper les valeurs trop éloignées de M, pour calculer ta moyenne que sur les nombres qui sont dans le voisinage de M.
L'autre solution plus mathématique, et peut-être plus adaptée, c'est de calculer l'écart-type E de ta série (au passage tu auras besoin de calculer la moyenne M avant), puis de ne garder ensuite que les valeurs qui sont dans la fenêtre [M-aE,M+aE], où a est un coefficient pondérateur, la valeur 1 pouvant aller, mais une valeur un peu inférieure genre 0.9 te permettra d'enlever un peu plus de valeurs, ça dépend si les valeurs erronées sont loin ou pas de la moyenne.
Concernant les stats, j'ai pas beaucoup de retour, car pas beaucoup de données à exploiter .....
Ce que je peux dire :
- 78/83, c'est toujours dans ces eaux là .... je pense pas moins de 72/83
- les valeurs fausses sont à priori au dessus de la moyenne, largement ça dépend .... Elles sont largement au dessus du nuage, mais parfois la moyenne est tellement élevée, que les valeurs sont finalement proches d'elle
- les valeurs varient tout le temps ....
Je vais regarder tes conseils, et faire quelques essais pour voir comment ça réagi ...
Maintenant, il faut que je valide sur plusieurs jeux de données.
Donc du genre tant que ton écart type est > 5, tu réapplique ton "filtre"
L'idée est simplement de faire un filtrage médian. C'est ce qu'on fait avec les images bruitées pour supprimer le bruit (type "salt & pepper", petits grains/pics dans l'image sur certains pixels qui ont des valeurs n'ayant rien à voir avec leurs voisins)
Si tu ne sais pas en quoi consiste un filtrage médian c'est vraiment pas compliqué : tu parcourres ta série de valeurs, et tu retiens la valeur médiane entre la valeur courante, précédente et suivante. (Pour la première et dernière valeur, il suffit de "faire le tour"). Pour rappel la médiane de 3 valeurs c'est la valeur qui n'est ni le max ni le min, juste celle entre les 2.
Exemple : une série "3,40,2,5,4,230,3,2"
1) Pour la valeur 3, tu retiens la médiane entre les valeurs 2 (dernier élément de ta série, on boucle pour ce cas particulier),3 et 40, donc 3.
2) Pour la valeur 40, tu retiens la médiane entre 3,40,2 : donc 3
3) Pour 2, tu retiens médiane(40,2,5) donc 5
...
6) Pour 230, tu retiens médiane de 4,230,3, donc 4
Et tu vois qu'ainsi avec cette méthode à chaque fois que tu as une valeur "pic", elle es substituée par la valeur d'un de ses voisins, donc après l'application du filtre (qui consite juste en un boucle for ou un Enumerator, puis un test pour savoir la valeur que tu mets dans ton tableau résultat), les pics ont disparus, et tu peux calculer la moyenne.
Ce n'est pas la même chose que d'éliminer totalement ces valeurs "pics", mais c'est plus rapide au niveau algo pour finalement pas bcp de différence sur le résultat final.
J'espère qu'Unix n'a pas à trier des valeurs genre issue d'un appareillage dont les valeurs erronnées seraient systématiquement les 10 consécutives, les premières (genre le temps qu'un capteur "chauffe") ou les dernières en fin de mesure ...
C'est pour ça que j'ai dit que ma 2e solution c'était juste pour filter le bruit de type "Salt & Pepper", et que ça avait pour avantage d'être très facilement implémentable (le filtre médian est l'un des plus simples) tout en étant relativement efficace...
... mais évidemment on ne peut pas tout avoir : il n'est pas sans défauts, et il est évident que s'il y a plusieurs valeurs erronnées consécutives, ça nous met dedans
La meilleure solution à mon avis reste encore celle où l'on utilise l'écart-type, et on fait de la décimation jusqu'à ne garder qu'un ensemble de valeurs plutôt regroupées (écart type faible)
Je vais le mettre en place pour comparer avec la précedente méthode.
Parcequ'en fait, je n'ai pas toujours 83 valeurs, parfois, j'en ai moins (jusqu'à 3). Il faut que je fasse un test lorsque je n'ai que 3 valeurs (dans ce cas là , la probabilité pour avoir une abérante dans le lot est très très faible ...).