時間序列數據伴隨着咱們的生活和工做。從牙牙學語時的「1, 2, 3, 4, 5, ……」到房價的走勢變化,從金融領域的刷卡記錄到運維領域的核心網性能指標。時間序列中的規律能加深咱們對事物和場景的認識,時間序列中的異常能提醒咱們某些部分可能出現問題。那麼如何去發現時間序列中的規律、找出其中的異常點呢?接下來,咱們將揭開這些問題的面紗。html
直觀上講,異常就是現實與心理預期產生較大差距的特殊情形。如2020年春節的新型肺炎(COVID-19,coronavirus disease 2019),能夠看到2月12日有一個明顯的確診病例的升高,這就是一個異常點,以下圖:算法
從統計上講,嚴重偏離預期的點,常見的能夠經過3-sigma準則來斷定。segmentfault
從數學上講,它就是一個分段函數:運維
那麼咱們有哪些方法來發現異常呢?異常分析的方法有不少,在本文中,咱們主要講解時間序列分解的算法。接下來,咱們先從時間序列的定義開始講起。函數
前面章節,咱們列舉了生活和工做中的一些時間序列的例子,可是並無給出定義。在本節中,咱們將首先給出時間序列的定義,而後給出時間序列的分類方法,最後再給你們展現常見的時間序列。性能
1.時間序列的定義學習
時間序列是不一樣時間點的一系列變量所組成的有序序列。例如北京市2013年4月每日的平均氣溫就構成了一個時間序列,爲了方便,咱們通常認爲序列中相鄰元素具備相同的時間間隔。spa
時間序列能夠分爲肯定的和隨機的。例如,一個1990年出生的人,從1990年到1999年年齡能夠表述爲{0,1,2,…,9},這個序列並無任何隨機因素。這是一個肯定性的時間序列。現實生活中咱們所面對的序列更多的是摻雜了隨機因素的時間序列,例如氣溫、銷售量等等,這些是帶有隨機性的例子。咱們說的時間序列通常是指帶有隨機性的。3d
那麼對於隨機性的時間序列,又如何進行分類呢?htm
2.時間序列的分類
從研究對象上分,時間序列分爲一元時間序列和多元時間序列,如新冠肺炎例子中,只看確診病例的變化,它是一元時間序列。若是把確診病例和疑似病例聯合起來看,它是一個多元時間序列。
從時間參數上分,時間序列分爲離散時間的時間序列和連續時間的時間序列。例如氣溫變化曲線,一般是按照天、小時進行預測、計算的,這個採集的時間是離散的,所以,它是一個離散時間的時間序列。再如花粉在水中呈現不規則的運動,它無時無刻不在運動,它是一個連續時間的時間序列,這就是你們衆所周知的布朗運動。在咱們的工做中,咱們通常遇到的都是離散時間的時間序列。
從統計特徵上分,時間序列分爲平穩時間序列和非平穩時間序列。平穩序列從直觀上講,均值和標準差不隨着時間發生變化,而非平穩序列均值或者標準差通常會隨着時間發生變化。下面兩個圖分別給出平穩序列和非平穩序列的例子。
3.常見的時間序列
在本節,咱們將給你們列舉一些常見的時間序列,讓你們對常見的時間序列有一個直觀的概念。
前面給你們講了異常和時間序列的概念,本章將給你們講解時間序列分解技術。
1.目的
時間序列分解是探索時序變化規律的一種方法,主要探索週期性和趨勢性。基於時序分解的結果,咱們能夠進行後續的時間預測和異常檢測。
2.主要組成部分
在時間序列分析中,咱們常常要關注趨勢和週期。所以,通常地,咱們將時序分紅三個部分:趨勢部分、週期部分和殘差部分。結合下圖CO2含量的例子(見下圖)對這三個主要部分進行解釋:
1)趨勢部分:展現了CO2含量逐年增長;
2)週期部分:反應了一年中CO2含量是週期波動的;
3)殘差部分:趨勢和週期部分不能解釋的部分。
3.時序分解模型
時間序列分解基於分解模型的假設。一般,咱們會考慮如下兩種模型:
加法模型適用於如下場景:
乘法模型適用於如下場景:
另外,當咱們不清楚選擇哪一個模型時,能夠兩個模型都使用,選擇偏差最小的那一個。
因爲乘法模型與加法模型能夠相互轉化,咱們後面僅以加法模型來進行介紹。
4.時序分解算法
基於週期、趨勢分解的時序分解算法主要有經典時序分解算法、Holt-Winters算法和STL算法。經典時序分解算法起源於20世紀20年代,方法較簡單。Holt-Winters算法於1960年由Holt的學生 Peter Winters 提出,可以適應隨着時間變化的季節項。STL(Seasonal and Trend decomposition using Loess)分解法,由Cleveland 等於1990年提出,比較通用,且較爲穩健。三者之間的關係,以下圖所示:
4.1經典時序分解算法
經典時序分解算法是最簡單的一種分解算法,它是不少其餘分解算法的基礎。該算法基於「季節部分不隨着時間發生變化」這一假設,且須要知道序列的週期。另外,該算法基於滑動平均技術。
其中,m=2k+1. 也就是說,時刻t的趨勢項的估計值能夠經過先後k個時刻內的平均值獲得。階數 m 越大,趨勢越光滑。由上面的公式能夠看出,m通常取奇數,這保證了對稱性。可是在不少場景下,週期是偶數,例如一年有4個季度,則週期爲4,是偶數。此時,須要作先作一個4階滑動平均(4-MA),再對所得結果作一個2階滑動平均(2-MA),整個過程記爲 。這樣處理後的結果是對稱的,即加權的滑動平均,數學表達以下:
下面咱們將講解經典時序分解算法的計算步驟。
經典時序分解算法雖然簡單、應用普遍,可是也存在一些問題:
1) 沒法估計序列最前面幾個和最後面幾個的趨勢和週期部分,例如若m=4,則沒法估計前2個和後2個觀測的趨勢和週期的部分;
2) 嚴重依賴「季節性部分每一個週期都是相同的」這一假設;
3) 過分光滑趨勢部分。
4.2Holt-Winters算法
在上一節中,咱們介紹了經典時序分解算法,可是它嚴重依賴「季節性部分每一個週期都是相同的」這一假設。爲了可以適應季節部分隨時間發生變化,Holt-Winters算法被提出。Holt-Winters算法是基於簡單指數光滑技術。首先,咱們先介紹簡單指數光滑技術。
簡單指數光滑的思想主要是如下兩點:
簡單指數光滑的模型比較簡單,以下:
Holt-Winters算法是簡單指數光滑在趨勢(可理解爲水平的變化率)和季節性上的推廣,主要包括水平(前文中的趨勢項)、趨勢項和季節項三個部分。
4.3 STL算法
STL(Seasonal and Trend decomposition using Loess)是一個很是通用的、穩健性強的時序分解方法,其中Loess是一種估算非線性關係的方法。STL分解法由 Cleveland et al. (1990) 提出。
STL算法中最主要的是局部光滑技術 (locally weighted scatterplot smoothing, LOWESS or LOESS),有時也稱爲局部多項式迴歸擬合。它是對兩維散點圖進行平滑的經常使用方法,它結合了傳統線性迴歸的簡潔性和非線性迴歸的靈活性。當要估計某個響應變量值時,先從其預測點附近取一個數據子集(以下圖實點 是要預測的點,選取周圍的需點來進行擬合),而後對該子集進行線性迴歸或二次迴歸,迴歸時採用加權最小二乘法(以下圖,採用的是高斯核進行加權),即越靠近估計點的值其權重越大,最後利用獲得的局部迴歸模型來估計響應變量的值。用這種方法進行逐點運算獲得整條擬合曲線。
STL算法的主要環節包含內循環、外循環和季節項後平滑三個部分:
外循環主要做用則是引入了一個穩健性權重項,以控制數據中異常值產生的影響,這一項將會考慮到下一階段內循環的臨近權重中去。
趨勢份量和季節份量都是在內循環中獲得的。循環完後,季節項將出現必定程度的毛刺現象,由於在內循環中平滑時是在每個截口中進行的,所以,在按照時間序列重排後,就沒法保證相鄰時段的平滑了,爲此,還須要進行季節項的後平滑,後平滑基於局部二次擬合,而且再也不須要在loess中進行穩健性迭代。
對於異常的判斷,咱們經常使用的有 n-sigma 準則和boxplot準則(箱線圖準則)。那這些準備是如何計算的,有哪些區別和聯繫呢?
1.n-sigma 準則
n-sigma準則有計算簡單、效率高且有很強的理論支撐,可是須要近似正態的假設,且均值和標準差的計算用到了所有的數據,所以,受異常點的影響較大。
2.boxplot 準則
爲了下降異常點的影響,boxplot準則被提出。boxplot(箱線圖)是一種用做顯示一組數據分散狀況的統計圖,常常用於異常檢測。BoxPlot的核心在於計算一組數據的中位數、兩個四分位數、上限和下限,基於這些統計值畫出箱線圖。
根據上面的統計值就能夠畫出下面的圖,超過上限的點或這個低於下限的點均可以認爲是異常點。
從上面的計算上能夠看出,boxplot對異常點是穩健的。
在前面的章節,咱們瞭解了時序分解的算法,也學習了異常判斷的準則,那麼如何基於時序分解進行異常檢測呢?在本章,咱們將首先給出異常檢測算法的原理,再給出基於時序分解的異常檢測算法步驟。
1.異常檢測算法原理
回顧一下異常的定義,它是一個分段函數:
咱們能夠看到預測值(擬合值)和閾值是不知道的。對於預測值,咱們能夠經過找規律來猜這個預測值是多少,本章咱們能夠經過時序分解找週期和趨勢的規律,進而獲得預測值。對於閾值,咱們能夠看到閾值是針對真實值和預測值的差值設置的,目的是把異常值找到,所以咱們只要找到正常值的殘差和異常值的殘差的邊界便可。而咱們n-sigma準則和boxplot準則就能夠根據殘差把邊界找出來,即閾值。這個思考和實現的過程示意圖以下:
2.基於時序分解的異常檢測算法
Demo代碼下載地址 ,本文主要是想記錄基於時間序列的異常檢測方法,但願可以幫到你。