Vraag:
Eenvoudig algoritme voor online uitbijterdetectie van een generieke tijdreeks
gianluca
2010-08-03 01:37:28 UTC
view on stackexchange narkive permalink

Ik werk met een groot aantal tijdreeksen. Deze tijdreeksen zijn in feite netwerkmetingen die elke 10 minuten plaatsvinden, en sommige zijn periodiek (dwz de bandbreedte), andere niet (dwz de hoeveelheid routeringsverkeer).

Ik zou graag een eenvoudig algoritme voor het uitvoeren van een online "uitbijterdetectie". In principe wil ik de volledige historische gegevens voor elke tijdreeks in het geheugen (of op schijf) bewaren, en ik wil elke uitbijter in een live scenario detecteren (elke keer dat een nieuw monster wordt vastgelegd). Wat is de beste manier om deze resultaten te bereiken?

Ik gebruik momenteel een voortschrijdend gemiddelde om wat ruis te verwijderen, maar wat nu? Simpele dingen zoals standaarddeviatie, gek, ... tegen de hele dataset werken niet goed (ik kan niet aannemen dat de tijdreeksen stationair zijn), en ik zou graag iets "nauwkeuriger" willen, idealiter een zwarte doos zoals:

dubbele uitschieter_detectie (dubbele * vector, dubbele waarde);

waarbij vector de array van dubbele is die de historische gegevens bevat, en de geretourneerde waarde de anomaliescore is voor de nieuwe steekproef " waarde ".

Voor de duidelijkheid, hier is de oorspronkelijke vraag over SO: http://stackoverflow.com/questions/3390458/simple-algorithm-for-online-outlier-detection-of-a-generic-time-series
Ik denk dat we posters moeten aanmoedigen om links te plaatsen als onderdeel van de vraag als ze dezelfde vraag op een andere SE-site hebben gepost.
ja, je hebt helemaal gelijk. De volgende keer zal ik vermelden dat het bericht is doorgestuurd.
Ik raad je ook aan de andere gerelateerde links aan de rechterkant van de pagina te bekijken. Dit is een populaire vraag en is eerder in verschillende vragen naar voren gekomen. Als ze niet bevredigend zijn, is het het beste om uw vraag bij te werken over de specifieke kenmerken van uw situatie.
-1
2cts invoer.Toen ik aan dezelfde soort modellen werkte, kwam ik tot de conclusie dat internetverkeer "zomaar kan gebeuren", volumeveranderingen komen vaak voor en kunnen zonder actie plaatsvinden.Afgeleide vragen zoals stijgt het percentage geblokkeerde accounts, kan de geografische oorsprong van de verkeersverandering interessanter en / of stabieler zijn.
Veertien antwoorden:
#1
+84
Rob Hyndman
2010-08-03 05:54:56 UTC
view on stackexchange narkive permalink

Hier is een eenvoudige R-functie die uitbijters van tijdreeksen vindt (en deze optioneel in een plot laat zien). Het behandelt seizoensgebonden en niet-seizoensgebonden tijdreeksen. Het basisidee is om robuuste schattingen van de trend- en seizoenscomponenten te vinden en deze af te trekken. Zoek dan uitschieters in de residuen. De test voor resterende uitbijters is dezelfde als voor de standaard boxplot - punten groter dan 1,5 IQR boven of onder de bovenste en onderste kwartielen worden verondersteld uitschieters te zijn. Het aantal IQR's boven / onder deze drempels wordt geretourneerd als een uitbijter "score". Dus de score kan elk positief getal zijn, en zal nul zijn voor niet-uitbijters.

Ik realiseer me dat je dit niet implementeert in R, maar ik vind een R-functie vaak een goede plek om te beginnen. Dan is het de taak om dit te vertalen in de gewenste taal.

  tsoutliers <- function (x, plot = FALSE) {x <- as.ts (x) if (frequentie (x) >1) resid <- stl (x, s.window = "periodic", robust = TRUE) $ time.series [, 3] else {tt <- 1: length (x) resid <- residuals (löss (x ~ tt ))} resid.q <- kwantiel (resid, prob = c (0.25,0.75)) iqr <- diff (resid.q) limieten <- resid.q + 1.5 * iqr * c (-1,1) score < - abs (pmin ((residu-limieten [1]) / iqr, 0) + pmax ((residu - limieten [2]) / iqr, 0)) if (plot) {plot (x) x2 <- ts (rep (NA, lengte (x))) x2 [score>0] <- x [score>0] tsp (x2) <- tsp (x) punten (x2, pch = 19, col = "rood") return (onzichtbaar (score)) } else return (score)}  
+1 van mij, uitstekend. Dus> 1,5 X interkwartielbereik is de consensusdefinitie van een uitbijter voor tijdsafhankelijke reeksen? Dat zou fijn zijn om een ​​schaalonafhankelijke referentie te hebben.
De uitbijtertest is op de residuen, dus hopelijk is de tijdsafhankelijkheid klein. Ik weet niet van een consensus, maar boxplots worden vaak gebruikt voor het detecteren van uitbijter en lijken redelijk goed te werken. Er zijn betere methoden als iemand de functie wat fraaier wil maken.
Echt bedankt voor je hulp, ik waardeer het echt. Ik heb het nu behoorlijk druk op het werk, maar ik ga zo snel mogelijk een aanpak als de jouwe testen, en ik kom terug met mijn laatste overwegingen over dit probleem. Eén gedachte: in uw functie, van wat ik zie, moet ik handmatig de frequentie van de tijdreeks specificeren (bij het construeren), en de seizoenscomponent wordt alleen in aanmerking genomen als de frequentie groter is dan 1. Is er een robuuste manier dit automatisch afhandelen?
Ja, ik heb aangenomen dat de frequentie bekend en gespecificeerd is. Er zijn methoden om de frequentie automatisch te schatten, maar dat zou de functie aanzienlijk bemoeilijken. Als je de frequentie moet schatten, stel er dan een aparte vraag over - en ik zal waarschijnlijk een antwoord geven! Maar het heeft meer ruimte nodig dan ik beschikbaar heb in een opmerking.
Ik had eindelijk de tijd om een ​​beetje met deze methode te spelen, en dit lijkt een goed compromis (zelfs als ik nog steeds moet evalueren hoe complex de stl () -routine is vanuit het oogpunt van geheugen / cpu), wat redelijk goed werkt als we kenden de frequentie van de tijdreeksen. Trouwens, ik heb gemerkt dat de resultaten van de detectie sterk afhankelijk zijn van het soort signaal dat ik analyseer, en om de optimale resultaten te verkrijgen, moet ik de kansen voor de kwantielen of de vermenigvuldiger voor de IQR handmatig afstemmen. als u een expert bent op dit gebied, is er dan een "slimme" en "de facto" oplossing om dit probleem aan te pakken?
Is er een kans dat iemand dit in Matlab kan herschrijven? Ik 'spreek' geen R, maar dit lijkt erg handig.
@Marcin, Ik raad aan om zelf een poging te wagen. Misschien plak je je oplossing op gist.github.com en post je een SO-vraag als je klaar bent, om anderen je werk te laten controleren?
Ik heb zojuist een vervolgvraag op @RobHyndman's-antwoord gepost: [Eenvoudig algoritme voor online uitbijterdetectie van een generieke tijdreeks II: Dagelijkse cyclus binnen een jaar] (http://stats.stackexchange.com/questions/151840/simple-algorithm-voor-online-uitbijterdetectie-van-een-generieke-tijdreeks-ii-dagelijks)
#2
+28
whuber
2010-08-26 23:02:44 UTC
view on stackexchange narkive permalink

Een goede oplossing heeft verschillende ingrediënten, waaronder:

  • Gebruik een stevig, bewegend raam dat glad is om niet-stationariteit te verwijderen.

  • Druk de oorspronkelijke gegevens opnieuw uit, zodat de residuen ten opzichte van het gladde ongeveer symmetrisch zijn verdeeld. Gezien de aard van uw gegevens, is het waarschijnlijk dat hun vierkantswortels of logaritmen symmetrische residuen opleveren.

  • Pas controlediagrammethoden toe, of op zijn minst controlediagram-denken, op de residuen.

Wat dat laatste betreft, laat controlediagram-denken zien dat "conventionele" drempels zoals 2 SD of 1,5 keer de IQR voorbij de kwartielen slecht werken omdat ze te veel triggeren valse oncontroleerbare signalen. Mensen gebruiken meestal 3 SD in controlekaartwerk, waarvan 2,5 (of zelfs 3) keer de IQR voorbij de kwartielen een goed startpunt zou zijn.

Ik heb min of meer de aard van Rob Hyndmans oplossing geschetst terwijl er twee belangrijke punten aan toe te voegen: de mogelijke noodzaak om de gegevens opnieuw uit te drukken en de wijsheid om conservatiever te zijn in het signaleren van een uitbijter. Ik weet niet zeker of Löss goed is voor een online detector, omdat het niet goed werkt op de eindpunten. U kunt in plaats daarvan iets eenvoudigs gebruiken als een bewegend mediaanfilter (zoals in Tukey's resistente afvlakking). Als uitschieters niet in bursts komen, kunt u een smal venster gebruiken (misschien 5 gegevenspunten, die alleen worden afgebroken met een burst van 3 of meer uitschieters binnen een groep van 5).

Eenmaal u de analyse hebt uitgevoerd om een ​​goede heruitdrukking van de gegevens te bepalen, is het onwaarschijnlijk dat u de heruitdrukking moet wijzigen. Daarom hoeft uw online detector eigenlijk alleen naar de meest recente waarden (het laatste venster) te verwijzen, omdat deze de eerdere gegevens helemaal niet gebruikt. Als je echt lange tijdreeksen hebt, zou je verder kunnen gaan om autocorrelatie en seizoensinvloeden te analyseren (zoals terugkerende dagelijkse of wekelijkse fluctuaties) om de procedure te verbeteren.

Dit is een buitengewoon antwoord voor praktische analyse. Nooit had gedacht dat het nodig was om 3 IQR buiten de kwartielen te proberen.
@John, 1.5 IQR is Tukey's oorspronkelijke aanbeveling voor de langste snorharen op een boxplot en 3 IQR is zijn aanbeveling voor het markeren van punten als "verre uitschieters" (een verwijzing naar een populaire uitdrukking uit de jaren 60). Dit is in veel boxplot-algoritmen ingebouwd. De aanbeveling wordt theoretisch geanalyseerd in Hoaglin, Mosteller en Tukey, * Inzicht in robuuste en verkennende gegevensanalyse. *
Dit bevestigt tijdreeksgegevens die ik heb geprobeerd te analyseren.Venstergemiddelde en ook een vensterstandaarddeviatie.((x - avg) / sd)> 3 lijken de punten te zijn die ik als uitschieters wil markeren.Waarschuw tenminste als uitschieters, ik markeer alles hoger dan 10 sd als extreme foutuitschieters.Het probleem dat ik tegenkom is wat is een ideale raamlengte?Ik speel met alles tussen de 4-8 datapunten.
@Neo U kunt het beste experimenteren met een subset van uw gegevens en uw conclusies bevestigen met tests op de rest.U zou ook een meer formele kruisvalidatie kunnen uitvoeren (maar vanwege de onderlinge afhankelijkheid van alle waarden is speciale zorg nodig met tijdreeksgegevens).
#3
+19
whuber
2012-09-03 20:57:53 UTC
view on stackexchange narkive permalink

(Dit antwoord reageerde op een dubbele (nu gesloten) vraag bij Opsporen openstaande gebeurtenissen, die enkele gegevens in grafische vorm presenteerde.)


Uitbijter detectie hangt af van de aard van de gegevens en van wat u erover wilt aannemen. Methoden voor algemeen gebruik zijn gebaseerd op robuuste statistieken. De geest van deze benadering is om het grootste deel van de gegevens te karakteriseren op een manier die niet wordt beïnvloed door uitschieters en vervolgens te verwijzen naar individuele waarden die niet binnen die karakterisering passen.

Omdat dit een tijd is serie, voegt het de complicatie toe van het voortdurend (her) detecteren van uitschieters. Als dit moet gebeuren terwijl de reeks zich ontvouwt, mogen we alleen oudere gegevens gebruiken voor de detectie, geen toekomstige gegevens! Bovendien zouden we, als bescherming tegen de vele herhaalde tests, een methode willen gebruiken die een zeer laag percentage valse positieven heeft.

Deze overwegingen suggereren het uitvoeren van een eenvoudige, robuuste test met uitschieters van het bewegende venster over de gegevens . Er zijn veel mogelijkheden, maar een simpele, gemakkelijk te begrijpen en gemakkelijk te implementeren is gebaseerd op een lopende MAD: mediaan absolute afwijking van de mediaan. Dit is een sterk robuuste maat voor variatie binnen de gegevens, vergelijkbaar met een standaarddeviatie. Een afgelegen piek zou meerdere MAD's of meer groter zijn dan de mediaan.

Er moet nog wat afstemming worden gedaan : hoeveel van een afwijking van het grootste deel van de gegevens moet als afgelegen worden beschouwd en hoe ver terug in de tijd moet men kijken? Laten we deze als parameters voor experimenten laten. Hier is een R -implementatie toegepast op gegevens $ x = (1,2, \ ldots, n) $ (met $ n = 1150 $ om de gegevens te emuleren) met bijbehorende waarden $ y $:

  # Parameters om af te stemmen op de omstandigheden: venster <- 30threshold <- 5 # Een berekening van de bovenste drempel ("ut") gebaseerd op de MAD: bibliotheek (dierentuin) # rollapply ()
ut <- functie (x) {m = mediaan (x); median (x) + drempel * mediaan (abs (x - m))} z <- rollapply (zoo (y), window, ut, align = "right") z <- c (rep (z [1], window -1), z) # Gebruik z [1] gedurende de initiële periodoutliers <- y > z # Maak een grafiek van de gegevens, toon de ut () cutoffs en markeer de uitbijters: plot (x, y, type = "l", lwd = 2, col = "# E00000", ylim = c (0, 20000)) lijnen (x, z, col = "Gray") punten (x [uitschieters], y [uitschieters], pch = 19)  

Toegepast op een dataset zoals de rode curve geïllustreerd in de vraag, levert het dit resultaat op:

Plot

De gegevens worden in rood weergegeven , het 30-dagenvenster van mediaan + 5 * MAD-drempels in grijs, en de uitschieters - die gewoon die gegevenswaarden boven de grijze curve zijn - in zwart.

(De drempel kan alleen worden berekend beginnend aan het einde van het eerste venster. Voor alle gegevens binnen dit eerste venster wordt de eerste drempel gebruikt: daarom is de grijze curve vlak tussen x = 0 en x = 30.)

De effecten van het wijzigen van de parameters zijn (a) incr het versoepelen van de waarde van window zal de grijze curve egaliseren en (b) het verhogen van de drempel zal de grijze curve verhogen. Dit wetende, kan men een eerste segment van de gegevens nemen en snel waarden identificeren van de parameters die de afgelegen pieken het best van de rest van de gegevens scheiden. Pas deze parameterwaarden toe om de rest van de gegevens te controleren. Als uit een plot blijkt dat de methode in de loop van de tijd verslechtert, betekent dit dat de aard van de gegevens verandert en dat de parameters mogelijk opnieuw moeten worden afgestemd.

Merk op hoe weinig deze methode veronderstelt over de gegevens: ze hoeven niet normaal verdeeld te zijn; ze hoeven geen enkele periodiciteit te vertonen; ze hoeven niet eens niet-negatief te zijn. Alles wordt verondersteld dat de gegevens zich in de loop van de tijd op redelijk vergelijkbare manieren gedragen en dat de afgelegen pieken zichtbaar hoger zijn dan de rest van de gegevens.


Als iemand zou willen experimenteren (of een andere oplossing zou willen vergelijken met de oplossing die hier wordt aangeboden), is hier de code die ik heb gebruikt om gegevens te produceren zoals die in de vraag worden getoond.

  n. lengte <- 1150cycle.a <- 11cycle.b <- 365/12 amp.a <- 800amp.b <- 8000set.seed (17) x <- 1: n.lengthbaseline <- (1/2) * amp. * (1 + sin (x * 2 * pi / cyclus.a)) * rgamma (n.lengte, 40, schaal = 1/40) pieken <- rbinom (n.lengte, 1, exp (2 * (- 1 + sin (((1 + x / 2) ^ (1/5) / (1 + n.length / 2) ^ (1/5)) * x * 2 * pi / cyclus.b)) * cyclus.b )) y <- pieken * rgamma (n.lengte, 20, schaal = amp.b / 20) + basislijn  
Dit is echt een interessante oplossing en ik waardeer dat ik het kan implementeren zonder R te gebruiken (gewoon JavaScript in een webtoepassing gebruiken).Bedankt!
Ik denk dat een (licht gewijzigde) benadering met behulp van de MAD ook bekend staat onder de term "Hampel identifier".
#4
+15
ars
2010-08-03 05:56:33 UTC
view on stackexchange narkive permalink

Als je je zorgen maakt over aannames bij een bepaalde aanpak, kun je het beste een aantal leerlingen trainen op verschillende signalen, vervolgens ensemblemethoden gebruiken en de 'stemmen' van je leerlingen verzamelen om maak de uitbijterclassificatie.

Trouwens, dit kan de moeite waard zijn om te lezen of te skimmen, aangezien het verwijst naar een paar benaderingen van het probleem.

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

Ik vermoed dat een geavanceerd tijdreeksmodel niet voor u zal werken vanwege de tijd die het kost om uitschieters te detecteren met behulp van deze methode. Daarom is hier een tijdelijke oplossing:

  1. Stel eerst een basislijn 'normale' verkeerspatronen voor een jaar vast op basis van handmatige analyse van historische gegevens die rekening houden met het tijdstip van de dag, weekdag versus weekend , maand van het jaar enz.

  2. Gebruik deze basislijn samen met een eenvoudig mechanisme (bijv. zwevend gemiddelde voorgesteld door Carlos) om uitschieters te detecteren.

Misschien wilt u voor enkele ideeën ook de statistische literatuur over procescontrole bekijken.

Ja, dit is precies wat ik aan het doen ben: tot nu toe heb ik het signaal handmatig opgesplitst in periodes, zodat ik voor elk ervan een betrouwbaarheidsinterval kan definiëren waarbinnen het signaal stationair hoort te zijn, en daarom kan ik standaardmethoden gebruiken zoals als standaarddeviatie, ... Het echte probleem is dat ik niet het verwachte patroon kan bepalen voor alle signalen die ik moet analyseren, en daarom ben ik op zoek naar iets intelligents.
Hier is een idee: Stap 1: Implementeer en schat een generiek tijdreeksmodel op een eenmalige basis op basis van historische gegevens. Dit kan offline worden gedaan. Stap 2: Gebruik het resulterende model om uitschieters te detecteren. Stap 3: Op een bepaalde frequentie (misschien elke maand?), Kalibreer het tijdreeksmodel opnieuw (dit kan offline worden gedaan) zodat uw detectie van uitschieters in stap 2 niet te veel afwijkt van de huidige verkeerspatronen. Zou dat werken voor jouw context?
Ja, dit zou kunnen werken. Ik dacht aan een vergelijkbare aanpak (de basislijn elke week opnieuw berekenen, wat CPU-intensief kan zijn als je honderden univariate tijdreeksen moet analyseren) .BTW de echt moeilijke vraag is "wat is het beste blackbox-achtige algoritme voor het modelleren van een volledig generiek signaal, rekening houdend met ruis, trendschatting en seizoensinvloeden? ". AFAIK, elke benadering in de literatuur vereist een zeer harde" parameterafstemming "-fase, en de enige automatische methode die ik vond is een ARIMA-model van Hyndman (http: // robjhyndman. com / software / forecast /). Mis ik iets?
Houd er rekening mee dat ik niet te lui ben om deze parameters te onderzoeken, het punt is dat deze waarden moeten worden ingesteld volgens het verwachte patroon van het signaal, en in mijn scenario kan ik geen enkele aanname doen.
ARIMA-modellen zijn klassieke tijdreeksmodellen die kunnen worden gebruikt om tijdreeksgegevens in te passen. Ik zou u willen aanmoedigen om de toepassing van ARIMA-modellen te verkennen. Je zou kunnen wachten tot Rob online is en misschien komt hij langs met wat ideeën.
#6
+5
James Roth
2010-08-03 02:50:27 UTC
view on stackexchange narkive permalink

Pas de gegevens seizoensgebonden aan, zodat een normale dag er bijna vlak uitziet. U kunt een monster van vandaag om 17:00 uur nemen en het gemiddelde van de afgelopen 30 dagen om 17:00 uur aftrekken of verdelen. Kijk dan voorbij N standaarddeviaties (gemeten met vooraf aangepaste gegevens) voor uitschieters. Dit zou afzonderlijk kunnen worden gedaan voor wekelijkse en dagelijkse "seizoenen".

Nogmaals, dit werkt redelijk goed als het signaal een dergelijke seizoensgebondenheid zou moeten hebben, maar als ik een compleet andere tijdreeks gebruik (dat wil zeggen de gemiddelde TCP-roundtrip-tijd in de loop van de tijd), zal deze methode niet werken (omdat het beter zou zijn om die af te handelen met een eenvoudig globaal gemiddelde en standaarddeviatie met behulp van een schuifvenster met historische gegevens).
Tenzij je bereid bent om een ​​algemeen tijdreeksmodel te implementeren (dat zijn nadelen met zich meebrengt in termen van latentie enz.), Ben ik pessimistisch dat je een algemene implementatie zult vinden die tegelijkertijd eenvoudig genoeg is om voor alle soorten tijdreeksen te werken.
Nog een opmerking: ik weet dat een goed antwoord zou kunnen zijn "zodat u de periodiciteit van het signaal zou kunnen schatten en kunt beslissen welk algoritme er op basis van zou worden gebruikt", maar ik vond geen echt goede oplossing voor dit andere probleem (ik speelde bit met spectrale analyse met behulp van DFT en tijdanalyse met behulp van de autocorrelatiefunctie, maar mijn tijdreeksen bevatten veel ruis en dergelijke methoden geven meestal gekke resultaten)
Een opmerking bij je laatste opmerking: daarom ben ik op zoek naar een meer generieke benadering, maar ik heb een soort 'zwarte doos' nodig omdat ik geen enkele aanname kan doen over het geanalyseerde signaal, en daarom kan ik de "beste parameterset voor het leeralgoritme".
@gianluca Zoals u heeft aangegeven, kan de onderliggende ARIMA-structuur de anomalie maskeren. Een onjuiste formulering van mogelijke oorzaakvariabelen zoals uur van de dag, dag van de week, vakantie-effecten enz. Kunnen de anomalie ook maskeren. Het antwoord is vrij duidelijk: u moet een goede voorzorgsmaatregel hebben om anomalieën effectief te detecteren. Om Bacon te citeren: "Want wie de wegen van de natuur kent, zal haar afwijkingen gemakkelijker opmerken en aan de andere kant, wie haar afwijkingen kent, zal haar wegen nauwkeuriger beschrijven."
#7
+3
Peter Prettenhofer
2012-02-16 19:36:14 UTC
view on stackexchange narkive permalink

Een alternatief voor de benadering die door Rob Hyndman is geschetst, is het gebruik van Holt-Winters Forecasting. De vertrouwensbanden afgeleid van Holt-Winters kunnen worden gebruikt om uitschieters te detecteren. Hier is een artikel waarin wordt beschreven hoe Holt-Winters kan worden gebruikt voor "Detectie van afwijkend gedrag in tijdreeksen voor netwerkbewaking". Een implementatie voor RRDTool is hier te vinden.

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

Spectrale analyse detecteert periodiciteit in stationaire tijdreeksen. De frequentiedomeinbenadering op basis van spectrale dichtheidsschatting is een benadering die ik zou aanbevelen als uw eerste stap.

Als onregelmatigheid voor bepaalde periodes een veel hogere piek betekent dan typisch is voor die periode, dan zou de reeks met dergelijke onregelmatigheden niet stationair zijn en spectrale analyse zou niet geschikt zijn. Maar ervan uitgaande dat u de periode met de onregelmatigheden heeft geïdentificeerd, zou u ongeveer in staat moeten zijn om te bepalen wat de normale piekhoogte zou zijn en dan kunt u een drempel instellen op een niveau boven dat gemiddelde om de onregelmatige gevallen aan te duiden.

Kunt u uitleggen hoe deze oplossing "lokale onregelmatigheden" opspoort? Het presenteren van een uitgewerkt voorbeeld zou buitengewoon nuttig zijn. (Om eerlijk te zijn, stel ik voor dat u dit doet, omdat ik bij het uitvoeren van een dergelijke oefening denk dat u zult ontdekken dat uw suggestie niet effectief is voor het opsporen van uitbijter. Maar ik zou het mis kunnen hebben ...)
@whuber De spectrale analyse zal alleen identificeren waar alle pieken zijn. De volgende stap zou zijn om een ​​model uit de yime-serie te passen met behulp van sinus- en cosinustermen met de frequenties die zijn bepaald met de spectrale analyse en de amplitudes die zijn geschat op basis van de gegevens. Als onregelmatigheden pieken met zeer hoge amplitudes betekenen, dan denk ik dat een drempelwaarde voor de amplitude passend zou zijn. Als lokale onregelmatigheden betekenen dat de amplitude gedurende een bepaalde periode soms significant groter is dan andere, dan is de reeks niet stationair en zou spectraalanalyse niet geschikt zijn.
Ik volg de conclusie over gebrek aan stationariteit niet. De som van een normale sinusoïdale golfvorm en een gemarkeerd Poisson-puntproces zou bijvoorbeeld stationair zijn, maar zou geen enkele periodiciteit vertonen die u zoekt. Je zou niettemin enkele sterke pieken in het periodogram vinden, maar ze zouden je niets vertellen dat relevant is voor de onregelmatige datapieken die door de Poisson-procescomponent worden geïntroduceerd.
Een stationaire tijdreeks heeft een constant gemiddelde. Als de piek voor een periodieke component in de loop van de tijd kan veranderen, kan dit het gemiddelde veranderen in de tijd en daarom zouden de seires niet-stationair zijn.
#9
+2
AyodeleO
2015-04-30 13:50:53 UTC
view on stackexchange narkive permalink

Aangezien het tijdreeksgegevens zijn, zal een eenvoudig exponentieel filter http://en.wikipedia.org/wiki/Exponential_smoothing de gegevens vloeiender maken. Het is een zeer goede filter omdat u geen oude gegevenspunten hoeft te verzamelen. Vergelijk elke nieuwe afgevlakte gegevenswaarde met de niet-afgevlakte waarde. Zodra de afwijking een bepaalde vooraf gedefinieerde drempel overschrijdt (afhankelijk van wat u denkt dat een uitbijter in uw gegevens is), kan uw uitbijter gemakkelijk worden gedetecteerd.

In CI doet het volgende voor een realtime 16-bits sample (ik geloof dat dit hier ergens is gevonden < Explanation - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order-iir-approximation-to-a-moving -average-filter>)

  #define BITS2 2 // < Dit is ongeveer = log2 (1 / alpha), afhankelijk van hoe soepel u wilt dat uw gegevens Simple_Exp_Filter ( int new_sample) {statisch int gefilterd_sample = 0; long local_sample = sample << 16; / * We nemen aan dat het een 16 bit sample is * / filter_sample + = (local_sample - gefilterd_sample) >> BITS2; return (short) ((gefilterde_sample + 0x8000) >> 16); // < Rond door 0,5 toe te voegen en af ​​te kappen. } int main () {new_arrived = function_receive_new_sample (); gefilterd_sample = Simple_Exp_Filter (nieuw_aangekomen); if (abs (nieuw_aangekomen - gefilterd_voorbeeld) / nieuw_aangekomen > THRESHOLD) {// EEN OUTLIER IS GEVONDEN} return 0; }  
#10
+1
Carlos Accioly
2010-08-03 01:48:01 UTC
view on stackexchange narkive permalink

Je zou de standaarddeviatie van de laatste N-metingen kunnen gebruiken (je moet een geschikte N kiezen). Een goede anomaliescore zou zijn hoeveel standaarddeviaties een meting is van het voortschrijdend gemiddelde.

Bedankt voor uw reactie, maar wat als het signaal een hoog seizoensgevoel vertoont (d.w.z. veel netwerkmetingen worden gekenmerkt door een dagelijks en wekelijks patroon op hetzelfde tijdstip, bijvoorbeeld nacht versus dag of weekend versus werkdagen)? Een aanpak op basis van standaarddeviatie zal in dat geval niet werken.
Als ik bijvoorbeeld elke 10 minuten een nieuwe sample krijg, en ik doe een uitbijterdetectie van het netwerkbandbreedtegebruik van een bedrijf, dan zal deze maatregel in principe om 18.00 uur afnemen (dit is een verwacht een totaal normaal patroon), en een standaarddeviatie berekend over een glijdend venster zal mislukken (omdat het zeker een waarschuwing zal activeren). Tegelijkertijd, als de maatregel om 16.00 uur naar beneden valt (afwijkend van de gebruikelijke basislijn), is dit een echte uitbijter.
#11
+1
Aleksandar Ivanisevic
2010-08-10 15:54:57 UTC
view on stackexchange narkive permalink

wat ik doe is de metingen groeperen op uur en dag van de week en de standaarddeviaties daarvan vergelijken. Corrigeert nog steeds niet voor zaken als vakanties en zomer- / winterseizoensgebondenheid, maar het is meestal correct.

Het nadeel is dat je echt een jaar of zo aan gegevens moet verzamelen om genoeg te hebben, zodat stddev begint logisch te worden.

Bedankt, dat is precies wat ik probeerde te vermijden (veel monsters als basislijn hebben), omdat ik een echt reactieve benadering zou willen (bijvoorbeeld online detectie, misschien "vies", na 1-2 weken basislijn)
#12
  0
IrishStat
2012-09-06 18:15:34 UTC
view on stackexchange narkive permalink

anomaliedetectie vereist de constructie van een vergelijking die de verwachting beschrijft. Interventiedetectie is beschikbaar in zowel een niet-causale als een causale setting. Als iemand een voorspellende reeks zoals prijs heeft, kan het een beetje ingewikkeld worden. Andere antwoorden hier lijken geen rekening te houden met de toewijsbare oorzaak die kan worden toegeschreven aan door de gebruiker gespecificeerde voorspellingsreeksen, zoals de prijs, en kunnen dus gebrekkig zijn. De verkochte hoeveelheid kan heel goed afhangen van de prijs, misschien eerdere prijzen en misschien de verkochte hoeveelheid in het verleden. De basis voor de anomaliedetectie (pulsen, seizoenspulsen, niveauverschuivingen en lokale tijdtrends) is te vinden in https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf

De link werkt niet, kunt u deze repareren?Bedankt
gedaan ..................
#13
  0
Ytsen de Boer
2016-11-24 16:58:28 UTC
view on stackexchange narkive permalink

Ik stel het onderstaande schema voor, dat over een dag of zo implementeerbaar zou moeten zijn:

Training

  • Verzamel zoveel mogelijk voorbeelden in het geheugen
  • Verwijder duidelijke uitschieters met behulp van de standaarddeviatie voor elk attribuut
  • Bereken en bewaar de correlatiematrix en ook het gemiddelde van elk attribuut
  • Bereken en sla de Mahalanobis-afstanden op van al uw steekproeven

Berekenen "uitbijterigheid":

Voor het enkele steekproef waarvan u de "uitbijterigheid" wilt weten:

  • Haal de gemiddelden, covariantiematrix en Mahalanobis-afstand s van training op
  • Bereken de Mahalanobis-afstand "d" voor uw steekproef
  • Geef het percentiel terug waarin "d" valt (met behulp van de Mahalanobis-afstanden vanaf de training).

Dat is uw uitschieterscore: 100% is een extreme uitbijter.


PS. Gebruik bij het berekenen van de Mahalanobis-afstand de correlatiematrix, niet de covariantiematrix. Dit is robuuster als de monsterafmetingen variëren in eenheid en aantal.
#14
  0
orgesleka
2018-02-11 23:38:28 UTC
view on stackexchange narkive permalink

Voor het geval dat men de uitschieters snel moet berekenen, zou men het idee van Rob Hyndman en Mahito Sugiyama kunnen gebruiken ( https://github.com/BorgwardtLab/sampling-outlier-detection,bibliotheek (spoutlier), functie qsp) om de uitschieters als volgt te berekenen:

  bibliotheek (uitloop)
rapidtsoutliers <- functie (x, plot = FALSE, seed = 123)
{
    set.seed (zaad)
    x <- als. numeriek (x)
    tt <- 1: lengte (x)
    qspscore <- qsp (x)
    limiet <- kwantiel (qspscore, prob = c (0,95))
    score <- pmax ((qspscore - limiet), 0)
    if (plot)
    {
        plot (x, type = "l")
        x2 <- ts (rep (NA, lengte (x)))
        x2 [score>0] <- x [score>0]
        theelepel (x2) <- theelepel (x)
        punten (x2, pch = 19, col = "rood")
        terugkeer (onzichtbaar (score))
    }
    anders
        terugkeer (score)
}
 


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 2.0-licentie waaronder het wordt gedistribueerd.
Loading...