Quale rilevamento anomalo può rilevare questi valori anomali?


7

Ho un vettore e voglio rilevare valori anomali in esso.

La figura seguente mostra la distribuzione del vettore. I punti rossi sono anomali. I punti blu sono punti normali. Anche i punti gialli sono normali.

Ho bisogno di un metodo di rilevamento anomalo (un metodo non parametrico) in grado di rilevare solo punti rossi come valori anomali. Ho testato alcuni metodi come IQR, deviazione standard ma rilevano anche i punti gialli come valori anomali.

So che è difficile rilevare solo il punto rosso, ma penso che ci dovrebbe essere un modo (anche una combinazione di metodi) per risolvere questo problema.

inserisci qui la descrizione dell'immagine

I punti sono letture di un sensore per un giorno. Ma i valori del sensore cambiano a causa della riconfigurazione del sistema (l'ambiente non è statico). I tempi delle riconfigurazioni sono sconosciuti. I punti blu sono per il periodo precedente alla riconfigurazione. I punti gialli sono indicati dopo la riconfigurazione che causa deviazioni nella distribuzione delle letture (ma sono normali). I punti rossi sono il risultato della modifica illegale dei punti gialli. In altre parole, sono anomalie che dovrebbero essere rilevate.

Mi chiedo se la stima della funzione di smoothing del kernel ('pdf', 'survivor', 'cdf', ecc.) Possa aiutare o no. Qualcuno potrebbe aiutare a conoscere le loro principali funzionalità (o altri metodi di smoothing) e la giustificazione da utilizzare in un contesto per risolvere un problema?


3
Cosa rende questi valori anomali e non quelli gialli? Hai esempi di valori anomali o hai appena ottenuto un set? Sembra simile a questo? Quante dimensioni?
Jan van der Vegt,

Grazie. I punti sono letture di un sensore per un giorno. Ma i valori del sensore cambiano a causa delle riconfigurazioni del sistema (l'ambiente non è statico). I punti blu sono per il periodo precedente alla riconfigurazione. I punti gialli sono per dopo la riconfigurazione che causa deviazioni nella distribuzione delle letture (ma sono normali). I punti rossi sono il risultato di punti gialli di modifica illegali. È una dimensione.
Arkan,

1
Con quale frequenza si verificano queste riconfigurazioni? Questi punti rossi accadono sempre? È possibile esaminare alcuni metodi di livellamento delle serie temporali.
Jan van der Vegt,

È dinamico e nulla è definito. No. I punti rossi sono anomalie create da modifiche illegali e non si verificano sempre. Ti chiedo di nominare alcuni metodi noti (metodi di smoothing)? Qual è la loro funzionalità principale?
Arkan,

Quando cerchi spostamenti di livello puoi trovare cambiamenti nell'intercetta. Pubblica i tuoi dati Vedi l'articolo di Balke Rilevamento dei cambiamenti di livello nelle serie temporali Nathan S. Balke Journal of Business & Economic Statistics Vol. 11, n. 1 (gennaio 1993), pagg. 81-92
Tom Reilly,

Risposte:


3

È possibile visualizzare i dati come una serie temporale in cui una misurazione ordinaria produce un valore molto vicino al valore precedente e una ricalibrazione produce un valore con una grande differenza rispetto al predecessore.

Qui sono dati di esempio simulati basati sulla distribuzione normale con tre diversi mezzi simili al tuo esempio. inserisci qui la descrizione dell'immagine

Calcolando la differenza con il valore precedente (una sorta di derivazione) si ottengono i seguenti dati:

inserisci qui la descrizione dell'immagine

La mia interpretazione della tua descrizione è che tolleri la ricalibrazione (cioè punti su una distanza maggiore da zero, rosso nel diagramma), ma devono scambiare tra valori positivi e negativi (cioè corrispondenti a passare dallo stato blu a quello giallo e indietro).

Ciò significa che è possibile impostare un allarme che vede un secondo punto rosso sul lato negativo o positivo .


Apprezzo molto la tua risposta. Sì, possiamo dire che è come una ricalibrazione e questa è una buona analogia. Il tuo approccio è buono. L'ho provato. Il risultato è esattamente come quello che hai disegnato. Il primo punto rosso è il primo punto di punti gialli. Il secondo punto è il primo punto dei punti rossi. Il terzo punto rosso è l'ultimo punto dei punti rossi. Pertanto, è difficile scoprire la conoscenza da questi dati. Questo perché non abbiamo potuto discutere i punti rossi dopo il primo punto rosso. Potrebbe essere necessario visualizzare i dati primari per concludere, ma si tratta di un intervento umano.
Arkan,

@Marmite Bomber Sarebbe bello se condividi lo snippet di codici per catturare l'idea dal punto di vista della programmazione.
Mario,

@Mario buona idea - fammi vedere se riesco a trovarlo dopo più di due anni;)
Marmite Bomber

@Mario vedi la mia altra risposta;)
Marmite Bomber

@MarmiteBomber grazie per il feedback ma amico ero interessato al codice Python!
Mario,

0

Se si utilizza la registrazione, è possibile utilizzare una media corrente che si reimposta se la configurazione cambia. Tuttavia, questo avrà il punto debole di cui hai bisogno almeno alcuni dati prima di poter rilevare un tale valore anomalo.

I tuoi dati sembrano piuttosto "belli" (non troppo rumore). Consiglierei di prendere la media degli ultimi 10-20 punti nella stessa configurazione. Se questi valori sono una sorta di quantità conteggiata, è possibile rilevare un errore di errore per singoli punti dati e calcolare l'errore in media.

Quanti dati storici hai? Se ne hai molti, puoi usarlo per ottimizzare la frequenza degli allarmi in modo tale da ottenere un rapporto accettabile di tutti i valori anomali reali e ottenere un numero minimo di falsi avvisi. Ciò che è accettabile dipende dal problema specifico. (Costo di falsi positivi o valori anomali non rilevati e loro abbondanza).


Grazie. Sfortunatamente, le riconfigurazioni sono diverse e questo non ci consente di sintonizzare una frequenza di allarme. Puoi spiegarci un po 'di più sulla media dei punti recenti?
Arkan,

Sono convinto che questi punti dati siano in ordine cronologico, corretto? Quindi è possibile per ogni punto utilizzare le informazioni sull'asse y (dati nel diagramma) degli ultimi XX punti. Diciamo 10, ma questo ovviamente dipende un po 'dall'aspetto dei tuoi dati. Per questi 10 punti si calcola quindi la media o meglio se si dispone di una stima dell'errore sulle singole misurazioni dell'errore ponderato.
El Burro,

È ancora possibile regolare la frequenza di allarme perché non si definisce un allarme come una deviazione da un valore fisso maggiore di X ma come la deviazione da una media mobile.
El Burro,

Thanks.Yes. Sono in ordine cronologico. Mi chiedo se la stima della funzione di smoothing del kernel sia di aiuto o meno.
Arkan,

Vorrei suggerire di iniziare con una semplice media mobile che si reimposta per ogni modifica della configurazione e vedere se fa il lavoro. Se non si dispone delle informazioni disponibili quando si verifica una modifica della configurazione in base al modo in cui ciò appare a prima vista, non vedo altre opzioni affidabili per separare il giallo dal rosso. Almeno nell'esempio dato non sembra che la forma sia molto diversa tra i due.
El Burro,

0

Illustriamo l'approccio proposto nell'altra risposta con un semplice esempio

Ottieni dati

Simuleremo i dati con sette blocchi prodotti con distribuzione normale con mezzi diversi.

Questo è importante in quanto ci consente di distinguere chiaramente tra i gruppi e di rilevare semplicemente i punti di rottura. Questa risposta usa un approccio soglia elementare, potrebbe essere necessario un modo più avanzato per i tuoi dati reali.

dt <- rbind(
data.frame(color=1, x =  round(runif(50, min = 0, max = 50)), y = rnorm (50,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 50, max = 65)), y = rnorm (15,mean=4.5, sd=.03)),
data.frame(color=2, x =  round(runif(15, min = 65, max = 80)), y = rnorm (15,mean=3.3, sd=.03)),
data.frame(color=1, x =  round(runif(70, min = 80, max = 150)), y = rnorm (70,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 150, max = 165)), y = rnorm (15,mean=3.3, sd=.03)), 
data.frame(color=3, x =  round(runif(15, min = 165, max = 180)), y = rnorm (15,mean=2.9, sd=.03)), 
data.frame(color=1, x =  round(runif(120, min = 180, max = 300)), y = rnorm (120,mean=3.9, sd=.03))
)
dt$color <- as.factor(dt$color)
dt <- as_tibble(dt)

inserisci qui la descrizione dell'immagine

Deriva i punti di rottura

Con una semplice differenza rispetto al punto precedente lag(y) otteniamo i valori anomali. Sono classificati mediante una soglia.

inserisci qui la descrizione dell'immagine

Classificazione del cambiamento di comportamento

Sulla base delle regole che hai descritto, i punti di rottura sono classificati come OKe problem.

La regola afferma che non sono consentiti due cambiamenti nella stessa direzione. La seconda mossa nella direzione precedente è considerata un problema.

Potrebbe essere necessario modificare questa semplice interpretazione se il logik è più avanzato.

## extract outliers and get previous value
dt2 <- filter(dt2, diff != 0) %>%
   mutate(cs = cumsum(diff),
          prev = lag(diff),
          cls = case_when(
                      diff * prev >  0 ~ "problem",
                      TRUE ~ "OK"))
## show 
dt2 %>% select(x,y,diff,prev,cls)                       
## # A tibble: 6 x 5
##       x     y  diff  prev cls    
##   <dbl> <dbl> <dbl> <dbl> <chr>  
## 1    50  4.53     1    NA OK     
## 2    66  3.32    -1     1 OK     
## 3    80  3.87     1    -1 OK     
## 4   151  3.32    -1     1 OK     
## 5   167  2.91    -1    -1 problem
## 6   180  3.87     1    -1 OK

Presentazione

Alla fine proietti i valori anomali riconosciuti sui dati originali

## project in the original data
ggplot(data=dt, mapping = aes(x=x, y=y) )  +
  geom_point(mapping = aes(color = color) )  +
  scale_color_manual(values=c("blue", "yellow", "red","green","red")) +
  theme(legend.position="none") +
  geom_vline(data=dt2, aes(xintercept=x, color=cls),
             linetype="dashed", size = 2)

inserisci qui la descrizione dell'immagine

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.