㈠ 指數平滑方法簡介
指數平滑(Exponential smoothing)是除了 ARIMA 之外的另一種被廣泛使用的時間序列預測方法(關於 ARIMA,請參考 時間序列模型簡介 )。 指數平滑即指數移動平均(exponential moving average),是以指數式遞減加權的移動平均。各數值的權重隨時間指數式遞減,越近期的數據權重越高。常用的指數平滑方法有一次指數平滑、二次指數平滑和三次指數平滑。
一次指數平滑又叫簡單指數平滑(simple exponential smoothing, SES),適合用來預測沒有明顯趨勢和季節性的時間序列。其預測結果是一條水平的直線。模型形如:
其中 是真實值, 為預測值, 為平滑值, 。
定義殘差 ,其中 ,則可以通過優化方法得到 和 。
使用 python 的 statsmodels 可以方便地應用該模型:
效果如圖:
Holt 擴展了簡單指數平滑,使其可以用來預測帶有趨勢的時間序列。直觀地看,就是對平滑值的一階差分(可以理解為斜率)也作一次平滑。模型的預測結果是一條斜率不為0的直線。模型形如:
其中 , 。
效果如圖:
Holt's linear trend method 得到的預測結果是一條直線,即認為未來的趨勢是固定的。對於短期有趨勢、長期趨於穩定的序列,可以引入一個阻尼系數 ,將模型改寫為
為了描述時間序列的季節性,Holt 和 Winters 進一步擴展了 Holt's linear trend method,得到了三次指數平滑模型,也就是通常說的 Holt-Winters』 模型。我們用 表示「季節」的周期。根據季節部分和非季節部分的組合方式不同,Holt-Winters』 又可以分為加法模型和乘法模型。
加法模型形如:
其中 , , 。 是 的整數部分。
效果如圖:
乘法模型形如:
效果如圖:
Holt-Winters』 模型的趨勢部分同樣可以引入阻尼系數 ,這里不再贅述。
參數優化的方法是最小化誤差平方和或最大化似然函數。模型選擇可以根據信息量准則,常用的有 AIC 和 BIC等。
AIC 即 Akaike information criterion, 定義為
其中 是似然函數, 是參數數量。用 AIC 選擇模型時要求似然函數大,同時對參數數量作了懲罰,在似然函數相近的情況下選擇復雜度低的模型。
BIC 即 Bayesian information criterion,定義為
其中 是樣本數量。當 時, ,因此當樣本量較大時 BIC 對模型復雜度的懲罰比 AIC 更嚴厲。
線性的指數平滑方法可以看作是 ARIMA 的特例。例如簡單指數平滑等價於 ARIMA(0, 1, 1),Holt's linear trend method 等價於 ARIMA(0, 2, 2),而 Damped trend methods 等價於 ARIMA(1, 1, 2) 等。
我們不妨來驗證一下。
可以改寫為
亦即
兩邊同時加上 ,得
而 ARIMA(p, d, q) 可以表示為
其中 是滯後運算元(Lag operator), 。
考慮 ARIMA(0, 1, 1)
即
亦即
令 ,則兩者等價。
非線性的指數平滑方法則沒有對應的 ARIMA 表示。
[1] Hyndman, Rob J., and George Athanasopoulos. Forecasting: principles and practice. OTexts, 2014.
[2] Exponential smoothing - Wikipedia https://en.wikipedia.org/wiki/Exponential_smoothing
[3] Introction to ARIMA models - Duke https://people.ke.e/~rnau/411arim.htm
㈡ IT運維平台演算法背後的兩大「神助攻」
智能運維(AIops)是目前 IT 運維領域最火熱的詞彙,全稱是 Algorithmic IT operations platforms,正規翻譯是『基於演算法的 IT 運維平台』,直觀可見演算法是智能運維的核心要素之一。
本文主要談演算法對運維的作用,涉及異常檢測和歸因分析兩方面,圍繞運維系統Kale 中 skyline、Oculus 模塊、Opprentice 系統、Granger causality(格蘭傑因果關系)、FastDTW 演算法等細節展開。
一、異常檢測
異常檢測,是運維工程師們最先可能接觸的地方了。畢竟監控告警是所有運維工作的基礎。設定告警閾值是一項耗時耗力的工作,需要運維人員在充分了解業務的前提下才能進行,還得考慮業務是不是平穩發展狀態,否則一兩周改動一次,運維工程師絕對是要發瘋的。
如果能將這部分工作交給演算法來解決,無疑是推翻一座大山。這件事情,機器學習當然可以做到。但是不用機器學習,基於數學統計的演算法,同樣可以,而且效果也不差。
異常檢測之Skyline異常檢測模塊
2013年,Etsy 開源了一個內部的運維系統,叫 Kale。其中的 skyline 部分,就是做異常檢測的模塊, 它提供了 9 種異常檢測演算法 :
first_hour_average、
simple_stddev_from_moving_average、
stddev_from_moving_average、
mean_subtraction_cumulation、
least_squares
histogram_bins、
grubbs、
median_absolute_deviation、
Kolmogorov-Smirnov_test
簡要的概括來說,這9種演算法分為兩類:
從正態分布入手:假設數據服從高斯分布,可以通過標准差來確定絕大多數數據點的區間;或者根據分布的直方圖,落在過少直方里的數據就是異常;或者根據箱體圖分析來避免造成長尾影響。
從樣本校驗入手:採用 Kolmogorov-Smirnov、Shapiro-Wilk、Lilliefor 等非參數校驗方法。
這些都是統計學上的演算法,而不是機器學習的事情。當然,Etsy 這個 Skyline 項目並不是異常檢測的全部。
首先,這里只考慮了一個指標自己的狀態,從縱向的時序角度做異常檢測。而沒有考慮業務的復雜性導致的橫向異常。其次,提供了這么多種演算法,到底一個指標在哪種演算法下判斷的更准?這又是一個很難判斷的事情。
問題一: 實現上的抉擇。同樣的樣本校驗演算法,可以用來對比一個指標的當前和歷史情況,也可以用來對比多個指標里哪個跟別的指標不一樣。
問題二: Skyline 其實自己採用了一種特別朴實和簡單的辦法來做補充——9 個演算法每人一票,投票達到閾值就算數。至於這個閾值,一般算 6 或者 7 這樣,即佔到大多數即可。
異常檢測之Opprentice系統
作為對比,面對相同的問題,網路 SRE 的智能運維是怎麼處理的。在去年的 APMcon 上,網路工程師描述 Opprentice 系統的主要思想時,用了這么一張圖:
Opprentice 系統的主體流程為:
KPI 數據經過各式 detector 計算得到每個點的諸多 feature;
通過專門的交互工具,由運維人員標記 KPI 數據的異常時間段;
採用隨機森林演算法做異常分類。
其中 detector 有14種異常檢測演算法,如下圖:
我們可以看到其中很多演算法在 Etsy 的 Skyline 里同樣存在。不過,為避免給這么多演算法調配參數,直接採用的辦法是:每個參數的取值范圍均等分一下——反正隨機森林不要求什麼特徵工程。如,用 holt-winters 做為一類 detector。holt-winters 有α,β,γ 三個參數,取值范圍都是 [0, 1]。那麼它就采樣為 (0.2, 0.4, 0.6, 0.8),也就是 4 ** 3 = 64 個可能。那麼每個點就此得到 64 個特徵值。
異常檢測之
Opprentice 系統與 Skyline 很相似
Opprentice 系統整個流程跟 skyline 的思想相似之處在於先通過不同的統計學上的演算法來嘗試發現異常,然後通過一個多數同意的方式/演算法來確定最終的判定結果。
只不過這里網路採用了一個隨機森林的演算法,來更靠譜一點的投票。而 Etsy 呢?在 skyline 開源幾個月後,他們內部又實現了新版本,叫 Thyme。利用了小波分解、傅里葉變換、Mann-whitney 檢測等等技術。
另外,社區在 Skyline 上同樣做了後續更新,Earthgecko 利用 Tsfresh 模塊來提取時序數據的特徵值,以此做多時序之間的異常檢測。我們可以看到,後續發展的兩種 Skyline,依然都沒有使用機器學習,而是進一步深度挖掘和調整時序相關的統計學演算法。
開源社區除了 Etsy,還有諸多巨頭也開源過各式其他的時序異常檢測演算法庫,大多是在 2015 年開始的。列舉如下:
Yahoo! 在去年開源的 egads 庫。(Java)
Twitter 在去年開源的 anomalydetection 庫。(R)
Netflix 在 2015 年開源的 Surus 庫。(Pig,基於PCA)
其中 Twitter 這個庫還被 port 到 Python 社區,有興趣的讀者也可以試試。
二、歸因分析
歸因分析是運維工作的下一大塊內容,就是收到報警以後的排障。對於簡單故障,應對方案一般也很簡單,採用 service restart engineering~ 但是在大規模 IT 環境下,通常一個故障會觸發或導致大面積的告警發生。如果能從大面積的告警中,找到最緊迫最要緊的那個,肯定能大大的縮短故障恢復時間(MTTR)。
這個故障定位的需求,通常被歸類為根因分析(RCA,Root Cause Analysis)。當然,RCA 可不止故障定位一個用途,性能優化的過程通常也是 RCA 的一種。
歸因分析之 Oculus 模塊
和異常檢測一樣,做 RCA 同樣是可以統計學和機器學習方法並行的~我們還是從統計學的角度開始。依然是 Etsy 的 kale 系統,其中除了做異常檢測的 skyline 以外,還有另外一部分,叫 Oculus。而且在 Etsy 重構 kale 2.0 的時候,Oculus 被認為是1.0 最成功的部分,完整保留下來了。
Oculus 的思路,用一句話描述,就是:如果一個監控指標的時間趨勢圖走勢,跟另一個監控指標的趨勢圖長得比較像,那它們很可能是被同一個根因影響的。那麼,如果整體 IT 環境內的時間同步是可靠的,且監控指標的顆粒度比較細的情況下,我們就可能近似的推斷:跟一個告警比較像的最早的那個監控指標,應該就是需要重點關注的根因了。
Oculus 截圖如下:
這部分使用的 計算方式有兩種:
歐式距離,就是不同時序數據,在相同時刻做對比。假如0分0秒,a和b相差1000,0分5秒,也相差1000,依次類推。
FastDTW,則加了一層偏移量,0分0秒的a和0分5秒的b相差1000,0分5秒的a和0分10秒的b也相差1000,依次類推。當然,演算法在這個簡單假設背後,是有很多降低計算復雜度的具體實現的,這里就不談了。
唯一可惜的是 Etsy 當初實現 Oculus 是基於 ES 的 0.20 版本,後來該版本一直沒有更新。現在停留在這么老版本的 ES 用戶應該很少了。除了 Oculus,還有很多其他產品,採用不同的統計學原理,達到類似的效果。
歸因分析之 Granger causality
Granger causality(格蘭傑因果關系)是一種演算法,簡單來說它通過比較「已知上一時刻所有信息,這一時刻 X 的概率分布情況」和「已知上一時刻除 Y 以外的所有信息,這一時刻 X 的概率分布情況」,來判斷 Y 對 X 是否存在因果關系。
可能有了解過一點機器學習信息的讀者會很詫異了:不是說機器只能反應相關性,不能反應因果性的么?需要說明一下,這里的因果,是統計學意義上的因果,不是我們通常哲學意義上的因果。
統計學上的因果定義是:『在宇宙中所有其他事件的發生情況固定不變的條件下,如果一個事件 A 的發生與不發生對於另一個事件 B 的發生的概率有影響,並且這兩個事件在時間上有先後順序(A 前 B 後),那麼我們便可以說 A 是 B 的原因。』
歸因分析之皮爾遜系數
另一個常用的演算法是皮爾遜系數。下圖是某 ITOM 軟體的實現:
我們可以看到,其主要元素和採用 FastDTW 演算法的 Oculus 類似:correlation 表示相關性的評分、lead/lag 表示不同時序數據在時間軸上的偏移量。
皮爾遜系數在 R 語言里可以特別簡單的做到。比如我們拿到同時間段的訪問量和伺服器 CPU 使用率:
然後運行如下命令:
acc_count<-scale(acc$acc_count,center=T,scale=T)
cpu<-scale(acc$cpuload5,center=T,scale=T)
cor.test(acc_count,cpu)
可以看到如下結果輸出:
對應的可視化圖形如下:
這就說明網站數據訪問量和 CPU 存在弱相關,同時從散點圖上看兩者為非線性關系。因此訪問量上升不一定會真正影響 CPU 消耗。
其實 R 語言不太適合嵌入到現有的運維系統中。那這時候使用 Elasticsearch 的工程師就有福了。ES 在大家常用的 metric aggregation、bucket aggregation、pipeline aggregation 之外,還提供了一種 matrix aggregation,目前唯一支持的 matrix_stats 就是採用了皮爾遜系數的計算,介面文檔見:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-matrix-stats-aggregation.html
唯一需要注意的就是,要求計算相關性的兩個欄位必須同時存在於一個 event 里。所以沒法直接從現成的 ES 數據中請求不同的 date_histogram,然後計算,需要自己手動整理一遍,轉儲回 ES 再計算。
饒琛琳,目前就職日誌易,有十年運維工作經驗。在微博擔任系統架構師期間,負責帶領11人的SRE團隊。著有《網站運維技術與實踐》、《ELKstack權威指南》,合譯有《Puppet 3 Cookbook》、《Learning Puppet 4》。在眾多技術大會上分享過自動化運維與數據分析相關主題。
㈢ r里的holtwinters 是怎麼算出參數的
在r中看函數源代碼: 在R中,代碼可以分為如下幾個級別: 首先,是你輸入了函數對象名稱,你可以直接看到代碼的,如要獲得函數對象fivenum的代碼,就只需要在Console中鍵入函數對象名稱fivenum就可以得到如下結果: function (x, na.rm = TRUE) 。
㈣ 三次指數平滑(holt-winter)
我現在深深的發現我老公就是個杠精,我說啥他都要杠,不杠就活不了了。
生氣。
這里不多說指數平滑的原理,直接給一個結論。
請王越不要在跟我抬杠,千恩萬謝。
一次指數平滑預測值恆為常數,所以最好只做1期預測。
最近我司又讓我做時間序列了,就目前我的水平而言,做出來的效果最好的是xgboost演算法。
出於興趣,自己研究了holt-winter的使用方法。
from statsmodels.tsa.holtwinters import ExponentialSmoothing
數據樣式如下,一小時一個點,逗號前面是時間,後面是數值。
1、先拿到數據,一小時一個點,去除時間標記,拿到數值,按照時間順序,存入數組y3中。
2、設置模型的參數
看一下源碼里怎麼說的
參數:
第一個endog,當然是時間序列的數據了,array-like的形式。
第二個trend是趨勢,有三種可選項,就是加法趨勢和乘法趨勢還有None。
第三個damped是衰減,Boolean,是否對趨勢進行衰減。
第四個seasonal是季節性(周期),也是三種選項,加法、乘法還有None。
第五個seasonal_periods,季節性周期,int型,holt-winter要考慮的季節的數量。簡單來說,多少點是一個周期?你可以設定為一天,一星期,一個月,一年等等
參數比較簡單,一目瞭然。
我這邊設置的趨勢和季節都是加性的。因為數據是一小時一個點的,所以周期我給的是24,即一天為一個周期。
3、擬合模型
4、預測
看這個效果還不錯是吧,那是因為前面都在訓練集裡面,真正展現實力的是後面分叉的部分。效果很差。
如果只是把後面的部分截出來看,是不是對比更明顯一點。
下圖是我用同樣的數據,holt-winter和xgboost預測效果以及真實值的對比效果
㈤ 時序檢測演算法--指數平滑法
http://www.dataguru.cn/article-3235-1.html
所有移動平均法都存在很多問題。
它們都太難計算了。每個點的計算都讓你絞盡腦汁。而且也不能通過之前的計算結果推算出加權移動平均值。
移動平均值永遠不可能應用於現有的數據集邊緣的數據,因為它們的窗口寬度是有限的。這是一個大問題,因為數據集邊緣的變動形態一般都是我們最感興趣的部分。
類似地,移動平均法也不能應用於現有數據集的范圍之外。其結果是,它們對預測毫無用處。
幸運的是,有一種很簡單的計算方案能夠避免所有這些問題。它叫指數平滑法(exponential smoothing)或Holt-Winters法。指數平滑法有幾種不同形式:一次指數平滑法針對沒有趨勢和季節性的序列,二次指數平滑法針對有趨勢但 沒有季節性的序列。 術語「Holt-Winters法」有時特指三次指數平滑法。
所有的指數平滑法都要更新上一時間步長的計算結果,並使用當前時間步長的數據中包含的新信息。它們通過「混合」新信息和舊信息來實現,而相關的新舊信息的權重由一個可調整的拌和參數來控制。各種方法的不同之處在於它們跟蹤的量的個數和對應的拌和參數的個數。
㈥ 時間序列 Holt-Winters 方法要求序列平穩嗎
Why stationary?(為何要平穩?)
Why weak stationary?(為何弱平穩?)
Why stationary?(為何要平穩?)
每一個統計學問題,我們都需要對其先做一些基本假設。如在一元線性回歸中(),我們要假設:①不相關且非隨機(是固定值或當做已知)②獨立同分布服從正態分布(均值為0,方差恆定)。
在時間序列分析中,我們考慮了很多合理且可以簡化問題的假設。而其中最重要的假設就是平穩。
The basic idea of stationarity is that the probability laws that govern the behavior of the process do not change over time.
平穩的基本思想是:時間序列的行為並不隨時間改變。
正因此,我們定義了兩種平穩:
Strict stationarity: A time series {} is said to be strictly stationary if the joint distribution of ,, · · ·, is the same as that of,, · · · ,for all choices of natural number n, all choices of time points ,, · · · , and all choices of time lag k.
強平穩過程:對於所有可能的n,所有可能的,, · · · , 和所有可能的k,當,, · · ·,的聯合分布與,, · · · ,相同時,我們稱其強平穩。
Weak stationarity: A time series {} is said to be weakly (second-order, or co-variance) stationary if:
① the mean function is constant over time, and
② γ(t, t − k) = γ(0, k) for all times t and lags k.
弱平穩過程:當①均值函數是常數函數且②協方差函數僅與時間差相關,我們才稱其為弱平穩。
此時我們轉到第二個問題:Why weak stationary?(為何弱平穩?)
我們先來說說兩種平穩的差別:
兩種平穩過程並沒有包含關系,即弱平穩不一定是強平穩,強平穩也不一定是弱平穩。
一方面,雖然看上去強平穩的要求好像比弱平穩強,但強平穩並不一定是弱平穩,因為其矩不一定存在。
例子:{}獨立服從柯西分布。{}是強平穩,但由於柯西分布期望與方差不存在,所以不是弱平穩。(之所以不存在是因為其並非絕對可積。)
另一方面,弱平穩也不一定是強平穩,因為二階矩性質並不能確定分布的性質。
例子:,,互相獨立。這是弱平穩卻不是強平穩。
知道了這些造成差別的根本原因後,我們也可以寫出兩者的一些聯系:
一階矩和二階矩存在時,強平穩過程是弱平穩過程。(條件可簡化為二階矩存在,因為)
當聯合分布服從多元正態分布時,兩平穩過程等價。(多元正態分布的二階矩可確定分布性質)
而為什麼用弱平穩而非強平穩,主要原因是:強平穩條件太強,無論是從理論上還是實際上。
理論上,證明一個時間序列是強平穩的一般很難。正如定義所說,我們要比較,對於所有可能的n,所有可能的,, · · · , 和所有可能的k,當,, · · ·,的聯合分布與,, · · · ,相同。當分布很復雜的時候,不僅很難比較所有可能性,也可能很難寫出其聯合分布函數。
實際上,對於數據,我們也只能估算出它們均值和二階矩,我們沒法知道它們的分布。所以我們在以後的模型構建和預測上都是在用ACF,這些性質都和弱項和性質有關。而且,教我時間序列教授說過:"General linear process(weak stationarity, linearity, causality) covers about 10% of the real data." ,如果考慮的是強平穩,我覺得可能連5%都沒有了。
對第二個問題:
教授有天在審本科畢業論文,看到一個寫金融的,用平穩時間序列去估計股票走勢(真不知這老兄怎麼想的)。當時教授就說:「金融領域很多東西之所以難以估計,就是因為其經常突變,根本就不是平穩的。」
果不其然,論文最後實踐階段,對於股票選擇的正確率在40%。連期望50%都不到(任意一點以後要麼漲要麼跌)。
㈦ Holt Winter 指數平滑模型
移動平均模型在解決時間序列問題上簡單有效,但它們的計算比較難,因為不能通過之前的計算結果推算出加權移動平均值。此外,移動平均法不能很好的處理數據集邊緣的數據變化,也不能應用於現有數據集的范圍之外。因此,移動平均法的預測效果相對較差。
指數平滑法(exponential smoothing)是一種簡單的計算方案,可以有效的避免上述問題。按照模型參數的不同,指數平滑的形式可以分為一次指數平滑法、二次指數平滑法、三次指數平滑法。其中一次指數平滑法針對沒有趨勢和季節性的序列,二次指數平滑法針對有趨勢但是沒有季節特性的時間序列,三次指數平滑法則可以預測具有趨勢和季節性的時間序列。術語「Holt-Winter」指的是三次指數平滑。
Holt-Winter指數平滑法按照季節性分量的計算方式不同,可以分為累加式季節性分量和累乘式季節性分量。兩種不同的分量對應的時間序列計算等式和預測公式均不同,稍後我們會詳細介紹。
指數平滑法是一種結合當前信息和過去信息的方法,新舊信息的權重由一個可調整的參數控制,各種變形的區別之處在於其「混合」的過去信息量的多少和參數的個數。
常見的有單指數平滑、雙指數平滑。它們都只有一個加權因子,但是雙指數平滑使用相同的參數將但指數平滑進行兩次,適用於有線性趨勢的序列。單指數平滑實質上就是自適應預期模型,適用於序列值在一個常數均值上下隨機波動的情況,無趨勢及季節要素的情況,單指數平滑的預測對所有未來的觀測值都是常數。
一次指數平滑的遞推關系公式:
其中,s_i是第i步經過平滑的值,x_i是這個時間的實際數據。alpha是加權因子,取值范圍為[0,1],它控制著新舊信息之間的權重平衡。當alpha接近1時,我們就只保留當前數據點(即完全沒有對序列做平滑操作),當alpha接近0時,我們只保留前面的平滑值,整個曲線是一條水平的直線。在該方法中,越早的平滑值作用越小,從這個角度看,指數平滑法像擁有無限記憶且權值呈指數級遞減的移動平均法。
一次指數平滑法的預測公式為:
因此,一次指數平滑法得到的預測結果在任何時候都是一條直線。並不適合於具有總體趨勢的時間序列,如果用來處理有總體趨勢的序列,平滑值將滯後於原始數據,除非alpha的值非常接近1,但這樣使得序列不夠平滑。
二次指數平滑法保留了平滑信息和趨勢信息,使得模型可以預測具有趨勢的時間序列。二次指數平滑法有兩個等式和兩個參數:
t_i代表平滑後的趨勢,當前趨勢的未平滑值是當前平滑值s_i和上一個平滑值s_{i-1}的差。s_i為當前平滑值,是在一次指數平滑基礎上加入了上一步的趨勢信息t_{i-1}。利用這種方法做預測,就取最後的平滑值,然後每增加一個時間步長,就在該平滑值上增加一個t_{i}:
在計算的形式上這種方法與三次指數平滑法類似,因此,二次指數平滑法也被稱為無季節性的Holt-Winter平滑法。
三次指數平滑法相比二次指數平滑,增加了第三個量來描述季節性。累加式季節性對應的等式為:
累乘式季節性對應的等式為:
其中p_i為周期性的分量,代表周期的長度。x_{i+h}為模型預測的等式。
參考文獻:
[1] 時間序列挖掘-預測演算法-三次指數平滑法(Holt-Winters). http://www.dataguru.cn/article-3235-1.html.
[2] R語言與數據分析之九:時間內序列--HoltWinters指數平滑法 . http://blog.csdn.net/howardge/article/details/42076781.
[3] Holt-Winters原理和初始值的確定 . http://www.cnblogs.com/xuanlvshu/p/5451974.html.
㈧ HoltWinters模型為什麼有兩個版本
Holt-Winters分為加法模型和乘法模型。該方法與二次指數平滑法類似,但它可以同時修正時間序列數據的季節性和傾向性,因此,它可以用於對既有傾向性變動趨勢又有季節性變動的時間序列進行預測。