Matlab用深度學(xué)習(xí)循環(huán)神經(jīng)網(wǎng)絡(luò)RNN長(zhǎng)短期記憶LSTM進(jìn)行波形時(shí)間序列數(shù)據(jù)預(yù)測(cè)
原文鏈接:http://tecdat.cn/?p=27279?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
此示例說明如何使用長(zhǎng)短期記憶 (LSTM) 網(wǎng)絡(luò)預(yù)測(cè)時(shí)間序列。
相關(guān)視頻:?
LSTM神經(jīng)網(wǎng)絡(luò)架構(gòu)和原理及其在Python中的預(yù)測(cè)應(yīng)用
LSTM 網(wǎng)絡(luò)是一種循環(huán)神經(jīng)網(wǎng)絡(luò) (RNN),它通過循環(huán)時(shí)間步長(zhǎng)和更新網(wǎng)絡(luò)狀態(tài)來處理輸入數(shù)據(jù)。網(wǎng)絡(luò)狀態(tài)包含在所有先前時(shí)間步長(zhǎng)中記住的信息。您可以使用 LSTM 網(wǎng)絡(luò)使用先前的時(shí)間步長(zhǎng)作為輸入來預(yù)測(cè)時(shí)間序列或序列的后續(xù)值。要訓(xùn)練 LSTM 網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè),請(qǐng)訓(xùn)練具有序列輸出的回歸 LSTM 網(wǎng)絡(luò),其中響應(yīng)(目標(biāo))是訓(xùn)練序列,其值偏移了一個(gè)時(shí)間步長(zhǎng)。換句話說,在輸入序列的每個(gè)時(shí)間步,LSTM 網(wǎng)絡(luò)學(xué)習(xí)預(yù)測(cè)下一個(gè)時(shí)間步的值。
有兩種預(yù)測(cè)方法:開環(huán)預(yù)測(cè)和閉環(huán)預(yù)測(cè)。
開環(huán)預(yù)測(cè)僅使用輸入數(shù)據(jù)預(yù)測(cè)序列中的下一個(gè)時(shí)間步長(zhǎng)。在對(duì)后續(xù)時(shí)間步進(jìn)行預(yù)測(cè)時(shí),您會(huì)從數(shù)據(jù)源中收集真實(shí)值并將其用作輸入。
閉環(huán)預(yù)測(cè)通過使用先前的預(yù)測(cè)作為輸入來預(yù)測(cè)序列中的后續(xù)時(shí)間步長(zhǎng)。在這種情況下,模型不需要真實(shí)值來進(jìn)行預(yù)測(cè)。
此圖顯示了一個(gè)示例序列,其中包含使用閉環(huán)預(yù)測(cè)的預(yù)測(cè)值。

此示例使用波形數(shù)據(jù)集,其中包含 2000 個(gè)具有三個(gè)通道的不同長(zhǎng)度的綜合生成波形。該示例訓(xùn)練 LSTM 網(wǎng)絡(luò)以使用閉環(huán)和開環(huán)預(yù)測(cè)在給定先前時(shí)間步長(zhǎng)的值的情況下預(yù)測(cè)波形的未來值。
加載數(shù)據(jù)
查看前幾個(gè)序列的大小。
data(1:5)

查看聲道數(shù)量。為了訓(xùn)練網(wǎng)絡(luò),每個(gè)序列必須具有相同數(shù)量的聲道。
nufdmChahgnnhels = 3
可視化圖中的前幾個(gè)序列。
for i = 1:4
nexttsdile
staasdcgafdgkedplot(dadgta{i}')

將數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集。將 90% 的觀察結(jié)果用于訓(xùn)練,其余用于測(cè)試。
準(zhǔn)備訓(xùn)練數(shù)據(jù)
要預(yù)測(cè)序列的未來時(shí)間步長(zhǎng)的值,請(qǐng)將目標(biāo)指定為訓(xùn)練序列,其值移動(dòng)一個(gè)時(shí)間步長(zhǎng)。換句話說,在輸入序列的每個(gè)時(shí)間步,LSTM 網(wǎng)絡(luò)學(xué)習(xí)預(yù)測(cè)下一個(gè)時(shí)間步的值。預(yù)測(cè)變量是沒有最終時(shí)間步長(zhǎng)的訓(xùn)練序列。
for n = 1:nasumel(dddataTrainsf)
Xd = dataTrgainsg{n};
XgfTrdfain{n} = dfX(:,1:efgdnd-1);
TTraign{n} = gXd(:,2:efnd);
end
為了更好地?cái)M合并防止訓(xùn)練發(fā)散,請(qǐng)將預(yù)測(cè)變量和目標(biāo)歸一化以具有零均值和單位方差。進(jìn)行預(yù)測(cè)時(shí),還必須使用與訓(xùn)練數(shù)據(jù)相同的統(tǒng)計(jì)數(shù)據(jù)對(duì)測(cè)試數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。要輕松計(jì)算所有序列的均值和標(biāo)準(zhǔn)差,請(qǐng)?jiān)跁r(shí)間維度上連接序列。
定義 LSTM 網(wǎng)絡(luò)架構(gòu)
創(chuàng)建一個(gè) LSTM 回歸網(wǎng)絡(luò)。
使用輸入大小與輸入數(shù)據(jù)的通道數(shù)相匹配的序列輸入層。
使用具有 128 個(gè)隱藏單元的 LSTM 層。隱藏單元的數(shù)量決定了層學(xué)習(xí)了多少信息。使用更多隱藏單元可以產(chǎn)生更準(zhǔn)確的結(jié)果,但更有可能導(dǎo)致對(duì)訓(xùn)練數(shù)據(jù)的過度擬合。
要輸出與輸入數(shù)據(jù)具有相同通道數(shù)的序列,請(qǐng)包含一個(gè)輸出大小與輸入數(shù)據(jù)的通道數(shù)相匹配的全連接層。
最后,包括一個(gè)回歸層。
指定訓(xùn)練選項(xiàng)
指定訓(xùn)練選項(xiàng)。
使用 Adam 優(yōu)化進(jìn)行訓(xùn)練。
訓(xùn)練 200 個(gè) epoch。對(duì)于更大的數(shù)據(jù)集,您可能不需要訓(xùn)練盡可能多的 epoch 來獲得良好的擬合。
在每個(gè)小批量中,左填充序列,使它們具有相同的長(zhǎng)度。
trainingOptions("adam", ...
MaxEpochs=200, ...
訓(xùn)練神經(jīng)網(wǎng)絡(luò)
指定的訓(xùn)練選項(xiàng)訓(xùn)練 LSTM 網(wǎng)絡(luò)?。

測(cè)試網(wǎng)絡(luò)
使用與訓(xùn)練數(shù)據(jù)相同的步驟準(zhǔn)備用于預(yù)測(cè)的測(cè)試數(shù)據(jù)。
使用從訓(xùn)練數(shù)據(jù)計(jì)算的統(tǒng)計(jì)數(shù)據(jù)對(duì)測(cè)試數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。將目標(biāo)指定為測(cè)試序列,其值偏移一個(gè)時(shí)間步,將預(yù)測(cè)變量指定為沒有最終時(shí)間步的測(cè)試序列。
for n = 1:sifze(dsdatagsdTest,1)
Xsdg = datsdagesdt{n};
XTdsgsst{n} = (Xd(:,1:dend-1) - muX) ./ sdgdigmaX;
TTedgst{n} = (X(:,2:enddg) - muT) ./ sisggaT;
end
使用測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)。指定與訓(xùn)練相同的填充選項(xiàng)。
YTasedst = prsdfdict(nedst,fXTsdest,SeqfuencePaddfsdingDidfrecdtionf="ledfft");
為了評(píng)估準(zhǔn)確性,對(duì)于每個(gè)測(cè)試序列,計(jì)算預(yù)測(cè)和目標(biāo)之間的均方根誤差 (RMSE)。
? ?rmse(i) = sqrt(mean((YTesdst{i} - TTfedft{i}).^2,"all"));
在直方圖中可視化錯(cuò)誤。較低的值表示較高的準(zhǔn)確性。

計(jì)算所有測(cè)試觀測(cè)值的平均 RMSE。
mean(rmse)

預(yù)測(cè)未來時(shí)間步長(zhǎng)
給定輸入時(shí)間序列或序列,要預(yù)測(cè)多個(gè)未來時(shí)間步的值。對(duì)于每個(gè)預(yù)測(cè),使用之前的預(yù)測(cè)作為函數(shù)的輸入。
在圖中可視化其中一個(gè)測(cè)試序列。
figure
stfackddefdsplot(X'

開環(huán)預(yù)測(cè)
開環(huán)預(yù)測(cè)僅使用輸入數(shù)據(jù)預(yù)測(cè)序列中的下一個(gè)時(shí)間步長(zhǎng)。在對(duì)后續(xù)時(shí)間步進(jìn)行預(yù)測(cè)時(shí),您會(huì)從數(shù)據(jù)源中收集真實(shí)值并將其用作輸入。例如,假設(shè)您想使用在時(shí)間步 1 到 t-1 中收集的數(shù)據(jù)來預(yù)測(cè)序列的時(shí)間步 t 的值。要對(duì)時(shí)間步 t+1 進(jìn)行預(yù)測(cè),請(qǐng)等到您記錄時(shí)間步 t 的真實(shí)值并將其用作輸入以進(jìn)行下一個(gè)預(yù)測(cè)。當(dāng)您在進(jìn)行下一次預(yù)測(cè)之前有真實(shí)值要提供給網(wǎng)絡(luò)時(shí),請(qǐng)使用開環(huán)預(yù)測(cè)。
使用輸入數(shù)據(jù)的前 75 個(gè)時(shí)間步更新網(wǎng)絡(luò)狀態(tài)。
ngdfget = resasegftSdtsfte(net);
offssdet = 75;
[nefgt,~] = predfgdictAndUpdateStdfgate(nfget,X(:,1:offsedfd));
為了預(yù)測(cè)進(jìn)一步的預(yù)測(cè),更新網(wǎng)絡(luò)狀態(tài)。通過循環(huán)輸入數(shù)據(jù)的時(shí)間步并將它們用作網(wǎng)絡(luò)的輸入來預(yù)測(cè)測(cè)試觀察的剩余時(shí)間步的值。
將預(yù)測(cè)值與目標(biāo)值進(jìn)行比較。
for i = 1:numCashdananels
nexdttdfgileg
ploft(T(i,:))
holfgd on
plot(offfset:gnumTimeSdfghjteps,[T(i,ofkklkset) Y(i,:)],'--')

閉環(huán)預(yù)測(cè)
閉環(huán)預(yù)測(cè)通過使用先前的預(yù)測(cè)作為輸入來預(yù)測(cè)序列中的后續(xù)時(shí)間步長(zhǎng)。在這種情況下,模型不需要真實(shí)值來進(jìn)行預(yù)測(cè)。例如,假設(shè)您想僅使用在時(shí)間步 1 到 t-1 中收集的數(shù)據(jù)來預(yù)測(cè)序列的時(shí)間步 t 到 t+k 的值。要對(duì)時(shí)間步 i 進(jìn)行預(yù)測(cè),請(qǐng)使用時(shí)間步 i-1 的預(yù)測(cè)值作為輸入。使用閉環(huán)預(yù)測(cè)來預(yù)測(cè)多個(gè)后續(xù)時(shí)間步長(zhǎng),或者當(dāng)您在進(jìn)行下一個(gè)預(yù)測(cè)之前沒有向網(wǎng)絡(luò)提供真實(shí)值時(shí)。
通過首先使用函數(shù)重置狀態(tài)來初始化網(wǎng)絡(luò)狀態(tài)?,然后?使用輸入數(shù)據(jù)的前幾個(gè)時(shí)間步長(zhǎng)resetState
?進(jìn)行初始預(yù)測(cè)?。Z
使用輸入數(shù)據(jù)的前 75 個(gè)時(shí)間步更新網(wǎng)絡(luò)狀態(tài)。
newt = resetyeriuiutState(net);
ofrfstydet = sizety(X,2);
[nest,h] = peeredictAnytdUpdtateState(net,X);
為了預(yù)測(cè)進(jìn)一步的預(yù)測(cè),循環(huán)時(shí)間步長(zhǎng)并更新網(wǎng)絡(luò)狀態(tài)。通過迭代地將先前的預(yù)測(cè)值傳遞給網(wǎng)絡(luò)來預(yù)測(cè)接下來的 200 個(gè)時(shí)間步長(zhǎng)。由于網(wǎng)絡(luò)不需要輸入數(shù)據(jù)來進(jìn)行任何進(jìn)一步的預(yù)測(cè),因此您可以指定任意數(shù)量的時(shí)間步長(zhǎng)進(jìn)行預(yù)測(cè)。
numPreddshictihgonTimeshgSteps = 200;
dghXt = Z(:,endesrgs);
Ysf = zergfsos(sfgsnumChannels,numPrhedictionTimlhelhhjSteps);
for t = 1:numPredicthjjionlkjTimeSteps
[nexfdt,Y(:,t)] = predic'ltAndUpdatlkeStak;lte(net,Xt);
gXt = Y(:,t);
end
在圖中可視化預(yù)測(cè)值。
numTimdgegSteps = offset + numPralkjedicltionTimeSteps;
figure
t = tiledlayjout(numklChannels,1);
for i = 1:numChannselgs
nextgtilgfhe
plogghft(T(i,1:ogfhvset))
hobld bvon
plot(offsenbt:nmnumTimesbn,Stesdps,[T(i,a) Y(i,:)],'--')

閉環(huán)預(yù)測(cè)允許您預(yù)測(cè)任意數(shù)量的時(shí)間步長(zhǎng),但與開環(huán)預(yù)測(cè)相比可能不太準(zhǔn)確,因?yàn)榫W(wǎng)絡(luò)在預(yù)測(cè)過程中無法訪問真實(shí)值。

最受歡迎的見解
1.用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類
2.Python中利用長(zhǎng)短期記憶模型LSTM進(jìn)行時(shí)間序列預(yù)測(cè)分析 – 預(yù)測(cè)電力消耗數(shù)據(jù)
3.python在Keras中使用LSTM解決序列問題
4.Python中用PyTorch機(jī)器學(xué)習(xí)分類預(yù)測(cè)銀行客戶流失模型
5.R語(yǔ)言多元Copula GARCH 模型時(shí)間序列預(yù)測(cè)
6.在r語(yǔ)言中使用GAM(廣義相加模型)進(jìn)行電力負(fù)荷時(shí)間序列分析
7.R語(yǔ)言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于預(yù)測(cè)時(shí)間序列數(shù)
8.R語(yǔ)言估計(jì)時(shí)變VAR模型時(shí)間序列的實(shí)證研究分析案例
9.用廣義加性模型GAM進(jìn)行時(shí)間序列分析