Algoritmo semplice per il rilevamento di valori anomali online di una serie storica generica


88

Sto lavorando con un gran numero di serie storiche. Queste serie temporali sono essenzialmente misurazioni di rete che arrivano ogni 10 minuti e alcune sono periodiche (ovvero la larghezza di banda), mentre altre no (ovvero la quantità di traffico di routing).

Vorrei un semplice algoritmo per eseguire un "rilevamento anomalo" online. Fondamentalmente, voglio conservare in memoria (o su disco) tutti i dati storici per ogni serie temporale e voglio rilevare eventuali valori anomali in uno scenario live (ogni volta che viene catturato un nuovo campione). Qual è il modo migliore per ottenere questi risultati?

Attualmente sto usando una media mobile per rimuovere un po 'di rumore, ma poi quale sarà? Cose semplici come la deviazione standard, pazza, ... contro l'intero set di dati non funziona bene (non posso supporre che le serie temporali siano fisse) e vorrei qualcosa di più "accurato", idealmente una scatola nera come:

double outlier_detection (doppio * vettore, doppio valore);

dove vettore è l'array di double contenente i dati storici e il valore restituito è il punteggio di anomalia per il nuovo "valore" di esempio.


1
Per chiarezza, ecco la domanda originale su SO: stackoverflow.com/questions/3390458/…
Matt Parker

1
Penso che dovremmo incoraggiare i poster a pubblicare link come parte della domanda se hanno pubblicato la stessa domanda in un altro sito SE.

si, hai perfettamente ragione. La prossima volta menzionerò che il messaggio è incrociato.
gianluca,

Ti suggerisco anche di consultare gli altri link correlati sul lato destro della pagina. Questa è una domanda popolare ed è emersa in una varietà di domande in precedenza. Se non sono soddisfacenti, è meglio aggiornare la tua domanda sulle specifiche della tua situazione.
Andy W,

Buona cattura, @Andy! Uniamo questa domanda con l'altra.
whuber

Risposte:


75

Ecco una semplice funzione R che troverà valori anomali delle serie temporali (e facoltativamente mostrarli in un diagramma). Gestirà serie storiche stagionali e non stagionali. L'idea di base è quella di trovare stime affidabili dell'andamento e dei componenti stagionali e sottrarli. Quindi trova i valori anomali nei residui. Il test per i valori anomali residui è lo stesso del diagramma a scatole standard: si presume che i punti superiori a 1,5 IQR sopra o sotto i quartili superiore e inferiore siano valori anomali. Il numero di QIQ al di sopra / al di sotto di queste soglie viene restituito come "punteggio" anomalo. Quindi il punteggio può essere qualsiasi numero positivo e sarà zero per i non outlier.

Mi rendo conto che non lo stai implementando in R, ma trovo spesso una funzione R un buon punto di partenza. Quindi il compito è tradurre questo in qualunque lingua sia richiesta.

tsoutliers <- function(x,plot=FALSE)
{
    x <- as.ts(x)
    if(frequency(x)>1)
        resid <- stl(x,s.window="periodic",robust=TRUE)$time.series[,3]
    else
    {
        tt <- 1:length(x)
        resid <- residuals(loess(x ~ tt))
    }
    resid.q <- quantile(resid,prob=c(0.25,0.75))
    iqr <- diff(resid.q)
    limits <- resid.q + 1.5*iqr*c(-1,1)
    score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
    if(plot)
    {
        plot(x)
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

+1 da parte mia, eccellente. Quindi, l'intervallo quartile> 1,5 X è la definizione di consenso di un valore anomalo per le serie dipendenti dal tempo? Sarebbe bello avere un riferimento indipendente dalla scala.
Doug

Il test anomalo è sui residui, quindi si spera che la dipendenza dal tempo sia piccola. Non conosco un consenso, ma i grafici a scatole sono spesso utilizzati per il rilevamento anomalo e sembrano funzionare abbastanza bene. Esistono metodi migliori se qualcuno volesse rendere la funzione un po 'più elaborata.
Rob Hyndman,

Grazie davvero per il tuo aiuto, apprezzo molto. Sono abbastanza impegnato al lavoro ora, ma ho intenzione di testare un approccio come il tuo il più presto possibile e tornerò con le mie considerazioni finali su questo problema. Un solo pensiero: nella tua funzione, da quello che vedo, devo specificare manualmente la frequenza delle serie temporali (quando la costruisco) e il componente della stagionalità viene considerato solo quando la frequenza è maggiore di 1. C'è un modo robusto gestire questo automaticamente?
gianluca,

1
Sì, ho ipotizzato che la frequenza sia nota e specificata. Esistono metodi per stimare automaticamente la frequenza, ma ciò complicherebbe notevolmente la funzione. Se hai bisogno di stimare la frequenza, prova a fare una domanda separata a riguardo - e probabilmente fornirò una risposta! Ma ha bisogno di più spazio di quello che ho disponibile in un commento.
Rob Hyndman,

2
@Marcin, ti consiglio di prenderlo a pugni da solo. Magari incolla la tua soluzione su gist.github.com e pubblica una domanda SO quando hai finito, per far controllare il tuo lavoro ad altri?
Ken Williams

27

Una buona soluzione avrà diversi ingredienti, tra cui:

  • Utilizzare una finestra mobile resistente e liscia per rimuovere la non stazionarietà.

  • Riesprimere i dati originali in modo tale che i residui rispetto al liscio siano distribuiti approssimativamente simmetricamente. Data la natura dei tuoi dati, è probabile che le loro radici quadrate o logaritmi darebbero residui simmetrici.

  • Applicare i metodi della carta di controllo, o almeno il pensiero della carta di controllo, ai residui.

Per quanto riguarda l'ultimo, il pensiero della carta di controllo mostra che soglie "convenzionali" come 2 SD o 1,5 volte l'IQR oltre i quartili funzionano male perché attivano troppi falsi segnali fuori controllo. Le persone di solito usano 3 SD nel lavoro sulla carta di controllo, da cui 2,5 (o anche 3) volte l'IQR oltre i quartili sarebbe un buon punto di partenza.

Ho più o meno delineato la natura della soluzione di Rob Hyndman, aggiungendo al contempo due punti principali: la potenziale necessità di riesprimere i dati e la saggezza di essere più conservatori nel segnalare un valore anomalo. Non sono sicuro che Loess sia buono per un rilevatore online, perché non funziona bene agli endpoint. Potresti invece usare qualcosa di semplice come un filtro mediano mobile (come nel livellamento resistente di Tukey). Se i valori anomali non arrivano a raffica, puoi usare una finestra stretta (5 punti dati, forse, che si romperanno solo con una raffica di 3 o più valori anomali all'interno di un gruppo di 5).

Dopo aver eseguito l'analisi per determinare una buona reespressione dei dati, è improbabile che sia necessario modificare la reespressione. Pertanto, il tuo rilevatore online deve solo fare riferimento ai valori più recenti (la finestra più recente) perché non utilizzerà affatto i dati precedenti. Se si dispone di serie storiche molto lunghe, è possibile andare oltre per analizzare l'autocorrelazione e la stagionalità (come fluttuazioni giornaliere o settimanali ricorrenti) per migliorare la procedura.


3
Questa è una risposta straordinaria per l'analisi pratica. Non avrei mai pensato di provare 3 IQR oltre i quartili.
John Robertson,

3
@John, 1.5 IQR è la raccomandazione originale di Tukey per i baffi più lunghi su un diagramma a scatole e 3 IQR è la sua raccomandazione per contrassegnare i punti come "valori anomali" (un riff su una popolare frase degli anni '60). Questo è integrato in molti algoritmi boxplot. La raccomandazione viene analizzata teoricamente in Hoaglin, Mosteller e Tukey, Comprendendo l'analisi dei dati robusti ed esplorativi.
whuber

Ciò conferma i dati delle serie storiche che ho cercato di analizzare. Media della finestra e anche deviazioni standard della finestra. ((x - avg) / sd)> 3 sembrano essere i punti che voglio contrassegnare come valori anomali. Beh, almeno avverti come valori anomali, contrassegno qualsiasi valore superiore a 10 s come valori anomali di errore estremi. Il problema che incontro è qual è la lunghezza ideale della finestra? Sto giocando con qualsiasi cosa tra 4-8 punti dati.
Josh Peak,

1
@Neo La soluzione migliore potrebbe essere quella di sperimentare un sottoinsieme dei tuoi dati e confermare le tue conclusioni con test sul resto. Potresti condurre anche una convalida incrociata più formale (ma è necessaria un'attenzione speciale con i dati delle serie temporali a causa dell'interdipendenza di tutti i valori).
whuber

17

(Questa risposta ha risposto a una domanda duplicata (ora chiusa) in Rilevamento di eventi in sospeso , che ha presentato alcuni dati in forma grafica.)


Il rilevamento anomalo dipende dalla natura dei dati e da ciò che si è disposti ad assumere su di essi. I metodi per scopi generici si basano su statistiche affidabili. Lo spirito di questo approccio è quello di caratterizzare la maggior parte dei dati in un modo che non è influenzato da alcun outlier e quindi indicare eventuali valori individuali che non rientrano in quella caratterizzazione.

Poiché si tratta di una serie temporale, aggiunge la complicazione della necessità di (ri) rilevare valori anomali su base continuativa. Se questo deve essere fatto man mano che la serie si svolge, allora ci è permesso solo di utilizzare dati più vecchi per il rilevamento, non dati futuri! Inoltre, come protezione contro i numerosi test ripetuti, vorremmo utilizzare un metodo con un tasso di falsi positivi molto basso.

Queste considerazioni suggeriscono di eseguire un semplice e robusto test di valori anomali della finestra mobile sui dati . Ci sono molte possibilità, ma una semplice, facilmente comprensibile e facilmente implementabile si basa su una MAD in esecuzione: deviazione assoluta mediana dalla mediana. Questa è una misura fortemente robusta di variazione all'interno dei dati, simile a una deviazione standard. Un picco esterno sarebbe più MAD o maggiore della mediana.

Rx=(1,2,,n)n=1150y

# Parameters to tune to the circumstances:
window <- 30
threshold <- 5

# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z

# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)

Applicato a un set di dati come la curva rossa illustrata nella domanda, produce questo risultato:

Tracciare

I dati sono mostrati in rosso, la finestra di 30 giorni della soglia mediana + 5 * soglie in grigio in grigio e gli outlier - che sono semplicemente quei valori di dati sopra la curva grigia - in nero.

(La soglia può essere calcolata solo a partire dalla fine della finestra iniziale. Per tutti i dati all'interno di questa finestra iniziale, viene utilizzata la prima soglia: ecco perché la curva grigia è piatta tra x = 0 e x = 30.)

Gli effetti della modifica dei parametri sono: (a) aumentare il valore di windowtenderà a smussare la curva grigia e (b) aumentare thresholdaumenterà la curva grigia. Sapendo questo, si può prendere un segmento iniziale dei dati e identificare rapidamente i valori dei parametri che meglio separano i picchi periferici dal resto dei dati. Applicare questi valori di parametro per controllare il resto dei dati. Se un diagramma mostra che il metodo sta peggiorando nel tempo, ciò significa che la natura dei dati sta cambiando e che i parametri potrebbero richiedere una nuova ottimizzazione.

Notare quanto poco questo metodo presuppone sui dati: non devono essere normalmente distribuiti; non hanno bisogno di esibire alcuna periodicità; non devono nemmeno essere non negativi. Tutto ciò che assume è che i dati si comportino in modi ragionevolmente simili nel tempo e che i picchi periferici siano visibilmente più alti rispetto al resto dei dati.


Se qualcuno desidera sperimentare (o confrontare qualche altra soluzione con quella offerta qui), ecco il codice che ho usato per produrre dati come quelli mostrati nella domanda.

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline

Questa è una soluzione davvero interessante e apprezzo che posso implementarla senza usare R (solo usando JavaScript in un'applicazione web). Grazie!
hgoebl,

15

Se sei preoccupato per le ipotesi con un approccio particolare, un approccio è quello di formare un certo numero di studenti su segnali diversi, quindi utilizzare metodi ensemble e aggregare i "voti" dei tuoi studenti per fare la classificazione più anomala.

A proposito, potrebbe valere la pena leggere o scremare poiché fa riferimento ad alcuni approcci al problema.


5

Immagino che un sofisticato modello di serie storiche non funzionerà per te a causa del tempo necessario per rilevare i valori anomali utilizzando questa metodologia. Pertanto, ecco una soluzione alternativa:

  1. Innanzitutto stabilire un modello di traffico "normale" di base per un anno in base all'analisi manuale dei dati storici che tiene conto dell'ora del giorno, del giorno della settimana rispetto al fine settimana, del mese dell'anno ecc.

  2. Usa questa linea di base insieme ad alcuni semplici meccanismi (ad esempio, media mobile suggerita da Carlos) per rilevare valori anomali.

Potresti anche voler rivedere la letteratura sul controllo del processo statistico per alcune idee.


1
Sì, questo è esattamente quello che sto facendo: fino ad ora ho diviso manualmente il segnale in punti, in modo che per ciascuno di essi potessi definire un intervallo di confidenza entro il quale il segnale dovrebbe essere stazionario, e quindi posso usare metodi standard come come deviazione standard, ... Il vero problema è che non riesco a decidere il modello atteso per tutti i segnali che devo analizzare, ed è per questo che sto cercando qualcosa di più intelligente.
gianluca,

Ecco un'idea: Fase 1: implementare e stimare un modello di serie temporale generico su una base temporale sulla base di dati storici. Questo può essere fatto offline. Passaggio 2: utilizzare il modello risultante per rilevare valori anomali. Passaggio 3: a una certa frequenza (forse ogni mese?), Ricalibrare il modello delle serie temporali (questo può essere fatto offline) in modo che il rilevamento del passaggio 2 degli outlier non vada troppo al passo con gli attuali schemi di traffico. Funzionerebbe per il tuo contesto?

Sì, potrebbe funzionare. Stavo pensando a un approccio simile (ricalcolare la linea di base ogni settimana, che può richiedere molta CPU se si hanno centinaia di serie temporali univariate da analizzare). A proposito, la vera domanda difficile è "qual è il miglior algoritmo in stile blackbox per modellare un segnale completamente generico, considerando rumore, stima dell'andamento e stagionalità?". AFAIK, ogni approccio in letteratura richiede una fase di "regolazione dei parametri" davvero difficile, e l'unico metodo automatico che ho trovato è un modello ARIMA di Hyndman ( robjhyndman.com/software/forecast ). Mi sto perdendo qualcosa?
gianluca,

Tieni presente che non sono troppo pigro per indagare su questi parametri, il punto è che questi valori devono essere impostati in base al modello atteso del segnale e nel mio scenario non posso assumere alcuna ipotesi.
gianluca,

I modelli ARIMA sono modelli di serie storiche classici che possono essere utilizzati per adattarsi ai dati delle serie storiche. Ti incoraggio a esplorare l'applicazione dei modelli ARIMA. Potresti aspettare che Rob sia online e forse entrerà in contatto con alcune idee.

5

Regolare stagionalmente i dati in modo tale che una giornata normale appaia più piatta. Puoi prelevare il campione odierno delle 17:00 e sottrarre o dividere la media dei 30 giorni precedenti alle 17:00. Quindi guarda oltre N deviazioni standard (misurate utilizzando dati pre-regolati) per i valori anomali. Questo potrebbe essere fatto separatamente per "stagioni" settimanali e giornaliere.


Ancora una volta, funziona abbastanza bene se si suppone che il segnale abbia una stagionalità del genere, ma se uso una serie temporale completamente diversa (ovvero il tempo medio di andata e ritorno TCP nel tempo), questo metodo non funzionerà (poiché sarebbe meglio gestire quello con una media globale semplice e deviazione standard usando una finestra scorrevole contenente dati storici).
gianluca,

1
A meno che tu non sia disposto a implementare un modello generale di serie temporali (che porta i suoi contro in termini di latenza, ecc.) Sono pessimista sul fatto che troverai un'implementazione generale che allo stesso tempo è abbastanza semplice da funzionare per tutti i tipi di serie temporali.

Un altro commento: so che una buona risposta potrebbe essere "quindi potresti stimare la periodicità del segnale e decidere l'algoritmo da utilizzare in base ad esso", ma non ho trovato una soluzione davvero valida a questo altro problema (ho giocato a bit con analisi spettrale usando DFT e analisi del tempo usando la funzione di autocorrelazione, ma le mie serie temporali contengono molto rumore e tali metodi danno alcuni risultati folli in quel momento)
gianluca

Un commento al tuo ultimo commento: ecco perché sto cercando un approccio più generico, ma ho bisogno di una sorta di "scatola nera" perché non riesco a fare alcuna ipotesi sul segnale analizzato e quindi non riesco a creare il "miglior set di parametri per l'algoritmo di apprendimento".
gianluca,

@gianluca Come hai intuito, la struttura ARIMA sottostante può mascherare l'anomalia. Una formulazione errata della possibile causa di variabili come l'ora del giorno, il giorno della settimana, gli effetti festivi ecc. Può anche mascherare l'anomalia. La risposta è abbastanza chiara, è necessario disporre di una buona eqaution per rilevare efficacemente le anomalie. Per citare Bacon, "Perché chiunque conosca le vie della Natura noterà più facilmente le sue deviazioni e, d'altra parte, chiunque sappia le sue deviazioni descriverà più accuratamente le sue vie".
IrishStat,

3

Un'alternativa all'approccio delineato da Rob Hyndman sarebbe usare la previsione di Holt-Winters . Le bande di confidenza derivate da Holt-Winters possono essere utilizzate per rilevare valori anomali. Ecco un documento che descrive come utilizzare Holt-Winters per "Rilevamento del comportamento aberrante nelle serie temporali per il monitoraggio della rete". Un'implementazione per RRDTool è disponibile qui .


2

L'analisi spettrale rileva la periodicità in serie storiche stazionarie. L'approccio del dominio della frequenza basato sulla stima della densità spettrale è un approccio che consiglierei come primo passo.

Se per determinati periodi l'irregolarità significhi un picco molto più elevato di quello tipico per quel periodo, le serie con tali irregolarità non sarebbero stazionarie e un'analisi anulare spettrale non sarebbe appropriata. Ma supponendo di aver identificato il periodo che presenta le irregolarità, dovresti essere in grado di determinare approssimativamente quale sarebbe la normale altezza del picco e quindi puoi impostare una soglia a un livello superiore a tale media per designare i casi irregolari.


2
Potresti spiegare come questa soluzione rileverebbe "irregolarità locali"? Presentare un esempio funzionante sarebbe estremamente utile. (Ad essere sincero, ti sto suggerendo di fare questo perché nello svolgimento di un tale esercizio credo che scoprirai che il tuo suggerimento non è efficace per il rilevamento anomalo. Ma potrei sbagliarmi ...)
whuber

1
@whuber L'analisi spettrale identificherà solo dove si trovano tutti i picchi. Il prossimo passo sarebbe quello di adattare un modello di serie yime usando termini seno e coseno con le frequenze determinate dall'analisi spettrale e le ampiezze stimate dai dati. Se le irregolarità significano picchi con ampiezze molto elevate, penso che una soglia sull'ampiezza sarebbe appropriata. Se le irregolarità locali significano che per un periodo l'ampiezza a volte è significativamente più grande di altre, allora la serie non è stazionaria e l'analisi spettrale non sarebbe adeguata.
Michael Chernick,

1
Non seguo le conclusioni sulla mancanza di stazionarietà. Ad esempio, la somma di una forma d'onda sinusoidale regolare e un processo del punto di Poisson marcato sarebbero stazionari, ma non mostrerebbero la periodicità desiderata. Tuttavia, nel periodogramma si riscontrerebbero alcuni picchi forti, ma non si direbbe nulla di rilevante ai picchi di dati irregolari introdotti dal componente del processo di Poisson.
whuber

1
Una serie storica stazionaria ha una media costante. Se il picco per un componente periodico può cambiare nel tempo, può determinare il cambiamento nel tempo e quindi i seires sarebbero non stazionari.
Michael Chernick,

2

Dato che si tratta di dati di serie temporali, un semplice filtro esponenziale http://en.wikipedia.org/wiki/Exponential_s smoothing renderà più lisci i dati. È un ottimo filtro poiché non è necessario accumulare vecchi punti dati. Confronta ogni valore di dati appena livellato con il valore non livellato . Una volta che la deviazione supera una determinata soglia predefinita (a seconda di ciò che ritieni sia un valore anomalo nei tuoi dati), il valore anomalo può essere facilmente rilevato.

In CI eseguiremo le seguenti operazioni per un campione in tempo reale a 16 bit (credo che questo si trovi da qualche parte qui <Spiegazione - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-approssimation-to-a-moving-medium-filter >)

#define BITS2 2     //< This is roughly = log2( 1 / alpha ), depending on how smooth you want your data to be

short Simple_Exp_Filter(int new_sample) 
{static int filtered_sample = 0;
long local_sample = sample << 16; /*We assume it is a 16 bit sample */
filtered_sample += (local_sample - filtered_sample) >> BITS2;   
return (short) ((filtered_sample+0x8000) >> 16); //< Round by adding .5 and truncating.   
}


int main()
{
newly_arrived = function_receive_new_sample();
filtered_sample = Simple_Exp_Filter(newly_arrived);
if (abs(newly_arrived - filtered_sample)/newly_arrived > THRESHOLD)
    {
    //AN OUTLIER HAS BEEN FOUND
    }
 return 0;   
}

1

È possibile utilizzare la deviazione standard delle ultime N misurazioni (è necessario selezionare una N adatta). Un buon punteggio di anomalia sarebbe quante deviazioni standard una misurazione è dalla media mobile.


Grazie per la risposta, ma cosa succede se il segnale mostra un'alta stagionalità (ad esempio, molte misurazioni di rete sono caratterizzate da un modello giornaliero e settimanale allo stesso tempo, ad esempio notte vs giorno o fine settimana vs giorni lavorativi)? In tal caso, un approccio basato sulla deviazione standard non funzionerà.
gianluca,

Ad esempio, se ricevo un nuovo campione ogni 10 minuti e sto rilevando in modo anomalo l'utilizzo della larghezza di banda di rete di un'azienda, fondamentalmente alle 18:00 questa misura diminuirà (questo è uno schema totalmente normale previsto) e una deviazione standard calcolata su una finestra scorrevole non riuscirà (perché attiverà sicuramente un avviso). Allo stesso tempo, se la misura scende alle 16:00 (deviando dalla normale linea di base), questo è un vero valore anomalo.
gianluca,

1

quello che faccio è raggruppare le misurazioni per ora e giorno della settimana e confrontare le deviazioni standard di quello. Non è ancora corretto per cose come le vacanze e la stagionalità estate / inverno, ma è corretto per la maggior parte del tempo.

Il rovescio della medaglia è che è davvero necessario raccogliere circa un anno di dati per avere abbastanza in modo che stddev inizi a dare un senso.


Grazie, è esattamente quello che stavo cercando di evitare (avendo molti campioni come baseline), perché vorrei un approccio davvero reattivo (ad esempio il rilevamento online, forse "sporco", dopo 1-2 settimane di baseline)
gianluca

0

Suggerisco il seguente schema, che dovrebbe essere implementabile in circa un giorno:

Formazione

  • Raccogli tutti i campioni che puoi tenere in memoria
  • Rimuovi gli outlier ovvi usando la deviazione standard per ogni attributo
  • Calcola e memorizza la matrice di correlazione e anche la media di ciascun attributo
  • Calcola e memorizza le distanze Mahalanobis di tutti i tuoi campioni

Calcolo "esternalità":

Per il singolo campione di cui vuoi conoscere la sua "estraneità":

  • Recupera i mezzi, la matrice di covarianza e la distanza di Mahalanobis dall'allenamento
  • Calcola la distanza "d" di Mahalanobis per il tuo campione
  • Restituisce il percentile in cui cade la "d" (usando le distanze di Mahalanobis dall'allenamento)

Questo sarà il tuo punteggio anomalo: il 100% è un estremo estremo.


PS. Nel calcolare la distanza di Mahalanobis , utilizzare la matrice di correlazione, non la matrice di covarianza. Ciò è più efficace se le misure del campione variano in unità e numero.


0

Nel caso in cui si debbano calcolare rapidamente gli outlier, si potrebbe usare l'idea di Rob Hyndman e Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), function qsp) per calcolare gli outlier come segue:

library(spoutlier)
rapidtsoutliers <- function(x,plot=FALSE,seed=123)
{
    set.seed(seed)
    x <- as.numeric(x)
    tt <- 1:length(x)
    qspscore <- qsp(x)
    limit <- quantile(qspscore,prob=c(0.95))
    score <- pmax((qspscore - limit),0)
    if(plot)
    {
        plot(x,type="l")
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

0

il rilevamento delle anomalie richiede la costruzione di un'equazione che descriva le aspettative. Il rilevamento degli interventi è disponibile sia in un contesto non causale che causale. Se uno ha una serie di predittori come il prezzo, le cose possono diventare un po 'complicate. Altre risposte qui non sembrano prendere in considerazione la causa attribuibile attribuibile a serie predittive specificate dall'utente come il prezzo e quindi potrebbero essere imperfette. La quantità venduta può dipendere dal prezzo, forse dai prezzi precedenti e forse dalla quantità venduta in passato. La base per il rilevamento di anomalie (impulsi, impulsi stagionali, cambiamenti di livello e andamenti dell'ora locale) si trova in https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf


Il link non funziona, potresti risolvere il problema. Grazie
Pankaj Joshi il

fatto ..................
IrishStat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.