Fråga:
Enkel algoritm för online-outlier-detektering av en generisk tidsserie
gianluca
2010-08-03 01:37:28 UTC
view on stackexchange narkive permalink

Jag arbetar med en stor mängd tidsserier. Dessa tidsserier är i grunden nätverksmätningar som kommer var 10: e minut, och en del av dem är periodiska (dvs. bandbredd), medan andra inte är det (dvs. mängden routingtrafik).

Jag vill ha en enkel algoritm för att göra en online "outlier detection". I grund och botten vill jag hålla i minnet (eller på disken) hela historiska data för varje tidsserie, och jag vill upptäcka eventuella outlier i ett live-scenario (varje gång ett nytt prov tas). Vad är det bästa sättet att uppnå dessa resultat?

Jag använder för närvarande ett glidande medelvärde för att ta bort lite buller, men vad händer nu? Enkla saker som standardavvikelse, galna, ... mot hela datamängden fungerar inte bra (jag kan inte anta att tidsserierna är stillastående), och jag skulle vilja ha något mer "exakt", helst en svart ruta som:

dubbel outlier_detection (dubbel * vektor, dubbelt värde);

där vektorn är den grupp av dubbel som innehåller historiska data, och returvärdet är anomalipoängen för det nya provet " värde ".

Bara för tydlighetens skull, här är den ursprungliga frågan på SO: http://stackoverflow.com/questions/3390458/simple-algorithm-for-online-outlier-detection-of-a-generic-time-series
Jag tycker att vi bör uppmuntra affischer att lägga upp länkar som en del av frågan om de har lagt upp samma fråga på en annan SE-webbplats.
ja, du har helt rätt. Nästa gång ska jag nämna att meddelandet är tvärpost.
Jag föreslår också att du tittar på de andra relaterade länkarna till höger på sidan. Det här är en populär fråga och den har kommit upp i en rad olika frågor tidigare. Om de inte är tillfredsställande är det bäst att uppdatera din fråga om detaljerna i din situation.
Bra fångst, @Andy! Låt oss slå samman den här frågan med den andra.
2cts ingång.När jag arbetade på samma typ av modeller kom jag fram till att internettrafiken "bara kan hända", volymförändringar är vanliga och kan ske utan att det krävs åtgärder.Härledda frågor som ökar andelen låsta konton, kan det geografiska ursprunget för trafikförändringen vara mer intressant och eller stabilt.
Fjorton svar:
Rob Hyndman
2010-08-03 05:54:56 UTC
view on stackexchange narkive permalink

Här är en enkel R-funktion som hittar tidsserier som avviker (och eventuellt visar dem i ett diagram). Den hanterar säsongsbetonade och icke-säsongsbetonade tidsserier. Grundidén är att hitta robusta uppskattningar av trenden och säsongskomponenter och subtrahera dem. Ta sedan reda på avvikelser i resterna. Testet för återstående avvikelser är detsamma som för standardboxplot - poäng större än 1,5IQR över eller under övre och nedre kvartiler antas vara outliers. Antalet IQR över / under dessa tröskelvärden returneras som en outlier "poäng". Så poängen kan vara vilket som helst positivt tal och kommer att vara noll för icke-outliers.

Jag inser att du inte implementerar detta i R, men jag tycker ofta att en R-funktion är ett bra ställe att börja. Då är uppgiften att översätta detta till vilket språk som helst.

  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: längd (x) rest <- rest (loess (x ~ tt ))} rest.q <- kvantil (rest, prob = c (0,25,0,75)) iqr <- diff (rest.q) begränsar <- rest.q + 1,5 * iqr * c (-1,1) poäng < - abs (pmin ((restgränser [1]) / iqr, 0) + pmax ((restgränser [2]) / iqr, 0)) om (plot) {plot (x) x2 <- ts (rep (NA, längd (x))) x2 [score>0] <- x [score>0] tsk (x2) <- tsp (x) poäng (x2, pch = 19, col = "röd") avkastning (osynlig (poäng)) } annars returnera (poäng)}  
+1 från mig, utmärkt. Så> 1,5 X interkvartilintervall är konsensusdefinitionen av en outlier för tidsberoende serier? Det skulle vara trevligt att ha en skaloberoende referens.
Outlier-testet är på resterna, så förhoppningsvis är tidsberoende liten. Jag vet inte om enighet, men boxplots används ofta för upptäckt av outlier och verkar fungera ganska bra. Det finns bättre metoder om någon ville göra funktionen lite snyggare.
Riktigt tack för din hjälp, jag uppskattar verkligen. Jag är ganska upptagen på jobbet nu, men jag kommer att testa ett tillvägagångssätt som ditt så snart som möjligt, och jag kommer tillbaka med mina sista överväganden om denna fråga. En enda tanke: i din funktion, utifrån vad jag ser, måste jag manuellt specificera frekvensen för tidsserien (när du konstruerar den), och säsongskomponenten beaktas endast när frekvensen är större än 1. Finns det ett robust sätt att hantera detta automatiskt?
Ja, jag antar att frekvensen är känd och specificerad. Det finns metoder för att uppskatta frekvensen automatiskt, men det skulle komplicera funktionen avsevärt. Om du behöver uppskatta frekvensen, försök att ställa en separat fråga om den - så kommer jag antagligen att ge ett svar! Men det behöver mer utrymme än jag har tillgängligt i en kommentar.
Jag hade äntligen tid att leka lite med den här metoden, och detta verkar vara en bra kompromiss (även om jag fortfarande måste utvärdera hur komplex är stl () -rutinen ur ett minne / cpu-synvinkel), vilket fungerar ganska bra om vi kände till tidsseriens frekvens. BTW, jag märkte att resultaten av detekteringen starkt beror på vilken typ av signal jag analyserar, och för att uppnå de bästa resultaten måste jag manuellt ställa in sannolikheterna för kvantilerna eller multiplikatorn för IQR. Eftersom du ' är du expert på detta ämne, finns det en "smart" och "de facto" lösning för att hantera denna fråga?
Finns det en chans att någon kan skriva om detta i Matlab? Jag 'talar' inte R, men det här verkar mycket användbart.
@Marcin, Jag rekommenderar att du tar ett tag på det själv. Klistra kanske in din lösning på gist.github.com och skicka en SO-fråga när du är klar för att andra ska kontrollera ditt arbete?
Jag har just lagt upp en uppföljningsfråga till @RobHyndman's-svar här: [Enkel algoritm för online-outlier-detektering av en generisk tidsserie II: Daglig cykel inom årlig] (http://stats.stackexchange.com/questions/151840/simple-algorithm-för-online-outlier-upptäckt-av-en-generisk-tidsserie-ii-dagligen)
whuber
2010-08-26 23:02:44 UTC
view on stackexchange narkive permalink

En bra lösning kommer att ha flera ingredienser, inklusive:

  • Använd ett resistent, rörligt fönster som är smidigt för att avlägsna icke-stationäritet.

  • Återuttryck originaldata så att resterna i förhållande till det släta fördelas ungefär symmetriskt. Med tanke på din datas karaktär är det troligt att deras kvadratrötter eller logaritmer skulle ge symmetriska rester.

  • Tillämpa kontrolldiagrammetoder, eller åtminstone kontrolltänkande, på restprodukterna.

När det gäller den sista visar kontrolltänkande att "konventionella" trösklar som 2 SD eller 1,5 gånger IQR utöver kvartilerna fungerar dåligt eftersom de utlöser för många falska out-of-control signaler. Människor använder vanligtvis 3 SD i kontrolldiagramarbete, varifrån 2,5 (eller till och med 3) gånger IQR bortom kvartilerna skulle vara en bra utgångspunkt.

Jag har mer eller mindre beskrivit karaktären av Rob Hyndmans lösning medan lägga till två viktiga punkter: det potentiella behovet av att återuttrycka uppgifterna och visdomen att vara mer konservativ när det gäller att signalera en outlier. Jag är dock inte säker på att Loess är bra för en online-detektor, för det fungerar inte bra i slutpunkterna. Du kan istället använda något så enkelt som ett rörligt medianfilter (som i Tukeys resistenta utjämning). Om outliers inte kommer i skurar kan du använda ett smalt fönster (kanske 5 datapunkter, som bara kommer att brytas ned med en burst på 3 eller fler outliers inom en grupp av 5).

En gång du har utfört analysen för att bestämma ett bra återuttryck av data, det är osannolikt att du behöver ändra återuttrycket. Därför behöver din online-detektor egentligen bara hänvisa till de senaste värdena (det senaste fönstret) eftersom den inte kommer att använda tidigare data alls. Om du har riktigt långa tidsserier kan du gå längre för att analysera autokorrelation och säsongsspänning (som återkommande dagliga eller veckovisa fluktuationer) för att förbättra proceduren.

Detta är ett extraordinärt svar för praktisk analys. Aldrig skulle ha trott att behöva prova 3 IQR bortom kvartilerna.
@John, 1.5 IQR är Tukeys ursprungliga rekommendation för de längsta morrhåren på en boxplot och 3 IQR är hans rekommendation för att markera poäng som "långt outliers" (en riff på en populär 60-talsfras). Detta är inbyggt i många boxplot-algoritmer. Rekommendationen analyseras teoretiskt i Hoaglin, Mosteller och Tukey, * Förstå Robust och Exploratory Data Analysis. *
Detta bekräftar tidsseriedata som jag har försökt analysera.Fönstermedelvärde och även fönster standardavvikelser.((x - avg) / sd)> 3 verkar vara de punkter som jag vill flagga som avvikare.Varna åtminstone som avvikare, jag flaggar något högre än 10 sd som extrema felavvikare.Problemet jag stöter på är vad som är en idealisk fönsterlängd?Jag spelar med allt mellan 4-8 datapunkter.
@Neo Din bästa insats kan vara att experimentera med en delmängd av dina data och bekräfta dina slutsatser med tester på resten.Du kan också göra en mer formell korsvalidering (men särskild försiktighet behövs med tidsseriedata på grund av ömsesidigt beroende av alla värden).
whuber
2012-09-03 20:57:53 UTC
view on stackexchange narkive permalink

(Detta svar svarade på en duplikatfråga (nu stängd) vid Upptäcka utestående händelser, som presenterade en del data i grafisk form.)


Outlier upptäckt beror på vilken typ av data och på vad du är villig att anta om dem. Allmänna metoder är beroende av robust statistik. Andan i detta tillvägagångssätt är att karakterisera huvuddelen av uppgifterna på ett sätt som inte påverkas av några avvikare och sedan peka på individuella värden som inte passar inom den karakteriseringen. serien kompletterar komplikationen med att behöva (åter) upptäcka avvikare kontinuerligt. Om detta ska göras när serien utvecklas får vi bara använda äldre data för detektering, inte framtida data! Dessutom, som skydd mot de många upprepade testerna, skulle vi vilja använda en metod som har en mycket låg falsk positiv frekvens. data . Det finns många möjligheter, men en enkel, lättförståelig och lätt implementerad baseras på en löpande MAD: median absolut avvikelse från medianen. Detta är ett starkt robust mått på variation inom data, liknande en standardavvikelse. En avlägsen topp skulle vara flera MAD eller mer än medianen.

Det finns fortfarande en viss inställning att göra : hur mycket avvikelse från huvuddelen av uppgifterna bör betraktas som yttre och hur långt tillbaka i tiden ska man se? Låt oss lämna dessa som parametrar för experiment. Här är en implementering av R som tillämpas på data $ x = (1,2, \ ldots, n) $ (med $ n = 1150 $ för att emulera data) med motsvarande värden $ y $:

  # Parametrar för att ställa in omständigheterna: fönster <- 30 tröskel <- 5 # En övre tröskel ("ut") beräkning baserad på MAD: bibliotek (zoo) # rollapply ()
ut <- funktion (x) {m = median (x); median (x) + tröskel * median (abs (x - m))} z <- rollapply (zoo (y), window, ut, align = "right") z <- c (rep (z [1], window -1), z) # Använd z [1] under den inledande periodutjämnaren <- y > z # Grafera data, visa ut () cutoffs och markera outliers: plot (x, y, type = "l", lwd = 2, col = "# E00000", ylim = c (0, 20000)) rader (x, z, col = "Grå") punkter (x [outliers], y [outliers], pch = 19)  kod> 

Tillämpad på en datauppsättning som den röda kurvan som illustreras i frågan, ger det resultatet:

Plot

Data visas i rött , 30-dagarsfönstret för median + 5 * MAD-trösklar i grått och avvikelserna - som helt enkelt är datavärdena över den grå kurvan - i svart.

(Tröskeln kan bara beräknas börjar vid slutet i det ursprungliga fönstret. För alla data i detta initiala fönster används den första tröskeln: det är därför den grå kurvan är platt mellan x = 0 och x = 30.)

Effekterna av att ändra parametrar är (a) incr lättare värdet för -fönstret tenderar att jämna ut den grå kurvan och (b) en ökning av -tröskeln höjer den grå kurvan. Att veta detta kan man ta ett första segment av data och snabbt identifiera värden på de parametrar som bäst skiljer de yttre topparna från resten av data. Använd dessa parametervärden för att kontrollera resten av data. Om ett diagram visar att metoden försämras med tiden, betyder det att dataens natur förändras och parametrarna kan behöva justeras om igen.

Lägg märke till hur lite denna metod förutsätter om data: de behöver inte distribueras normalt; de behöver inte uppvisa någon periodicitet; de behöver inte ens vara icke-negativa. Allt det antas är att uppgifterna beter sig på ett relativt likartat sätt över tiden och att de avlägsna topparna är synligt högre än resten av informationen.


Om någon vill experimentera (eller jämföra någon annan lösning med den som erbjuds här), här är koden jag använde för att producera data som de som visas i frågan.

  n. längd <- 1150cycle.a <- 11cycle.b <- 365/12 amp.a <- 800amp.b <- 8000set.seed (17) x <- 1: n.längdbaslinje <- (1/2) * amp.a * (1 + sin (x * 2 * pi / cykel.a)) * rgamma (n.längd, 40, skala = 1/40) toppar <- rbinom (n.längd, 1, exp (2 * (- 1) + sin ((((1 + x / 2) ^ (1/5) / (1 + n.längd / 2) ^ (1/5)) * x * 2 * pi / cykel.b)) * cykel.b )) y <- toppar * rgamma (n.längd, 20, skala = amp.b / 20) + baslinje  
Detta är en riktigt intressant lösning och jag uppskattar att jag kan implementera den utan att använda R (bara använda vanlig JavaScript i en webbapplikation).Tack!
Jag tror att en (något modifierad) metod som använder MAD också är känd under termen "Hampel-identifierare".
ars
2010-08-03 05:56:33 UTC
view on stackexchange narkive permalink

Om du är orolig för antaganden med ett visst tillvägagångssätt, är ett tillvägagångssätt att utbilda ett antal elever i olika signaler och sedan använda ensemblemetoder och aggregera över "rösterna" från dina elever till gör outlier-klassificeringen.

BTW, det kan vara värt att läsa eller skumma eftersom det hänvisar till några tillvägagångssätt till problemet.

user28
2010-08-03 02:23:38 UTC
view on stackexchange narkive permalink

Jag antar att sofistikerad tidsseriemodell inte fungerar för dig på grund av den tid det tar att upptäcka avvikare med den här metoden. Därför är här en lösning:

  1. Upprätta först en baslinje "normala" trafikmönster under ett år baserat på manuell analys av historiska data som står för tid på dagen, vardag och helg , årets månad etc.

  2. Använd denna baslinje tillsammans med någon enkel mekanism (t.ex. glidande medel som Carlos föreslog) för att upptäcka avvikare.

Du kanske också vill granska den statistiska litteraturen för processkontroll för några idéer.

Ja, det här är precis vad jag gör: tills nu delar jag signalen manuellt i perioder, så att för var och en av dem kan jag definiera ett konfidensintervall inom vilket signalen ska vara stationär, och därför kan jag använda standardmetoder som som standardavvikelse, ... Det verkliga problemet är att jag inte kan bestämma det förväntade mönstret för alla signaler jag måste analysera, och det är därför jag letar efter något mer intelligent.
Här är en idé: Steg 1: Implementera och uppskatta en generisk tidsseriemodell en gång baserat på historiska data. Detta kan göras offline. Steg 2: Använd den resulterande modellen för att upptäcka avvikare. Steg 3: Vid en viss frekvens (kanske varje månad?), Kalibrera tidsseriemodellen på nytt (detta kan göras offline) så att din steg 2-upptäckt av outliers inte går för mycket ur takt med nuvarande trafikmönster. Skulle det fungera för ditt sammanhang?
Ja, det här kanske fungerar. Jag tänkte på ett liknande tillvägagångssätt (att beräkna baslinjen varje vecka, vilket kan vara CPU-intensivt om du har hundratals univariata tidsserier att analysera). BTW den verkliga svåra frågan är "vad är den bästa blackbox-stil-algoritmen för att modellera en helt generisk signal, med tanke på buller, trenduppskattning och säsongssäkerhet? ". AFAIK, varje tillvägagångssätt i litteraturen kräver en riktigt hård" parameterinställningsfas, och den enda automatiska metoden jag hittade är en ARIMA-modell av Hyndman (http: // robjhyndman. com / programvara / prognos /). Har jag missat något?
Kom ihåg att jag inte är för lat för att undersöka dessa parametrar, poängen är att dessa värden måste ställas in enligt signalens förväntade mönster, och i mitt scenario kan jag inte göra något antagande.
ARIMA-modeller är klassiska tidsseriemodeller som kan användas för att passa tidsseriedata. Jag uppmuntrar dig att utforska tillämpningen av ARIMA-modeller. Du kan vänta på att Rob är online och kanske kommer han att chima med några idéer.
James Roth
2010-08-03 02:50:27 UTC
view on stackexchange narkive permalink

Justera data säsongsmässigt så att en vanlig dag ser närmare platt ut. Du kan ta dagens 17:00-prov och subtrahera eller dela ut genomsnittet för de senaste 30 dagarna kl. 17.00. Titta sedan förbi N-standardavvikelser (mätt med förjusterade data) för avvikare. Detta kan göras separat för "säsonger" varje vecka och dagligen.

Återigen, det här fungerar ganska bra om signalen ska ha en säsongsspecialitet så, men om jag använder en helt annan tidsserie (dvs. den genomsnittliga TCP-tur och retur-tiden över tiden) kommer den här metoden inte att fungera (eftersom det skulle vara bättre att hantera den med ett enkelt globalt medelvärde och standardavvikelse med hjälp av ett skjutfönster som innehåller historiska data).
Om du inte är villig att implementera en allmän tidsseriemodell (som ger sina nackdelar när det gäller latens etc) är jag pessimistisk att du kommer att hitta en allmän implementering som samtidigt är enkel att arbeta för alla slags tidsserier.
En annan kommentar: Jag vet att ett bra svar kan vara "så du kan uppskatta signalens periodicitet och bestämma algoritmen att använda enligt den", men jag hittade inte en riktigt bra lösning på detta andra problem (jag spelade en lite med spektralanalys med DFT och tidsanalys med hjälp av autokorrelationsfunktionen, men mina tidsserier innehåller mycket buller och sådana metoder ger några galna resultat för det mesta)
En kommentar till din sista kommentar: det är därför jag letar efter ett mer generiskt tillvägagångssätt, men jag behöver ett slags "svart låda" för att jag inte kan göra något antagande om den analyserade signalen, och därför kan jag inte skapa "bästa parameteruppsättningen för inlärningsalgoritmen".
@gianluca Som du antydde kan den underliggande ARIMA-strukturen maskera anomalin. Felaktig formulering pf möjliga orsaksvariabler som timme på dagen, veckodagen, semestereffekter etc kan också maskera avvikelsen. Svaret är ganska tydligt att du måste ha en bra åtgärd för att effektivt upptäcka avvikelser. För att citera Bacon, "För den som känner till naturens vägar kommer lättare att märka hennes avvikelser, och å andra sidan, den som känner till hennes avvikelser kommer mer exakt att beskriva hennes sätt."
Peter Prettenhofer
2012-02-16 19:36:14 UTC
view on stackexchange narkive permalink

Ett alternativ till den metod som Rob Hyndman skisserat skulle vara att använda Holt-Winters Forecasting. Konfidensbanden som härrör från Holt-Winters kan användas för att upptäcka avvikare. Här är en uppsats som beskriver hur man använder Holt-Winters för "Aberrant Behavior Detection in Time Series for Network Monitoring". En implementering för RRDTool finns här.

Michael R. Chernick
2012-09-03 19:59:12 UTC
view on stackexchange narkive permalink

Spektralanalys detekterar periodicitet i stationära tidsserier. Frekvensdomänmetoden baserad på spektral densitetsuppskattning är ett tillvägagångssätt som jag skulle rekommendera som ditt första steg.

Om oregelbundenhet under vissa perioder betyder en mycket högre topp än vad som är typiskt för den perioden skulle serien med sådana oegentligheter inte vara stationär och spektral anlsys skulle inte vara lämpligt. Men förutsatt att du har identifierat den period som har oegentligheterna, bör du kunna bestämma ungefär vad den normala topphöjden skulle vara och sedan ställa in en tröskel på någon nivå över genomsnittet för att beteckna de oregelbundna fallen.

Kan du förklara hur den här lösningen skulle upptäcka "lokala oegentligheter"? Att presentera ett fungerat exempel skulle vara mycket användbart. (För att vara ärlig föreslår jag att du gör det här för att jag genom att utföra en sådan övning tror att du kommer att upptäcka att ditt förslag inte är effektivt för upptäckt av outlier. Men jag kan ha fel ...)
@whuber Spektralanalysen kommer bara att identifiera var alla topparna är. Nästa steg skulle vara att passa en yime-seriemodell med sinus- och cosinustermer med de frekvenser som bestäms av spektralanalysen och amplituden uppskattad från data. Om oegentligheter betyder toppar med mycket höga amplituder, tror jag att en tröskel på amplituden skulle vara lämplig. Om lokala oegentligheter innebär att amplituden ibland är betydligt större än andra är serien inte stationär och spektralanalys skulle inte vara uppenbart.
Jag följer inte slutsatsen om brist på stationäritet. Till exempel skulle summan av en vanlig sinusformad vågform och en markerad Poisson-punktprocess vara stationär, men den skulle inte uppvisa någon av den periodicitet du söker. Du skulle ändå hitta några starka toppar i periodogrammet, men de skulle inte berätta något som är relevant för de oregelbundna datatopparna som introducerades av Poisson-processkomponenten.
En stationär tidsserie har ett konstant medelvärde. Om toppen för en periodisk komponent kan förändras över tiden kan den leda till att medelvärdet ändras över tiden och följaktligen skulle seires vara icke-stationära.
AyodeleO
2015-04-30 13:50:53 UTC
view on stackexchange narkive permalink

Eftersom det är tidsseriedata kommer ett enkelt exponentiellt filter http://en.wikipedia.org/wiki/Exponential_smoothing att jämna ut data. Det är ett mycket bra filter eftersom du inte behöver samla gamla datapunkter. Jämför varje ny utjämnat datavärde med dess osmoothed -värde. När avvikelsen överstiger ett visst fördefinierat tröskelvärde (beroende på vad du tror att en outlier i dina data är), kan din outlier lätt detekteras.

I CI kommer du att göra följande för en realtids 16-bitars prov (jag tror att detta finns någonstans här < Förklaring - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order-iir-approximation-to-a-moving -genomsnitt-filter>)

  #define BITS2 2 // < Detta är ungefär = log2 (1 / alfa), beroende på hur smidig du vill att dina data ska kortas om Simple_Exp_Filter ( int new_sample) {static int filtered_sample = 0; long local_sample = sample << 16; / * Vi antar att det är ett 16-bitars exempel * / filtered_sample + = (local_sample - filtered_sample) >> BITS2; retur (kort) ((filtered_sample + 0x8000) >> 16); // < Round genom att lägga till .5 och trunka. } int main () {newly_arrived = function_receive_new_sample (); filtered_sample = Simple_Exp_Filter (nylig_ankomna); if (abs (nyligen_ankomna - filtrerade_prov) / nyligen ankomna > THRESHOLD) {// EN OUTLIER HAR FUNNAT} }  
Carlos Accioly
2010-08-03 01:48:01 UTC
view on stackexchange narkive permalink

Du kan använda standardavvikelsen för de senaste N-mätningarna (du måste välja en lämplig N). En bra anomalipoäng skulle vara hur många standardavvikelser en mätning är från det rörliga genomsnittet.

Tack för ditt svar, men tänk om signalen uppvisar en hög säsongsspänning (dvs. många nätverksmätningar kännetecknas av ett dagligt och veckoviktigt mönster på samma gång, till exempel natt vs dag eller helg vs arbetsdagar)? En metod baserad på standardavvikelse fungerar inte i så fall.
Till exempel, om jag får ett nytt prov var 10: e minut och jag gör en outlier-detektering av nätverksbandbreddsanvändningen för ett företag, i princip klockan 18 kommer denna åtgärd att falla ner (detta är förväntat ett helt normalt mönster), och en standardavvikelse beräknad över ett skjutfönster kommer att misslyckas (eftersom det säkert kommer att utlösa en varning). Samtidigt, om åtgärden faller ner klockan 16 (avviker från den vanliga baslinjen), är detta en riktig outlier.
Aleksandar Ivanisevic
2010-08-10 15:54:57 UTC
view on stackexchange narkive permalink

vad jag gör är att gruppera mätningarna efter timme och veckodag och jämföra standardavvikelser för det. Korrigerar fortfarande inte för saker som helgdagar och sommar / vintersäsong, men det är korrekt för det mesta.

Nackdelen är att du verkligen behöver samla in ett års data för att ha tillräckligt så att stddev börjar vara vettigt.

Tack, det var precis vad jag försökte undvika (hade många prover som baslinje), för jag skulle vilja ha en riktigt reaktiv metod (t.ex. online-upptäckt, kanske "smutsig", efter 1-2 veckors baslinje)
IrishStat
2012-09-06 18:15:34 UTC
view on stackexchange narkive permalink

anomalidetektering kräver konstruktion av en ekvation som beskriver förväntningen. Intervention Detection finns både i en icke-kausal och kausal miljö. Om man har en prediktorserie som pris kan saker och ting bli lite komplicerade. Andra svar här verkar inte ta hänsyn till tilldelningsbar orsak som kan hänföras till användarspecificerade prediktorserier som pris och kan därför vara felaktiga. Mängd som säljs kan mycket väl bero på pris, kanske tidigare priser och kanske kvantitet som sålts tidigare. Grunden för detektion av anomalier (pulser, säsongspulser, nivåförskjutningar och lokala tidstrender) finns i https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf

Länken fungerar inte, kan du snälla fixa den.Tack
Gjort ..................
Ytsen de Boer
2016-11-24 16:58:28 UTC
view on stackexchange narkive permalink

Jag föreslår schemat nedan, som ska kunna implementeras på en dag eller så:

Träning

  • Samla så många prov som du kan hålla i minnet
  • Ta bort uppenbara avvikare med standardavvikelsen för varje attribut
  • Beräkna och lagra korrelationsmatrisen och även medelvärdet för varje attribut
  • Beräkna och lagra Mahalanobis-avstånden av alla dina prover

Beräkning av "outlierness":

För det enda provet som du vill veta dess "outlierness":

Det blir din outlier poäng: 100% är en extrem outlier.


PS. Vid beräkning av Mahalanobis-avståndet använder du korrelationsmatrisen, inte kovariansmatrisen. Detta är mer robust om provmätningarna varierar i enhet och antal.
orgesleka
2018-02-11 23:38:28 UTC
view on stackexchange narkive permalink

För fall där man måste beräkna avvikarna snabbt kan man använda idén om Rob Hyndman och Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection,bibliotek (spoutlier), funktion qsp) för att beräkna avvikarna enligt följande:

  -bibliotek (spoutlier)
rapidtsoutliers <- funktion (x, plot = FALSE, seed = 123)
{
    set.seed (utsäde)
    x <- as.numeric (x)
    tt <- 1: längd (x)
    qspscore <- qsp (x)
    gräns <- kvantil (qspscore, prob = c (0,95))
    poäng <- pmax ((qspscore - gräns), 0)
    if (plot)
    {
        plot (x, type = "l")
        x2 <- ts (rep (NA, längd (x)))
        x2 [score>0] <- x [score>0]
        tsk (x2) <- tsp (x)
        poäng (x2, pch = 19, col = "röd")
        retur (osynlig (poäng))
    }
    annan
        retur (poäng)
}
 


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 2.0-licensen som det distribueras under.
Loading...