拓端tecdat|R語言用LOESS(局部加權(quán)回歸)季節(jié)趨勢分解(STL)進(jìn)行時間序列異常檢測
原文鏈接:http://tecdat.cn/?p=22632?
原文出處:拓端數(shù)據(jù)部落公眾號
這篇文章描述了一種對涉及季節(jié)性和趨勢成分的時間序列的中點進(jìn)行建模的方法。我們將對一種叫做STL的算法進(jìn)行研究,STL是 "使用LOESS(局部加權(quán)回歸)的季節(jié)-趨勢分解 "的縮寫,以及如何將其應(yīng)用于異常檢測。
其基本思想是,如果你有一個有規(guī)律的時間序列,你可以通過STL算法運行該序列,并分離出規(guī)律的模式。剩下的是 "不規(guī)則的",而異常檢測相當(dāng)于判定不規(guī)則性是否足夠大。
例子:航空乘客,1949-1960
讓我們在數(shù)據(jù)集上運行該算法,該數(shù)據(jù)集給出了1949-1960年期間每月的航空公司乘客數(shù)量。首先,這是未經(jīng)修改的時間序列。
plot(y)

這里顯然有一個規(guī)律性的模式,但是在這個序列中沒有任何明顯的下降,無法在異常檢測中顯示出來。所以我們將設(shè)置一個。
?
y[40] = 150

跌幅足夠大,我們希望異常檢測能發(fā)現(xiàn)它,但又不至于大到你只看一眼圖就會發(fā)現(xiàn)?,F(xiàn)在讓我們通過STL檢查它。?
plot(fit)

首先,我不是在y上運行STL,而是在log(y)上。
該算法將序列分解為三個部分:季節(jié)性、趨勢和剩余成分。季節(jié)性是周期性成分,趨勢是一般的上升/下降,剩余成分是剩下的趨勢成分。季節(jié)性和趨勢共同構(gòu)成了序列的 "常規(guī) "部分,因此是我們在異常檢測過程中要剔除的部分。
剩余部分基本上是原始序列的正?;姹?,所以這是我們監(jiān)測異常情況的部分。剩余序列的下降是很明顯的。我們在1952年初設(shè)置的異常下降很可能算在內(nèi)。
我們還可以調(diào)整每一時期的觀測值數(shù)量,負(fù)責(zé)分離季節(jié)性和趨勢成分的平滑方法,擬合模型的 "穩(wěn)健性"(即對異常值不敏感)等等。這些參數(shù)中的大多數(shù)需要對基礎(chǔ)算法的工作原理有一定的了解。
下面是一些顯示實際數(shù)據(jù)與閾值的代碼。
data <- merge(df, ba, by.x='x')
ggplot(data) +
geom(aes(x=x, ymin=ymin, ymax=ymax))

再次,聰明如你可能會注意到通過exp()進(jìn)行的逆變換。我們現(xiàn)在討論這個問題。
為什么要進(jìn)行對數(shù)和逆變換?
并非所有的分解都涉及對數(shù)變換,但這個分解卻涉及。其原因與分解的性質(zhì)有關(guān)。STL的分解總是加法的。
y = s + t + r
但對于某些時間序列,乘法分解更適合。
y = str
這種情況發(fā)生在銷售數(shù)據(jù)中,季節(jié)性成分的振幅隨著趨勢的增加而增加。這實際上是乘法序列的標(biāo)志,航空旅客序列也表現(xiàn)出這種模式。為了處理這個問題,我們對原始值進(jìn)行對數(shù)轉(zhuǎn)換,這使我們進(jìn)入加法領(lǐng)域,在那里我們可以進(jìn)行STL分解。當(dāng)我們完成后,我們再進(jìn)行逆變換,回到原始序列。
多重季節(jié)性的情況如何?
一些時間序列有一個以上的季節(jié)性。例如,在酒店預(yù)訂時間序列有三個季節(jié)性:每日、每周和每年。
雖然有一些程序可以生成具有多個季節(jié)性成分的分解,但STL并沒有這樣做。最高頻率的季節(jié)性被作為季節(jié)性成分,而任何較低頻率的季節(jié)性都被吸收到趨勢中。

最受歡迎的見解
1.在python中使用lstm和pytorch進(jìn)行時間序列預(yù)測
2.python中利用長短期記憶模型lstm進(jìn)行時間序列預(yù)測分析
3.使用r語言進(jìn)行時間序列(arima,指數(shù)平滑)分析
4.r語言多元copula-garch-模型時間序列預(yù)測
5.r語言copulas和金融時間序列案例
6.使用r語言隨機波動模型sv處理時間序列中的隨機波動
7.r語言時間序列tar閾值自回歸模型
8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類
9.python3用arima模型進(jìn)行時間序列預(yù)測