Grubbs' Test爲一種假設檢驗的方法,常被用來檢驗服從正太分佈的單變量數據集(univariate data set)\(Y\) 中的單個異常值。如有異常值,則其必爲數據集中的最大值或最小值。原假設與備擇假設以下:php
\(H_0\): 數據集中沒有異常值
\(H_1\): 數據集中有一個異常值html
Grubbs' Test檢驗假設的所用到的檢驗統計量(test statistic)爲git
\[ G = \frac{\max |Y_i - \overline{Y}|}{s} \]github
其中,\(\overline{Y}\)爲均值,\(s\)爲標準差。原假設\(H_0\)被拒絕,當檢驗統計量知足如下條件web
\[ G > \frac{(N-1)}{\sqrt{N}}\sqrt{\frac{ (t_{\alpha/(2N), N-2})^2}{N-2 + (t_{\alpha/(2N), N-2})^2}} \]算法
其中,\(N\)爲數據集的樣本數,\(t_{\alpha/(2N), N-2}\)爲顯著度(significance level)等於\(\alpha/(2N)\)、自由度(degrees of freedom)等於\(N-2\)的t分佈臨界值。實際上,Grubbs' Test可理解爲檢驗最大值、最小值偏離均值的程度是否爲異常。dom
在現實數據集中,異常值每每是多個而非單個。爲了將Grubbs' Test擴展到\(k\)個異常值檢測,則須要在數據集中逐步刪除與均值偏離最大的值(爲最大值或最小值),同步更新對應的t分佈臨界值,檢驗原假設是否成立。基於此,Rosner提出了Grubbs' Test的泛化版ESD(Extreme Studentized Deviate test)。算法流程以下:spa
\begin{equation}
R_j = \frac{\max_i |Y_i - \overline{Y'}|}{s}, \quad 1 \leq j \leq k
\label{eq:esd_test}
\end{equation}htm
\[ \lambda_j = \frac{(n-j) * t_{p,n-j-1}}{\sqrt{(n-j-1+t_{p,n-j-1}^2)(n-j+1)}}, \quad 1 \leq j \leq k \]blog
檢驗原假設,比較檢驗統計量與臨界值;若\(R_i > \lambda_j\),則原假設\(H_0\)不成立,該樣本點爲異常點;
重複以上步驟\(k\)次至算法結束。
鑑於時間序列數據具備週期性(seasonal)、趨勢性(trend),異常檢測時不能做爲孤立的樣本點處理;故而Twitter的工程師提出了S- ESD (Seasonal ESD)與S-H-ESD (Seasonal Hybrid ESD)算法,將ESD擴展到時間序列數據。
STL將時間序列數據分解爲趨勢份量、週期份量和餘項份量。想固然的解法——將ESD運用於STL分解後的餘項份量中,便可獲得時間序列上的異常點。可是,咱們會發如今餘項份量中存在着部分假異常點(spurious anomalies)。以下圖所示:
在紅色矩形方框中,向下突起點被誤報爲異常點。爲了解決這種假陽性下降準確率的問題,S-ESD算法用中位數(median)替換掉趨勢份量;餘項計算公式以下:
\[ R_X = X - S_X- \tilde{X} \]
其中,\(X\)爲原時間序列數據,\(S_X\)爲STL分解後的週期份量,\(\tilde{X}\)爲\(X\)的中位數。
因爲個別異常值會極大地拉伸均值和方差,從而致使S-ESD未能很好地捕獲到部分異常點,召回率偏低。爲了解決這個問題,S-H-ESD採用了更具魯棒性的中位數與絕對中位差(Median Absolute Deviation, MAD)替換公式\eqref{eq:esd_test}中的均值與標準差。MAD的計算公式以下:
\[ MAD = median(|X_i - median(X)|) \]
S-H-ESD的Python實現有pyculiarity,時間序列異常檢測數據集有Yahoo公開的A Labeled Anomaly Detection Dataset。
[1] Hochenbaum, Jordan, Owen S. Vallis, and Arun Kejariwal. "Automatic Anomaly Detection in the Cloud Via Statistical Learning." arXiv preprint arXiv:1704.07706 (2017).