Domanda:
Correzione di valori anomali in una media corrente
Edward Z. Yang
2009-04-12 12:24:17 UTC
view on stackexchange narkive permalink

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?

Durante il bootstrap fornire 64 punti dati per eseguire il seed della media corrente.
Ma quali sarebbero quei 64 punti dati? Potrebbe non essere opportuno presumere a priori che la macchina funzionerebbe in X time.
Il test di Grubbs è superiore agli altri metodi perché è computazionalmente più economico determinare i coefficienti di regressione che ordinare e classificare i dati.
Il sistema deve sapere che è in fase di calibrazione e di avvio automatico. Le tecniche tipiche prevedono di seminare i primi valori con il valore iniziale più o meno il dieci percento. Quando arriva il secondo valore, i valori seminati sono il primo e il secondo valore intercalati.
Interessante! Sono d'accordo sul fatto che probabilmente voglio evitare di ordinare i dati, il che renderebbe difficile l'implementazione di una media troncata.
Se un evento noto sta per cambiare la distribuzione, è essenziale ricalibrare. In uno spettrometro di massa il dispositivo diventa più preciso man mano che si adatta al composto analizzato. Questo è un metodo ben noto per aumentare la precisione supportando una grande varietà di input.
Sette risposte:
SPWorley
2009-04-12 12:57:36 UTC
view on stackexchange narkive permalink

Se il grafico di esempio che hai è tipico, allora uno qualsiasi dei criteri che elenchi funzionerà. La maggior parte di questi metodi statistici servono a superare il limite degli errori proprio al livello sfocato di "è davvero un errore?" Ma il tuo problema sembra estremamente semplice .. i tuoi errori non sono solo un paio di deviazioni standard dalla norma, sono 20+. Questa è una buona notizia per te.

Quindi, usa l'euristica più semplice. Accetta sempre i primi 5 punti circa per evitare che un picco di avvio rovini il tuo calcolo. Mantieni la media e la deviazione standard. Se il punto dati cade di 5 deviazioni standard fuori dalla norma, scartalo e ripeti il ​​punto dati precedente come riempitivo.

Se conosci in anticipo il tuo comportamento tipico dei dati, potresti non aver nemmeno bisogno di calcolare la media e deviazione standard, è possibile cablare limiti assoluti di "rifiuto". In realtà è meglio in quanto un errore iniziale non farà esplodere il rilevatore.

Eccellente! Una cosa però; sebbene conosciamo il comportamento tipico, è possibile che l'hardware venga cambiato, quindi credo che sarebbe preferibile un programma adattabile.
Anche se deve essere adattabile, metti comunque dei limiti ESTREMI. Se un problema tecnico hardware ti dà 1e280 come valore, o NaN o + Inf, potresti volerli filtrare indipendentemente.
ojblass
2009-04-12 12:35:41 UTC
view on stackexchange narkive permalink

La definizione di ciò che costituisce un valore anormale deve scalare ai dati stessi. Il metodo classico per eseguire questa operazione consiste nel calcolare il punteggio z di ciascuno dei punti dati e nel eliminare i valori superiori a 3 punteggi z dalla media. Il punteggio z può essere trovato prendendo la differenza tra il punto dati e la media e dividendo per la deviazione standard.

Quanto bene funzionerebbe questo metodo per il caso patologico della linea blu?
Il caso patologico della linea blu ha una deviazione standard elevata. Ci vorrebbe un valore marginale significativo per essere rifiutato.
vak
2009-06-24 17:16:27 UTC
view on stackexchange narkive permalink

Calcolerei una mediana in esecuzione (alternativa robusta alla media) e una folle (alternativa robusta a sd), rimuovere tutto ciò che è distante più di 5 matti dalla mediana http://epp.eurostat.ec. europa.eu/portal/page/portal/research_methodology/documents/S4P1_MIRROROUTLIERDETECTION_LIAPIS.pdf

fredxi
2013-07-26 17:23:19 UTC
view on stackexchange narkive permalink

Un'altra soluzione è usare la media armonica.

Il tuo caso è molto simile all'esempio discusso in

http://economistatlarge.com/finance/applied -finanza / differenze-aritmetica-geometrica-armonica-significa

Amico, armonico significa FTW!Le persone dovrebbero davvero dare un'occhiata a questo!
ozan
2009-04-12 12:53:28 UTC
view on stackexchange narkive permalink

Devi avere un'idea della variazione o della distribuzione prevista, se vuoi essere in grado di escludere alcune istanze di variazione (maggiori) come errate. Ad esempio, se puoi approssimare la distribuzione del risultato "tempi medi" a una distribuzione normale (gaussiana), puoi fare ciò che ojblass ha suggerito ed escludere quei risultati che mostrano una variazione maggiore di qualche multiplo della deviazione standard ( che può essere calcolato al volo insieme alla media corrente). Se si desidera escludere i risultati che hanno una probabilità del 99,75% (circa) di essere errati, escludere quelli che variano più di 3 deviazioni standard dalla media. Se desideri solo il 95% di certezza, escludi quelli che variano più di 2 deviazioni standard e così via.

Sono sicuro che un po 'di ricerca su Google per "deviazione standard" o "distribuzione gaussiana" ti aiuterà . Naturalmente, questo presuppone che ti aspetti una distribuzione normale dei risultati. Potresti non farlo. In tal caso, il primo passo sarebbe quello di indovinare quale distribuzione ti aspetti.

1800 INFORMATION
2009-04-12 12:26:45 UTC
view on stackexchange narkive permalink

Forse un buon metodo sarebbe ignorare i risultati che sono più di un valore definito al di fuori della media corrente corrente?

Sì, ma come si dice cos'è questo "valore definito"?
Mi aspetto che derivi da un esame dei dati basato sui risultati effettivi
Vorrei davvero evitare di codificare qualcosa di simile nel programma
Potrebbe essere un parametro di configurazione?
dmckee
2009-04-12 20:22:27 UTC
view on stackexchange narkive permalink

La risposta ingenua (e forse la migliore) alla domanda di bootstrap è "Accetta i primi N valori senza filtrare". Scegli N in modo che sia il più grande possibile, consentendo comunque che il tempo di configurazione sia "breve" nella tua applicazione. In questo caso, potresti considerare di utilizzare la larghezza della finestra (64 campioni) per N.

Quindi sceglierei un qualche tipo di filtro basato sulla media e sul sigma.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 2.0 con cui è distribuito.
Loading...