Abbiamo un demone che legge i dati da alcuni sensori e tra le cose che calcola (oltre a riportare semplicemente lo stato) c'è il tempo medio impiegato dai sensori per passare da un valore all'altro. Mantiene una media corrente di 64 punti dati e presuppone che il runtime sia abbastanza costante.
Sfortunatamente, come dimostrato dal grafico sotto, i dati di input non sono i più incontaminati:
(Ogni riga rappresenta un diverso insieme di dati; l'asse x non significa nient'altro che un vago asse temporale storico).
La mia ovvia soluzione per trattare con questo sarebbe creare un istogramma dei dati e poi scegliere la modalità. Tuttavia, mi chiedevo se esistessero altri metodi che avrebbero prodotto prestazioni migliori o sarebbero stati più adatti per il funzionamento con una media corrente. Alcune rapide ricerche su Wikipedia suggeriscono che potrebbero essere adatti anche algoritmi per il rilevamento di valori anomali. La semplicità è un vantaggio, poiché il demone è scritto in C.
Modifica : ho individuato Wikipedia e ho escogitato queste varie tecniche:
-
Criterio di Chauvenet: utilizzando la media e la deviazione standard, calcola la probabilità che si verifichi un particolare punto dati, quindi escludilo se la probabilità è effettivamente così negativa è inferiore al 50%. Anche se questo sembra essere adatto per correggere al volo una media corrente, non sono del tutto convinto della sua efficacia: sembra che con grandi set di dati non vorrebbe scartare i datapoint.
-
Test di Grubbs: un altro metodo che utilizza la differenza dalla media alla deviazione standard e ha qualche espressione per quando l'ipotesi di "nessun valore anomalo" viene rifiutata
-
Distanza di Cook: misura l'influenza che un punto dati ha su una regressione dei minimi quadrati; la nostra applicazione probabilmente lo rifiuterebbe se superasse 1
-
Media troncata: elimina la fascia bassa e la fascia alta, quindi considera la media come normale
Qualcuno ha qualche esperienza specifica e può commentare queste tecniche statistiche?
Inoltre, qualche commento sulla situazione fisica: stiamo misurando il tempo medio fino al completamento di una lavatrice meccanica, quindi la sua autonomia dovrebbe essere abbastanza costante. Non sono sicuro che abbia effettivamente una distribuzione normale.
Modifica 2 : Un'altra domanda interessante: quando il demone esegue il bootstrap, come in, non ha dati precedenti analizzare, come dovrebbe trattare i dati in arrivo? Semplicemente non eseguire alcuna potatura anomala?
Modifica 3 : ancora una cosa ... se l'hardware cambia in modo tale che i tempi di esecuzione cambino, vale la pena algoritmo sufficientemente robusto da non scartare questi nuovi runtime, dovrei semplicemente ricordarmi di svuotare la cache quando ciò accade?