主要内容

利用深度学习的时间序列预测

这个例子展示了如何使用长短期记忆(LSTM)网络预测时间序列数据。

LSTM网络是一种循环神经网络(RNN),它通过时间步循环和更新网络状态来处理输入数据。网络状态包含所有以前时间步骤中记住的信息。您可以使用LSTM网络以先前的时间步长作为输入来预测时间序列或序列的后续值。为了训练一个时间序列预测的LSTM网络,训练一个具有序列输出的回归LSTM网络,其中响应(目标)是值偏移一个时间步的训练序列。也就是说,在输入序列的每一个时间步中,LSTM网络学习预测下一个时间步的值。

预测方法有开环预测和闭环预测两种。

  • 开环预测仅使用输入数据预测序列中的下一个时间步骤。在对后续时间步骤进行预测时,从数据源收集真实值并将其用作输入。例如,假设您想预测时间步长的值 t 使用在时间步骤1中收集的数据的序列 t - 1 .对时间步长进行预测 t + 1 ,直到记录时间步长的真值 t 然后把它作为下一个预测的输入。在进行下一次预测之前,如果您有真实的值可以提供给网络,则使用开环预测。

  • 闭环预测使用先前的预测作为输入,预测序列中后续的时间步长。在这种情况下,模型不需要真实值来进行预测。例如,假设您想预测时间步长的值 t 通过 t + k 从第一步到第一步 t - 1 只有。对时间步长进行预测 ,用预测值作为时间步长 - 1 作为输入。使用闭环预测来预测多个后续时间步骤,或者在进行下一次预测之前没有真正的值提供给网络时。

该图显示了一个使用闭环预测的预测值的示例序列。

closedloop.png

本例使用波形数据集,其中包含2000个合成的三个通道的不同长度的波形。该示例训练一个LSTM网络,使用闭环和开环预测,在给定前一个时间步的值的情况下,预测波形的未来值。

加载数据

加载示例数据WaveformData.mat.数据是numObservations-by-1单元格序列数组,其中numObservations是序列的个数。每个序列都是numChannels——-numTimeSteps数字数组,numChannels序列的通道数和numTimeSteps是序列的时间步数。

负载WaveformData

查看前几个序列的大小。

数据(1:5)
ans =5×1单元阵列{3×103 double} {3×136 double} {3×140 double} {3×124 double} {3×127 double}

查看通道数。为了训练网络,每个序列必须有相同数量的通道。

{1} numChannels =大小(数据,1)
numChannels = 3

想象一个情节的前几个序列。

图tiledlayout (2, 2)I = 1:4 nexttile stackedplot(data{I}') xlabel(“时间步”结束

将数据划分为训练集和测试集。将90%的观察结果用于训练,其余用于测试。

numObservations =元素个数(数据);idxTrain = 1:地板(0.9 * numObservations);idxTest =地板(0.9 * numObservations) + 1: numObservations;dataTrain =数据(idxTrain);人数(=数据(idxTest);

为培训准备数据

为了预测序列未来时间步长的值,将目标指定为值移动一个时间步的训练序列。也就是说,在输入序列的每一个时间步中,LSTM网络学习预测下一个时间步的值。预测器是没有最后时间步的训练序列。

n = 1:numel(dataTrain) X = dataTrain{n};XTrain {n} = X (: 1: end-1);TTrain {n} = X(:, 2:结束);结束

为了更好地拟合和防止训练发散,将预测因子和目标归一化,使其均值和单位方差为零。在进行预测时,还必须使用与训练数据相同的统计数据对测试数据进行规范化。为了方便计算所有序列的平均值和标准偏差,在时间维度中连接序列。

muX =意味着(猫(XTrain {:}), 2);sigmaX =性病(猫(XTrain {:}), 0, 2);傻瓜=意味着(猫(TTrain {:}), 2);sigmaT =性病(猫(TTrain {:}), 0, 2);n = 1:numel(XTrain) XTrain{n} = (XTrain{n} - muX) ./ sigmaX;TTrain{n} = (TTrain{n} - muT) ./ sigmaT;结束

定义LSTM网络架构

创建LSTM回归网络。

  • 使用序列输入层,其输入大小与输入数据的通道数量相匹配。

  • 使用一个包含128个隐藏单位的LSTM层。隐藏单元的数量决定了层学习到多少信息。使用更多隐藏单元可以产生更精确的结果,但更可能导致训练数据的过拟合。

  • 要输出具有与输入数据相同通道数的序列,请包含一个输出大小与输入数据的通道数匹配的完全连接层。

  • 最后,包含一个回归层。

layers = [sequenceInputLayer(numChannels) lstmLayer(128) fulllyconnectedlayer (numChannels) regressionLayer];

指定培训选项

指定培训选项。

  • 使用Adam优化进行训练。

  • 训练200个时代。对于较大的数据集,您可能不需要训练那么多的时间来获得良好的拟合。

  • 在每个小批次中,左填充序列,使它们具有相同的长度。左填充阻止网络预测序列末端的填充值。

  • 每隔一个时代洗牌数据。

  • 以图表形式展示训练进度。

  • 禁用详细输出。

选择= trainingOptions (“亚当”...MaxEpochs = 200,...SequencePaddingDirection =“左”...洗牌=“every-epoch”...情节=“训练进步”...Verbose = 0);

训练神经网络

使用指定的训练选项训练LSTM网络trainNetwork函数。

网= trainNetwork (XTrain、TTrain层,选择);

测试网络

使用与训练数据相同的步骤为预测准备测试数据。

使用从训练数据计算出的统计数据规范化测试数据。指定目标为值移一个时间步的测试序列,预测器为不移最后一个时间步的测试序列。

n = 1:size(dataTest,1) X = dataTest{n};XTest{n} = (X(:,1:end-1) - muX) ./ sigmaX;TTest{n} = (X(:,2:end) - muT) ./ sigmaT;结束

利用测试数据进行预测。指定与训练相同的填充选项。

欧美=预测(净、XTest SequencePaddingDirection =“左”);

为了评估准确性,对于每个测试序列,计算预测和目标之间的均方根误差(RMSE)。

i = 1:尺寸(欧美,1)rmse (i) =√意味着(欧美{我}- tt{我})^ 2,。“所有”));结束

在直方图中可视化错误。数值越低,精确度越高。

图直方图(rmse)包含(“RMSE”) ylabel (“频率”

计算所有测试观测值的均方根误差。

(rmse)
ans =0.5080

预测未来时间步骤

给定一个输入时间序列或序列,要预测多个未来时间步的值,可以使用predictAndUpdateState函数每次预测一个时间步长,并在每次预测时更新网络状态。对于每个预测,使用之前的预测作为函数的输入。

在图中想象一个测试序列。

idx = 2;X = XTest {idx};T = tt {idx};图stackedplot (X ', DisplayLabels =“通道”+ (1: numChannels))包含(“时间步”)标题(“测试观察”+ idx)

开环预测

开环预测仅使用输入数据预测序列中的下一个时间步骤。在对后续时间步骤进行预测时,从数据源收集真实值并将其用作输入。例如,假设您想预测时间步长的值 t 使用在时间步骤1中收集的数据的序列 t - 1 .对时间步长进行预测 t + 1 ,直到记录时间步长的真值 t 然后把它作为下一个预测的输入。在进行下一次预测之前,如果您有真实的值可以提供给网络,则使用开环预测。

方法重置状态,从而初始化网络状态resetState函数,然后使用输入数据的前几个时间步进行初始预测。使用输入数据的前75个时间步更新网络状态。

网= resetState(净);抵消= 75;(净,~)= predictAndUpdateState(净,X(:, 1:抵消));

方法循环时间步骤并更新网络状态以预测进一步的预测predictAndUpdateState函数。通过循环输入数据的时间步长,并将其作为网络的输入,预测测试观测的剩余时间步长的值。第一个预测是对应于时间步长的值抵消+ 1

numTimeSteps =大小(X, 2);numPredictionTimeSteps = numTimeSteps - offset;Y = 0 (numChannels numPredictionTimeSteps);X = X(:,offset+t);(净,Y (:, t)) = predictAndUpdateState(净,Xt);结束

将预测值与目标值进行比较。

图t = tiledlayout(numChannels,1);标题(t)“开环预测”i = 1:numChannels nexttile plot(T(i,:))按住情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”) ylabel (“通道”+ i)结束包含(“时间步”) nexttile(1)传说([“输入”“预测”])

闭环预测

闭环预测使用先前的预测作为输入,预测序列中后续的时间步长。在这种情况下,模型不需要真实值来进行预测。例如,假设您想预测时间步长的值 t 通过 t + k 从第一步到第一步 t - 1 只有。对时间步长进行预测 ,用预测值作为时间步长 - 1 作为输入。使用闭环预测来预测多个后续时间步骤,或者在进行下一次预测之前没有真正的值可以提供给网络时。

方法重置状态,从而初始化网络状态resetState函数,然后进行初始预测Z使用输入数据的前几个时间步。使用输入数据的前75个时间步更新网络状态。

网= resetState(净);抵消=大小(X, 2);[净,Z] = predictAndUpdateState(净,X);

方法循环时间步骤并更新网络状态以预测进一步的预测predictAndUpdateState函数。通过迭代地将先前的预测值传递给网络来预测接下来的200个时间步。因为网络不需要输入数据来进行进一步的预测,所以可以指定任何数量的时间步数进行预测。

numPredictionTimeSteps = 200;Xt = Z(:,结束);Y = 0 (numChannels numPredictionTimeSteps);t = 1:numPredictionTimeSteps [net,Y(:,t)] = predictAndUpdateState(net,Xt);Xt = Y (:, t);结束

在图中可视化预测值。

numTimeSteps = offset + numPredictionTimeSteps;图t = tiledlayout(numChannels,1);标题(t)“闭环预测”i = 1:numChannels nexttile plot(T(i,1:offset))保持情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”) ylabel (“通道”+ i)结束包含(“时间步”) nexttile(1)传说([“输入”“预测”])

闭环预测允许您预测任意数量的时间步骤,但是与开环预测相比,由于网络在预测过程中无法访问真实值,所以预测的准确性可能会较低。

另请参阅

|||

相关的话题

Baidu
map