Nous avons un démon qui lit les données de certains capteurs, et parmi les choses qu'il calcule (en plus de simplement rapporter l'état), il y a le temps moyen nécessaire aux capteurs pour passer d'une valeur à une autre. Il conserve une moyenne de 64 points de données et suppose que le temps d'exécution est assez constant.
Malheureusement, comme le montre le graphique ci-dessous, les données d'entrée ne sont pas les plus parfaites:
(Chaque ligne représente un ensemble de données différent; l'axe des x ne signifie vraiment rien d'autre qu'un vague axe de temps historique).
Ma solution évidente pour traiter avec cela serait de créer un histogramme des données, puis de choisir le mode. Cependant, je me demandais s'il y avait d'autres méthodes qui donneraient de meilleures performances ou seraient plus adaptées à un fonctionnement avec une moyenne mobile. Certaines recherches rapides sur Wikipédia suggèrent que des algorithmes de détection des valeurs aberrantes peuvent également convenir. La simplicité est un plus, puisque le démon est écrit en C.
Edit : J'ai scopé Wikipédia et suis venu avec ces différentes techniques:
-
Critère de Chauvenet: en utilisant la moyenne et l'écart type, calculez la probabilité qu'un point de données particulier se produise, puis excluez-le si la probabilité est réellement que mauvaise est inférieure à 50%. Bien que cela semble bien adapté pour corriger une moyenne mobile à la volée, je ne suis pas tout à fait convaincu de son efficacité: il semble qu'avec de grands ensembles de données, il ne voudrait pas supprimer les points de données.
-
Test de Grubbs: une autre méthode qui utilise la différence entre la moyenne et l'écart-type, et a une expression pour le cas où l'hypothèse de "pas de valeurs aberrantes" est rejetée
-
Distance de Cook: mesure l'influence d'un point de données sur une régression des moindres carrés; notre application la rejetterait probablement si elle dépassait 1
-
Moyenne tronquée: ignorez le bas et le haut de gamme, puis prenez la moyenne comme normale
Quelqu'un a-t-il une expérience spécifique et peut-il commenter ces techniques statistiques?
Aussi, quelques commentaires sur la situation physique: nous mesurons le temps moyen jusqu'à l'achèvement d'une machine à laver mécanique, donc son temps d'exécution devrait être assez constant. Je ne sais pas s'il a réellement une distribution normale.
Edit 2 : Une autre question intéressante: quand le démon est en train de bootstrap, comme dans, il n'a pas de données précédentes à analyser, comment doit-il traiter les données entrantes? Ne faites tout simplement pas d'élagage des valeurs aberrantes?
Edit 3 : Encore une chose ... si le matériel change de telle sorte que les temps d'exécution deviennent différents, cela vaut-il la peine de faire le algorithme suffisamment robuste pour ne pas abandonner ces nouveaux runtimes, devrais-je juste me rappeler de vider le cache quand cela se produit?