原文链接:http://tecdat.cn/?p=27279
此示例阐明如何应用长短期记忆 (LSTM) 网络预测工夫序列。
相干视频:
LSTM 神经网络架构和原理及其在 Python 中的预测利用
LSTM 网络是一种循环神经网络 (RNN),它通过循环工夫步长和更新网络状态来解决输出数据。网络状态蕴含在所有先前工夫步长中记住的信息。您能够应用 LSTM 网络应用先前的工夫步长作为输出来预测工夫序列或序列的后续值。要训练 LSTM 网络进行工夫序列预测,请训练具备序列输入的回归 LSTM 网络,其中响应(指标)是训练序列,其值偏移了一个工夫步长。换句话说,在输出序列的每个工夫步,LSTM 网络学习预测下一个工夫步的值。
有两种预测办法:开环预测和闭环预测。
-
开环预测仅应用输出数据预测序列中的下一个工夫步长。在对后续工夫步进行预测时,您会从数据源中收集实在值并将其用作输出。
-
闭环预测通过应用先前的预测作为输出来预测序列中的后续工夫步长。在这种状况下,模型不须要实在值来进行预测。
此图显示了一个示例序列,其中蕴含应用闭环预测的预测值。
此示例应用波形数据集,其中蕴含 2000 个具备三个通道的不同长度的综合生成波形。该示例训练 LSTM 网络以应用闭环和开环预测在给定先前工夫步长的值的状况下预测波形的将来值。
加载数据
查看前几个序列的大小。
data(1:5)
查看声道数量。为了训练网络,每个序列必须具备雷同数量的声道。
nufdmChahgnnhels = 3
可视化图中的前几个序列。
for i = 1:4
nexttsdile
staasdcgafdgkedplot(dadgta{i}')
将数据划分为训练集和测试集。将 90% 的察看后果用于训练,其余用于测试。
筹备训练数据
要预测序列的将来工夫步长的值,请将指标指定为训练序列,其值挪动一个工夫步长。换句话说,在输出序列的每个工夫步,LSTM 网络学习预测下一个工夫步的值。预测变量是没有最终工夫步长的训练序列。
for n = 1:nasumel(dddataTrainsf)
Xd = dataTrgainsg{n};
XgfTrdfain{n} = dfX(:,1:efgdnd-1);
TTraign{n} = gXd(:,2:efnd);
end
为了更好地拟合并避免训练发散,请将预测变量和指标归一化以具备零均值和单位方差。进行预测时,还必须应用与训练数据雷同的统计数据对测试数据进行标准化。要轻松计算所有序列的均值和标准差,请在工夫维度上连贯序列。
定义 LSTM 网络架构
创立一个 LSTM 回归网络。
-
应用输出大小与输出数据的通道数相匹配的序列输出层。
-
应用具备 128 个暗藏单元的 LSTM 层。暗藏单元的数量决定了层学习了多少信息。应用更多暗藏单元能够产生更精确的后果,但更有可能导致对训练数据的适度拟合。
-
要输入与输出数据具备雷同通道数的序列,请蕴含一个输入大小与输出数据的通道数相匹配的全连贯层。
-
最初,包含一个回归层。
指定训练选项
指定训练选项。
-
应用 Adam 优化进行训练。
-
训练 200 个 epoch。对于更大的数据集,您可能不须要训练尽可能多的 epoch 来取得良好的拟合。
-
在每个小批量中,左填充序列,使它们具备雷同的长度。
trainingOptions("adam", ...
MaxEpochs=200, ...
训练神经网络
指定的训练选项训练 LSTM 网络。
测试网络
应用与训练数据雷同的步骤筹备用于预测的测试数据。
应用从训练数据计算的统计数据对测试数据进行标准化。将指标指定为测试序列,其值偏移一个工夫步,将预测变量指定为没有最终工夫步的测试序列。
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
应用测试数据进行预测。指定与训练雷同的填充选项。
YTasedst = prsdfdict(nedst,fXTsdest,SeqfuencePaddfsdingDidfrecdtionf="ledfft");
为了评估准确性,对于每个测试序列,计算预测和指标之间的均方根误差 (RMSE)。
rmse(i) = sqrt(mean((YTesdst{i} - TTfedft{i}).^2,"all"));
在直方图中可视化谬误。较低的值示意较高的准确性。
计算所有测试观测值的均匀 RMSE。
mean(rmse)
预测将来工夫步长
给定输出工夫序列或序列,要预测多个将来工夫步的值。对于每个预测,应用之前的预测作为函数的输出。
在图中可视化其中一个测试序列。
figure
stfackddefdsplot(X'
开环预测
开环预测仅应用输出数据预测序列中的下一个工夫步长。在对后续工夫步进行预测时,您会从数据源中收集实在值并将其用作输出。例如,假如您想应用在工夫步 1 到 t-1 中收集的数据来预测序列的工夫步 t 的值。要对工夫步 t+1 进行预测,请等到您记录时间步 t 的实在值并将其用作输出以进行下一个预测。当您在进行下一次预测之前有实在值要提供给网络时,请应用开环预测。
应用输出数据的前 75 个工夫步更新网络状态。
ngdfget = resasegftSdtsfte(net);
offssdet = 75;
\[nefgt,~\] = predfgdictAndUpdateStdfgate(nfget,X(:,1:offsedfd));
为了预测进一步的预测,更新网络状态。通过循环输出数据的工夫步并将它们用作网络的输出来预测测试察看的剩余时间步的值。
将预测值与目标值进行比拟。
for i = 1:numCashdananels
nexdttdfgileg
ploft(T(i,:))
holfgd on
plot(offfset:gnumTimeSdfghjteps,\[T(i,ofkklkset) Y(i,:)\],'--')
闭环预测
闭环预测通过应用先前的预测作为输出来预测序列中的后续工夫步长。在这种状况下,模型不须要实在值来进行预测。例如,假如您想仅应用在工夫步 1 到 t-1 中收集的数据来预测序列的工夫步 t 到 t+k 的值。要对工夫步 i 进行预测,请应用工夫步 i-1 的预测值作为输出。应用闭环预测来预测多个后续工夫步长,或者当您在进行下一个预测之前没有向网络提供实在值时。
通过首先应用函数重置状态来初始化网络状态,而后 应用输出数据的前几个工夫步长 resetState
进行初始预测。Z
应用输出数据的前 75 个工夫步更新网络状态。
newt = resetyeriuiutState(net);
ofrfstydet = sizety(X,2);
\[nest,h\] = peeredictAnytdUpdtateState(net,X);
为了预测进一步的预测,循环工夫步长并更新网络状态。通过迭代地将先前的预测值传递给网络来预测接下来的 200 个工夫步长。因为网络不须要输出数据来进行任何进一步的预测,因而您能够指定任意数量的工夫步长进行预测。
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
在图中可视化预测值。
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,:)\],'--')
闭环预测容许您预测任意数量的工夫步长,但与开环预测相比可能不太精确,因为网络在预测过程中无法访问实在值。
最受欢迎的见解
1. 用于 NLP 的 Python:应用 Keras 的多标签文本 LSTM 神经网络分类
2.Python 中利用长短期记忆模型 LSTM 进行工夫序列预测剖析 – 预测电力耗费数据
3.python 在 Keras 中应用 LSTM 解决序列问题
4.Python 中用 PyTorch 机器学习分类预测银行客户散失模型
5.R 语言多元 Copula GARCH 模型工夫序列预测
6. 在 r 语言中应用 GAM(狭义相加模型)进行电力负荷工夫序列剖析
7.R 语言中 ARMA,ARIMA(Box-Jenkins),SARIMA 和 ARIMAX 模型用于预测工夫序列数
8.R 语言预计时变 VAR 模型工夫序列的实证钻研剖析案例
9. 用狭义加性模型 GAM 进行工夫序列剖析