Genel bir zaman serisinin çevrimiçi farkını tespit etmek için basit bir algoritma


88

Çok fazla zaman serileriyle çalışıyorum. Bu zaman serileri temelde her 10 dakikada bir gelen ağ ölçümleridir ve bazıları periyodiktir (ör. Bant genişliği), bazıları ise değildir (yani yönlendirme trafiği miktarı).

Çevrimiçi "outlier" için basit bir algoritma istiyorum. Temel olarak, her bir zaman serisinin tüm geçmiş verilerini hafızada (veya diskte) tutmak istiyorum ve canlı bir senaryoda herhangi bir aykırı tespit etmek istiyorum (her yeni örnek alındığında). Bu sonuçları elde etmenin en iyi yolu nedir?

Şu anda biraz gürültüyü gidermek için hareketli bir ortalama kullanıyorum, peki sonra ne olacak? Standart sapma gibi basit şeyler, deli, ... tüm veri setine karşı iyi çalışmaz (zaman serilerinin durağan olduğunu varsaymıyorum) ve daha doğrusu kara bir kutu gibi "doğru" bir şey istiyorum:

double outlier_detection (çift * vektör, çift değer);

buradaki vektör, tarihsel verileri içeren çift dizisidir ve dönüş değeri, yeni "değer" örneği için anomali puanıdır.


1
Sadece netlik için, SO'nun orijinal sorusu burada: stackoverflow.com/questions/3390458/…
Matt Parker

1
Aynı soruyu başka bir SE sitesine göndermişlerse, posterleri sorunun bir parçası olarak göndermeye teşvik etmemiz gerektiğini düşünüyorum.

evet, tamamen haklısın. Bir dahaki sefere iletinin çarpı işareti olduğunu söyleyeceğim.
gianluca

Ayrıca sayfanın sağ tarafındaki diğer İlgili bağlantılara da göz atmanızı öneririm. Bu popüler bir soru ve daha önce çeşitli sorularla karşılaştı. Tatminkar değilse, durumunuzun özellikleriyle ilgili sorunuzu güncellemeniz en iyisidir.
Andy W

İyi yakala, @Andy! Bu soruyu diğeriyle birleştirelim.
whuber

Yanıtlar:


75

İşte zaman serisi aykırı değerlerini bulabilecek basit bir R işlevi (ve isteğe bağlı olarak bunları bir arsada göster). Mevsimlik ve mevsimlik olmayan zaman serileri idare edecek. Temel fikir eğilim ve mevsimsel bileşenlerin sağlam tahminlerini bulmak ve onları çıkarmaktır. Sonra artıklarda aykırı olanları bulun. Kalıntı aykırı değerler için yapılan test, standart kutu grafiğiyle aynıdır - üst ve alt çeyreklerin üstünde veya altında 1.5IQR'den büyük noktalar varsayılan aykırı değerler kabul edilir. Bu eşik değerlerin altındaki / altındaki IQR sayısı outlier "skoru" olarak döndürülür. Böylece puan herhangi bir pozitif sayı olabilir ve aykırı olmayanlar için sıfır olur.

Bunu R'ye uygulayamadığınızı anlıyorum, ancak genellikle R işlevini başlatmak için iyi bir yer buluyorum. Öyleyse görev, bu dili gereken her ne dile çevirmek.

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)
}

Benden +1, mükemmel. Öyleyse> 1.5 X çeyrekler arası aralık, zamana bağlı seriler için bir aykırığın fikir birliği tanımıdır? Ölçekten bağımsız bir referans olması güzel olurdu.
Doug

Bu aykırı test artıklar üzerindedir, bu yüzden umarım zamana bağlılık azdır. Bir fikir birliği hakkında bilgim yok, ancak kutu lekeleri sık sık sapma saptama için kullanılır ve oldukça iyi çalışıyor gibi görünüyor. Birisi işlevi biraz meraklı yapmak istiyorsa, daha iyi yöntemler vardır.
Rob Hyndman

Gerçekten, yardımın için teşekkür ederim, gerçekten minnettarım. Şu anda çok işim var ama en kısa zamanda sizinki gibi bir yaklaşımı test edeceğim ve bu konudaki son düşüncelerime geri döneceğim. Tek bir düşünce: sizin fonksiyonunuzda gördüğüm kadarıyla, zaman serisinin frekansını manuel olarak belirlemeliyim (inşa ederken) ve mevsimsellik bileşeni sadece frekans 1'den büyük olduğunda göz önünde bulundurulmalıdır. otomatik olarak bununla başa çıkmak için?
gianluca

1
Evet, frekansın bilindiğini ve belirlendiğini varsaydım. Frekansı otomatik olarak tahmin etmek için yöntemler vardır, ancak bu, işlevi önemli ölçüde karmaşıklaştıracaktır. Frekansı tahmin etmeniz gerekirse, bunun hakkında ayrı bir soru sormayı deneyin - muhtemelen bir cevap vereceğim! Ancak bir yorumda sahip olduğumdan daha fazla alana ihtiyaç duyuyor.
Rob Hyndman,

2
@Marcin, kendin bıçaklamanı öneririm. Belki çözümünüzü gist.github.com adresine yapıştırın ve bittiğinde başkalarının çalışmanızı kontrol etmesi için bir SO sorusu gönderin?
Ken Williams,

27

İyi bir çözüm, aşağıdakiler de dahil olmak üzere çeşitli bileşenlere sahip olacaktır:

  • Durağanlığı gidermek için dayanıklı, hareketli bir pencere kullanın.

  • Orijinal verileri, pürüzsüz olarak kalan artıkların yaklaşık olarak simetrik olarak dağılması için yeniden ifade edin. Verilerinizin doğası gereği, kareköklerinin veya logaritmalarının simetrik artıklar vermesi muhtemeldir.

  • Kalanlara kontrol şeması yöntemleri veya en azından kontrol şeması düşüncesini uygulayın.

En sonuncusuna kadar, kontrol çizelgesi düşüncesi, 2 SD veya 1.5 IQR'nin çeyrek katları gibi "geleneksel" eşik değerlerinin, çok sayıda yanlış kontrol dışı sinyali tetikledikleri için yetersiz çalıştığını göstermektedir. İnsanlar genellikle kontrol şeması çalışmasında 3 SD kullanır, bu nedenle çeyreklerin ötesinde IQR'nin 2,5 (veya 3) katı iyi bir başlangıç ​​noktası olur.

Rob Hyndman'ın çözümünün doğasını iki ana noktaya eklerken aşağı yukarı ana hatlarıyla belirtmiştim: Verileri yeniden ifade etme potansiyeli ve bir aygırın sinyalini verme konusunda daha tutucu olma bilgeliği. Loess'in çevrimiçi bir dedektör için iyi olduğundan emin değilim, çünkü uç noktalarda iyi çalışmıyor. Bunun yerine, hareketli bir medyan filtre kadar basit bir şey kullanabilirsiniz (Tukey'in dirençli düzleştirmesinde olduğu gibi). Aykırılıklar patlamalara girmezse, dar bir pencere kullanabilirsiniz (belki de 5 gruptaki 3 veya daha fazla aykırığın patlamasıyla kırılacak 5 veri noktası).

Verilerin iyi bir şekilde yeniden ifade edilmesini belirlemek için analizi yaptıktan sonra, yeniden ifadeyi değiştirmeniz gerekecektir. Bu nedenle, çevrimiçi dedektörünüzün yalnızca en son değerleri (en son pencereyi) referans alması gerekir çünkü daha önceki verileri hiç kullanmaz. Eğer gerçekten uzun zaman serileriniz varsa, işlemi iyileştirmek için otokorelasyon ve mevsimsellik (örneğin günlük veya haftalık dalgalanmalar gibi) analizlerine devam edebilirsiniz.


3
Bu, pratik analiz için olağanüstü bir cevaptır. Çeyreklerin ötesinde 3 IQR'yi denemek için hiçbir zaman bir şey düşünmemeliydim.
John Robertson,

3
@John, 1.5 IQR, Tukey'in bir kutudaki en uzun bıyıkçılara yönelik orijinal önerisidir ve 3 IQR, puanları "uzak uçuranlar" (popüler bir 60'lı cümle üzerinde bir riff) olarak işaretlemek için önerisidir. Bu, birçok kutu grafiği algoritmasında yerleşiktir. Öneri, Hoaglin, Mosteller ve Tukey, Sağlam ve
whuber

Bu, analiz etmeye çalıştığım zaman serisi verilerini doğrular. Pencere ortalaması ve ayrıca pencere standart sapmaları. ((x - avg) / sd)> 3, outliers olarak işaretlemek istediğim noktalar gibi görünüyor. En azından aykırı uyarılar olarak uyar, 10 sd'den yüksek olan her şeyi aşırı hata aykırı olarak işaretlerim. Karşılaştığım sorun ideal pencere uzunluğu nedir? 4-8 veri noktası arasında herhangi bir şey ile oynuyorum.
Josh Peak,

1
@Neo En iyi seçeneğiniz, verilerinizin bir alt kümesini denemek ve kalanlarınızı testlerle sonuçlandırmanızı onaylamak olabilir. Siz de daha resmi bir çapraz onaylama yapabilirsiniz (ancak tüm değerlerin birbirine bağımlılığı nedeniyle zaman serisi verilerinde özel dikkat gereklidir).
whuber

17

(Bu yanıt , bazı verileri grafik biçiminde sunan olağanüstü olayları saptamadaki yinelenen (şimdi kapalı) sorusuna yanıt verdi .)


Aykırı saptama, verinin niteliğine ve bunlar hakkında neyi varsaymaya istekli olduğunuza bağlıdır. Genel amaçlı yöntemler sağlam istatistiklere dayanır. Bu yaklaşımın özü, verilerin yığınını herhangi bir aykırı etkilenmeyecek şekilde karakterize etmek ve daha sonra bu karakterizasyona uymayan herhangi bir bireysel değeri işaret etmektir.

Bu bir zaman dizisi olduğu için, aykırı değerleri sürekli olarak saptamaya (yeniden) ihtiyaç duymanın komplikasyonunu ekler. Bu, seri ortaya çıktıkça yapılacaksa, gelecekteki verileri değil, yalnızca algılama için eski verileri kullanmamıza izin verilir! Ayrıca, birçok tekrarlanan testlere karşı koruma olarak, yanlış pozitif oranı çok düşük olan bir yöntem kullanmak isteriz.

Bu düşünceler, veriler üzerinde basit, sağlam bir hareketli pencere dışa açık testi çalıştırılmasını önerir . Pek çok olasılık var, ancak basit, kolay anlaşılan ve kolayca uygulanabilen bir tanesi, çalışan bir MAD: medyandan medyan mutlak sapmasıdır. Bu, standart sapmalara benzer şekilde verilerdeki güçlü bir varyasyon ölçüsüdür. Bir uzaktaki zirve birkaç Mads veya ortanca daha büyük olacaktır.

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)

Soruda gösterilen kırmızı eğri gibi bir veri kümesine uygulandığında, bu sonucu verir:

Arsa

Veriler kırmızı renkte, 30 günlük ortanca + 5 * MAD eşiğinin gri renkte eşik değeri ve sadece gri eğrinin üzerindeki veri değerleri olan aykırı renkler - siyah olarak gösterilir.

(Eşik yalnızca ilk pencerenin sonundan başlayarak hesaplanabilir . Bu ilk penceredeki tüm veriler için ilk eşik kullanılır: bu nedenle gri eğri x = 0 ve x = 30 arasında düzdür.)

Parametreleri değiştirmenin etkileri (a) değerinin arttırılması windowgri eğriyi yumuşatma eğiliminde olacaktır ve (b) arttırılması thresholdgri eğriyi yükseltecektir. Bunu bilerek, veriler ilk bir parçayı alabilir ve dıştaki zirveleri en iyi şekilde ayıran parametrelerin değerlerini hızlı bir şekilde tanımlayabilir. Geri kalan verileri kontrol etmek için bu parametre değerlerini uygulayın. Bir çizim, yöntemin zaman içinde kötüye gittiğini gösterirse, bu verilerin niteliğinin değişmekte olduğu ve parametrelerin yeniden ayarlanması gerekebileceği anlamına gelir.

Bu yöntemin verilerle ilgili ne kadar az varsaydığına dikkat edin: normal şekilde dağıtılması gerekmez; herhangi bir periyodiklik sergilemelerine gerek yoktur; Olumsuz olmaları bile gerekmez. Tek düşündüğü, verilerin zaman içinde oldukça benzer şekilde davrandığı ve dıştaki tepe noktalarının diğer verilerden gözle görülür şekilde daha yüksek olduğu.


Herhangi biri denemek isterse (veya burada sunulan ile başka bir çözümü karşılaştırırsak), soruda gösterilenler gibi veri üretmek için kullandığım kod.

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

Bu gerçekten ilginç bir çözüm ve R kullanmadan uygulayabildiğim için minnettarım (sadece bir web uygulamasında düz JavaScript kullanarak). Teşekkürler!
hgoebl

15

Herhangi bir özel yaklaşıma sahip varsayımlardan endişe ediyorsanız, yaklaşımlardan biri birkaç öğrenciyi farklı sinyaller üzerinde eğitmektir, daha sonra topluluk yöntemlerini kullanın ve genel sınıflamayı yapmak için öğrencilerinizden gelen “oylar” üzerine toplanın.

BTW, soruna birkaç yaklaşıma gönderme yaptığı için bu okumaya veya kaymaya değer olabilir.


5

Sofistike zaman serisi modelinin, bu metodolojiyi kullanan aykırıları tespit etmek için harcadığı zamandan dolayı sizin için işe yaramayacağını tahmin ediyorum. Bu nedenle, burada bir geçici çözüm:

  1. Öncelikle, günün saatini, haftanın gününü haftasonu vs hafta sonu, yılın ayı vb.

  2. Bu temel çizgiyi, aykırı değerlerin tespit edilmesi için basit bir mekanizma (örneğin, Carlos tarafından önerilen hareketli ortalama) ile birlikte kullanın.

Ayrıca bazı fikirler için istatistiksel süreç kontrol literatürünü gözden geçirmek isteyebilirsiniz .


1
Evet, tam olarak ne yapıyorum: şimdiye kadar sinyali manuel olarak periyotlara böldüm, böylece her biri için sinyalin durağan olması gereken bir güven aralığı tanımlayabilirim ve bu nedenle bu gibi standart yöntemler kullanabilirim standart sapma olarak ... Asıl sorun, analiz etmek zorunda olduğum tüm sinyaller için beklenen yapıya karar verememem ve bu yüzden daha zeki bir şey arıyorum.
gianluca

İşte bir fikir: 1. Adım: Tarihsel verilere dayanarak, bir zamana göre genel bir zaman serisi modelini uygulamak ve tahmin etmek. Bu çevrimdışı yapılabilir. Adım 2: Aykırı olanları tespit etmek için ortaya çıkan modeli kullanın. Adım 3: Bir sıklıkta (belki her ay?), Zaman serisi modelini yeniden kalibre edin (bu çevrimdışı yapılabilir), böylece 2. adımda aykırı değerlerin algılanması mevcut trafik düzeninde fazla adım atmaz. Bağlamınız için işe yarar mı?

Evet, bu işe yarayabilir. Benzer bir yaklaşımı düşünüyordum (analiz etmek için yüzlerce tek değişkenli zaman serisine sahipseniz CPU yoğun olabilen her hafta temel çizgiyi yeniden hesaplamak). BTW asıl zor soru "gürültü, eğilim tahmini ve mevsimsellik göz önünde bulundurularak, tamamen genel bir sinyali modellemek için en iyi kara kutu tarzı algoritma nedir?" AFAIK, literatürdeki her yaklaşım gerçekten zor bir "parametre ayarlama" aşaması gerektiriyor ve bulduğum tek otomatik yöntem Hyndman'ın ARIMA modeli ( robjhyndman.com/software/forecast ). Bir şey mi eksik?
gianluca

Lütfen, bu parametreleri araştırmak için fazla tembel olmadığımı unutmayın, asıl nokta, bu değerlerin sinyalin beklenen düzenine göre ayarlanması gerektiği ve senaryomda herhangi bir varsayımda bulunamayacağım.
gianluca

ARIMA modelleri, zaman serisi verilerinin sığması için kullanılabilen klasik zaman serisi modelleridir. ARIMA modellerinin uygulamasını keşfetmenizi tavsiye ederim. Rob'un çevrimiçi olmasını bekleyebilirsiniz ve belki de bazı fikirlerle ilgisini çekecektir.

5

Mevsimsel olarak verileri, normal bir günün daireye daha yakın görüneceği şekilde ayarlayın. Bugünün akşam 5:00 örneğini alabilir ve önceki 30 günün ortalamasını akşam 5: 00'de çıkarabilir veya bölebilirsiniz. Sonra aykırı değerler için N standart sapmalara (önceden ayarlanmış veriler kullanılarak ölçülmüş) geçmişe bakın. Bu, haftalık ve günlük "mevsimler" için ayrı ayrı yapılabilir.


Yine, eğer sinyalin böyle bir mevsimsellik olması gerekiyorsa, bu oldukça iyi çalışıyor, ancak tamamen farklı bir zaman serisi kullanırsam (yani zaman içinde ortalama TCP gidiş-dönüş zamanı), bu yöntem işe yaramayacak (çünkü daha iyi olacağından) Bunu tarihsel veriler içeren kayan bir pencere kullanarak basit bir küresel ortalama ve standart sapma ile ele almak).
gianluca

1
Genel bir zaman serisi modelini uygulamaya koymaya istekli olmadığınız sürece (bu, gecikme vb. Yönlerini de beraberinde getirir) Aynı zamanda, her türlü zaman serisi için çalışacak kadar basit olan genel bir uygulama bulacağınıza karamsarım.

Başka bir yorum: İyi bir cevap "olabilir, bu nedenle sinyalin periyodikliğini tahmin edebilir ve buna göre kullanacak algoritmaya karar verebilirsiniz", ancak bu diğer soruna gerçekten iyi bir çözüm bulamadım ( DFT kullanarak spektral analiz ve otokorelasyon işlevini kullanarak zaman analizi ile bit, ancak zaman serilerim çok fazla gürültü içeriyor ve bu yöntemler zamanın bazı çılgın sonuçlarını veriyor)
gianluca

Son yorumunuza bir yorum: bu yüzden daha genel bir yaklaşım arıyorum, ancak analiz edilen sinyal hakkında herhangi bir varsayımda bulunamadığım için bir tür "kara kutuya" ihtiyacım var ve bu nedenle "Öğrenme algoritması için en iyi parametre seti".
gianluca

@gianluca İçinde bulunduğun gibi ARIMA yapısı anomaliyi maskeleyebilir. Yanlış formülasyon pf olası saat nedenleri, haftanın günü, tatil etkileri gibi değişkenler de anomaliyi maskeleyebilir. Cevap oldukça açıktır ki anomalileri etkili bir şekilde tespit etmek için iyi bir ekipmana ihtiyacınız var. Bacon'dan alıntı yapmak için: "Doğanın yollarını bilen biri sapmalarını daha kolay fark edecek ve diğer yandan sapmalarını bilen herkes onun yollarını daha doğru tarif edecektir."
IrishStat

3

Rob Hyndman tarafından ana hatları çizilen yaklaşıma alternatif, Holt-Winters Forecasting'i kullanmak olacaktır . Holt-Winters'dan türetilen güven grupları, aykırı değerlerin tespitinde kullanılabilir. İşte "Ağ İzleme Zaman Serisi Sorun Davranışlar Algılama" için Holt-Winters'ı nasıl kullanılacağını açıklayan bir kağıttır. RRDTool için bir uygulama burada bulunabilir .


2

Spektral analiz, durağan zaman serilerindeki periyodikliği tespit eder. Spektral yoğunluk tahminine dayanan frekans bölgesi yaklaşımı, ilk adımınız olarak önereceğim bir yaklaşımdır.

Belli dönemler için düzensizlik, o dönem için tipik olandan çok daha yüksek bir tepe anlamına gelirse, bu tür düzensizlikleri olan seriler durağan olmaz ve spektral anliz uygun olmaz. Ancak, normal tepe yüksekliğinin yaklaşık olarak ne olacağını belirleyebilmeniz gereken düzensizlikleri olan süreyi belirlediğinizi varsayalım ve daha sonra düzensiz durumları belirlemek için bu ortalamanın üzerinde bir seviyeye bir eşik ayarlayabilir.


2
Bu çözümün "yerel düzensizlikleri" nasıl algıladığını açıklayabilir misiniz? Çalışılan bir örnek sunmak son derece yardımcı olacaktır. (Dürüst olmak gerekirse, bunu yapmanızı öneriyorum çünkü böyle bir egzersizi yaparken önerinizin dışlayıcı tespitinde etkili olmadığını keşfedeceğinize inanıyorum. Ama yanlış olabilirim ...)
whuber

1
@whuber Spektral analiz sadece tüm tepe noktalarının nerede olduğunu tanımlayacaktır. Bir sonraki adım, sinral ve kosinüs terimlerini kullanarak spektral analizde belirlenen frekanslarla ve verilerden tahmin edilen genliklerle bir yime serisi modeline uymak olacaktır. Usulsüzlükler çok yüksek amplitüdlü pikler anlamına gelirse, o zaman amplitüd üzerindeki eşiğin uygun olacağını düşünüyorum. Yerel düzensizlikler, bir süre boyunca genliğin bazen diğerlerinden önemli ölçüde daha büyük olduğu anlamına gelirse, seri durağan değildir ve spektral analiz uygun olmaz.
Michael Chernick

1
Durağanlık eksikliği hakkındaki sonucu takip etmiyorum. Örneğin, düzenli bir sinüzoidal dalga formunun ve işaretlenmiş bir Poisson nokta işleminin toplamı durağan olacaktır, ancak aradığınız herhangi bir periyodikliği sergilemez. Bununla birlikte, periodogramda bazı güçlü zirveler bulacaksınız, ancak size Poisson süreci bileşeninin getirdiği düzensiz veri zirveleri ile ilgili hiçbir şey söylemezler.
whuber

1
Sabit bir zaman serisinin sabit bir ortalaması vardır. Bir periyodik bileşenin zirvesi zaman içinde değişebiliyorsa, zaman içindeki değişimin ortalamasını azaltabilir ve dolayısıyla eserler durağan olmaz.
Michael Chernick

2

Zaman serisi verileri olduğundan, basit bir üstel filtre http://en.wikipedia.org/wiki/Exponential_smoothing verileri düzgünleştirir. Eski veri noktalarını toplamanız gerekmediğinden bu çok iyi bir filtredir. Her yeni karşılaştırın düzleştirilmiş onun ile veri değerini , düzeltilmemiş değer. Sapma, önceden tanımlanmış belli bir eşiği aştığında (verilerinizdeki bir alıcının olduğuna inandığınıza bağlı olarak), o zaman alıcınız kolayca tespit edilebilir.

CI'de gerçek zamanlı 16 bitlik bir örnek için aşağıdakiler yapılacaktır (bunun burada bir yerde bulunduğuna inanıyorum <Açıklama - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-yaklasıklık-a-hareketli ortalama filtreye >)

#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

Son N ölçümlerinin standart sapmasını kullanabilirsiniz (uygun bir N seçmeniz gerekir). İyi bir anomali skoru, bir ölçümün hareketli ortalamadan ne kadar standart sapma olduğunu gösterir.


Yanıtınız için teşekkür ederiz, ancak sinyal yüksek bir mevsimsellik gösteriyorsa (örneğin, birçok ağ ölçümü aynı anda hem günlük hem de haftalık bir desenle tanımlanırsa, örneğin gece - gündüz veya hafta sonu - iş günleri)? Standart sapmaya dayalı bir yaklaşım bu durumda işe yaramayacaktır.
gianluca

Örneğin, her 10 dakikada bir yeni bir örnek alırsam ve bir şirketin ağ bant genişliği kullanımına ilişkin daha net bir tespit gerçekleştiriyorsam, temelde saat 18: 00'de bu önlem düşecektir (bu, beklenilen normal bir kalıptır) ve Kayan bir pencerede hesaplanan standart bir sapma başarısız olacaktır (çünkü bir alarmı kesin olarak tetikleyecektir). Aynı zamanda, eğer ölçüm saat 4: 00'te düşerse (normal taban çizgisinden sapma), bu gerçek bir aykırıdır.
gianluca

1

Yaptığım şey, ölçümleri saat ve haftanın gününe göre gruplandırmak ve bunun standart sapmalarını karşılaştırmak. Yine de tatiller ve yaz / kış mevsimsellik gibi şeyleri düzeltmiyor ama çoğu zaman doğru.

Dezavantajı ise, stddev'in anlamlı olmaya başlaması için yeterli veriyi bir yıl kadar veri toplamalısınız.


Teşekkürler, tam olarak kaçınmaya çalıştığım şey buydu (başlangıçta çok fazla sayıda örnek var), çünkü gerçekten reaktif bir yaklaşım istiyorum (örn. Çevrimiçi tespit, belki de "kirli", 1-2 haftalık başlangıçtan sonra)
gianluca

0

Aşağıdaki şemayı öneriyorum, ki bunlar bir gün içinde uygulanabilir olmalı:

Eğitim

  • Bellekte tutabildiğiniz kadar örnek toplayın
  • Her özellik için standart sapmayı kullanarak belirgin aykırı değerleri kaldırın
  • Korelasyon matrisini ve ayrıca her bir özelliğin ortalamasını hesaplayın ve saklayın
  • Tüm numunelerinizin Mahalanobis mesafelerini hesaplayın ve saklayın

"Outlierness" hesaplanıyor:

Onun "ahlaksızlık" ını bilmek istediğiniz tek örnek için:

Bu sizin outlier puanınız olacak:% 100 aşırı bir outlier.


PS. Mahalanobis mesafesini hesaplarken, kovaryans matrisini değil, korelasyon matrisini kullanın. Örnek ölçümleri birim ve sayı olarak değişirse, bu daha sağlamdır.


0

Aykırı olanların hızlı bir şekilde hesaplanması gereken durumlarda, Rob Hyndman ve Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , kütüphane (spoutlier), qsp fonksiyonu) fikrini kullanabilir. aykırıklar aşağıdaki gibidir:

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

anomali tespiti, beklentiyi tanımlayan bir denklemin kurulmasını gerektirir. Müdahale Tespiti hem nedensel hem de nedensel bir ortamda mevcuttur. Birinin fiyatı gibi bir tahmin serisi varsa, işler biraz karışık olabilir. Buradaki diğer tepkiler, fiyat gibi, kullanıcının belirlediği belirleyici serilerine atfedilebilecek tahsis edilebilir nedeni dikkate almamaktadır ve bu nedenle hatalı olabilir. Satılan miktar, fiyatlara, belki önceki fiyatlara ve belki de geçmişte satılan miktarlara bağlı olabilir. Anomali tespitinin (darbeler, mevsimsel darbeler, seviye kaymaları ve yerel zaman eğilimleri) temeli https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf adresinde bulunur.


Bağlantı çalışmıyor, düzeltebilir misiniz? Teşekkürler
Pankaj Joshi

yapılır ..................
IrishStat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.