Python中利用LSTM模型进行时间序列预测分析
時(shí)間序列模型
時(shí)間序列預(yù)測分析就是利用過去一段時(shí)間內(nèi)某事件時(shí)間的特征來預(yù)測未來一段時(shí)間內(nèi)該事件的特征。這是一類相對(duì)比較復(fù)雜的預(yù)測建模問題,和回歸分析模型的預(yù)測不同,時(shí)間序列模型是依賴于事件發(fā)生的先后順序的,同樣大小的值改變順序后輸入模型產(chǎn)生的結(jié)果是不同的。
舉個(gè)栗子:根據(jù)過去兩年某股票的每天的股價(jià)數(shù)據(jù)推測之后一周的股價(jià)變化;根據(jù)過去2年某店鋪每周想消費(fèi)人數(shù)預(yù)測下周來店消費(fèi)的人數(shù)等等
RNN 和 LSTM 模型
時(shí)間序列模型最常用最強(qiáng)大的的工具就是遞歸神經(jīng)網(wǎng)絡(luò)(recurrent neural network, RNN)。相比與普通神經(jīng)網(wǎng)絡(luò)的各計(jì)算結(jié)果之間相互獨(dú)立的特點(diǎn),RNN的每一次隱含層的計(jì)算結(jié)果都與當(dāng)前輸入以及上一次的隱含層結(jié)果相關(guān)。通過這種方法,RNN的計(jì)算結(jié)果便具備了記憶之前幾次結(jié)果的特點(diǎn)。
典型的RNN網(wǎng)路結(jié)構(gòu)如下:
右側(cè)為計(jì)算時(shí)便于理解記憶而產(chǎn)開的結(jié)構(gòu)。簡單說,x為輸入層,o為輸出層,s為隱含層,而t指第幾次的計(jì)算;V,W,U為權(quán)重,其中計(jì)算第t次的隱含層狀態(tài)時(shí)為St = f(U*Xt + W*St-1),實(shí)現(xiàn)當(dāng)前輸入結(jié)果與之前的計(jì)算掛鉤的目的。對(duì)RNN想要更深入的了解可以戳這里。
RNN的局限:
由于RNN模型如果需要實(shí)現(xiàn)長期記憶的話需要將當(dāng)前的隱含態(tài)的計(jì)算與前n次的計(jì)算掛鉤,即St = f(U*Xt + W1*St-1 + W2*St-2 + ... + Wn*St-n),那樣的話計(jì)算量會(huì)呈指數(shù)式增長,導(dǎo)致模型訓(xùn)練的時(shí)間大幅增加,因此RNN模型一般直接用來進(jìn)行長期記憶計(jì)算。
LSTM模型
LSTM(Long Short-Term Memory)模型是一種RNN的變型,最早由Juergen Schmidhuber提出的。經(jīng)典的LSTM模型結(jié)構(gòu)如下:
LSTM的特點(diǎn)就是在RNN結(jié)構(gòu)以外添加了各層的閥門節(jié)點(diǎn)。閥門有3類:遺忘閥門(forget gate),輸入閥門(input gate)和輸出閥門(output gate)。這些閥門可以打開或關(guān)閉,用于將判斷模型網(wǎng)絡(luò)的記憶態(tài)(之前網(wǎng)絡(luò)的狀態(tài))在該層輸出的結(jié)果是否達(dá)到閾值從而加入到當(dāng)前該層的計(jì)算中。如圖中所示,閥門節(jié)點(diǎn)利用sigmoid函數(shù)將網(wǎng)絡(luò)的記憶態(tài)作為輸入計(jì)算;如果輸出結(jié)果達(dá)到閾值則將該閥門輸出與當(dāng)前層的的計(jì)算結(jié)果相乘作為下一層的輸入(PS:這里的相乘是在指矩陣中的逐元素相乘);如果沒有達(dá)到閾值則將該輸出結(jié)果遺忘掉。每一層包括閥門節(jié)點(diǎn)的權(quán)重都會(huì)在每一次模型反向傳播訓(xùn)練過程中更新。更具體的LSTM的判斷計(jì)算過程如下圖所示:
LSTM模型的記憶功能就是由這些閥門節(jié)點(diǎn)實(shí)現(xiàn)的。當(dāng)閥門打開的時(shí)候,前面模型的訓(xùn)練結(jié)果就會(huì)關(guān)聯(lián)到當(dāng)前的模型計(jì)算,而當(dāng)閥門關(guān)閉的時(shí)候之前的計(jì)算結(jié)果就不再影響當(dāng)前的計(jì)算。因此,通過調(diào)節(jié)閥門的開關(guān)我們就可以實(shí)現(xiàn)早期序列對(duì)最終結(jié)果的影響。而當(dāng)你不不希望之前結(jié)果對(duì)之后產(chǎn)生影響,比如自然語言處理中的開始分析新段落或新章節(jié),那么把閥門關(guān)掉即可。(對(duì)LSTM想要更具體的了解可以戳這里)
下圖具體演示了閥門是如何工作的:通過閥門控制使序列第1的輸入的變量影響到了序列第4,6的的變量計(jì)算結(jié)果。
黑色實(shí)心圓代表對(duì)該節(jié)點(diǎn)的計(jì)算結(jié)果輸出到下一層或下一次計(jì)算;空心圓則表示該節(jié)點(diǎn)的計(jì)算結(jié)果沒有輸入到網(wǎng)絡(luò)或者沒有從上一次收到信號(hào)。
Python中實(shí)現(xiàn)LSTM模型搭建
Python中有不少包可以直接調(diào)用來構(gòu)建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳這里)。這里我們選用keras。(PS:如果操作系統(tǒng)用的linux或者mac,強(qiáng)推Tensorflow!!!)
因?yàn)長STM神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練可以通過調(diào)整很多參數(shù)來優(yōu)化,例如activation函數(shù),LSTM層數(shù),輸入輸出的變量維度等,調(diào)節(jié)過程相當(dāng)復(fù)雜。這里只舉一個(gè)最簡單的應(yīng)用例子來描述LSTM的搭建過程。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Python中利用LSTM模型进行时间序列预测分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对于单输入多输出系统matlab,求助!
- 下一篇: Python 小白从零开始 PyQt5