使用深度学习时间序列预测
这个例子展示了如何使用很长一段时间序列数据预测短期记忆(LSTM)网络。
LSTM网络是一个递归神经网络(RNN)处理输入数据随着时间的推移,循环步骤和更新网络状态。网络状态包含信息记得以前所有的时间步骤。您可以使用一个LSTM网络预测后续值时间序列或序列作为输入使用以前的时间步骤。训练一个LSTM网络时间序列预测,与序列输出训练回归LSTM网络,响应(目标)的训练序列值由一个时间步转移。换句话说,在每个时间步的输入序列,LSTM网络学习来预测下一个时间步的价值。
有两种预测方法:开环和闭环预测。
开环预测预测下一个时间步长序列只使用输入数据。做预测随后的时间步长时,你从数据源收集真实的值,并使用这些作为输入。例如,假设你想预测时间步的值 序列在时间步骤1至步骤使用收集的数据 。为时间步做出预测 等到你记录时间步的真正价值 和使用,作为输入,使未来的预测。使用开环预测当你拥有真正的值提供网络之前下一个预测。
闭环预测预测随后的时间步骤序列通过使用先前的预测作为输入。在这种情况下,该模型不需要真正的值进行预测。例如,假设你想预测时间步的值 通过 的序列在时间步骤1至步骤使用收集的数据 只有。为时间步做出预测 ,用时间步的预测价值 作为输入。使用闭环预测预测多个后续步骤或当你没有真正的价值提供网络之前下一个预测。
这个图显示了一个示例使用闭环预测序列的预测价值。
下面的例子使用了波形数据集,其中包含2000综合生成的波形不同长度的三个频道。火车的例子一个LSTM网络预测未来值的波形值从之前的时间步骤使用闭环和开环预测。
加载数据
加载的数据的例子WaveformData.mat
。数据是一个numObservations
1单元阵列的组合,numObservations
是序列的数量。每个序列都是一个numChannels
——-numTimeSteps
数字数组,numChannels
频道的顺序和数量吗numTimeSteps
是时间序列的步骤数。
负载WaveformData
视图的大小头几个序列。
数据(1:5)
ans =5×1单元阵列{3×103双}{3×136双}{3×140双}{3×124双}{3×127双}
视图通道的数量。训练网络,每个序列必须有相同数量的渠道。
{1}numChannels =大小(数据,1)
numChannels = 3
可视化最初几个序列在一个阴谋。
图tiledlayout (2, 2)为i = 1:4 nexttile stackedplot({我}”)包含数据(“时间步”)结束
分区数据分为训练集和测试集。使用90%的观察训练和其余部分进行测试。
numObservations =元素个数(数据);idxTrain = 1:地板(0.9 * numObservations);idxTest =地板(0.9 * numObservations) + 1: numObservations;dataTrain =数据(idxTrain);人数(=数据(idxTest);
准备培训资料
预测未来时间的步骤序列的值,指定目标作为训练序列与由一个时间步长值转移。换句话说,在每个时间步的输入序列,LSTM网络学习来预测下一个时间步的价值。预测是没有最后的时间步长训练序列。
为n = 1:元素个数(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:元素个数(XTrain) XTrain {n} = (XTrain {n} - muX)。/ sigmaX;TTrain {n} = (TTrain {n} -傻瓜)。/ sigmaT;结束
定义LSTM网络体系结构
创建一个LSTM回归网络。
使用序列输入层和一个输入大小相匹配的渠道数量的输入数据。
使用一个LSTM隐藏层128单元。隐藏单位的数量决定了学到的信息层。使用更多的隐藏单元可以产生更精确的结果,但更有可能导致过度拟合训练数据。
与相同数量的渠道输出序列作为输入数据,包括一个完全连接层和一个输出大小相匹配的渠道数量的输入数据。
最后,包括回归层。
层= [sequenceInputLayer (numChannels) lstmLayer (128) fullyConnectedLayer (numChannels) regressionLayer];
指定培训选项
指定培训选项。
火车用亚当的优化。
火车200时代。对于更大的数据集,您可能不需要为尽可能多的火车时代一个不错的选择。
在每个mini-batch, left-pad序列有相同的长度。Left-padding阻止网络预测padding值的序列。
混乱的数据每一时代。
显示在一块训练进展。
禁用详细输出。
选择= trainingOptions (“亚当”,…MaxEpochs = 200,…SequencePaddingDirection =“左”,…洗牌=“every-epoch”,…情节=“训练进步”,…Verbose = 0);
训练神经网络
火车LSTM网络使用指定的培训使用的选项trainNetwork
函数。
网= trainNetwork (XTrain、TTrain层,选择);
测试网络
准备测试数据预测训练数据使用相同的步骤。
标准化测试数据使用训练数据的统计计算。指定的目标作为测试序列值转移一个时间步和预测没有最后一次的测试序列的一步。
为n = 1:规模(人数(1)X =人数({n};XTest {n} = (X (:, 1: end-1) - muX)。/ sigmaX;tt {n} = (X(:, 2:结束)——傻瓜)。/ sigmaT;结束
使用测试数据做出预测。相同的填充选项指定为培训。
欧美=预测(净、XTest SequencePaddingDirection =“左”);
评估的准确性,对于每个测试序列,计算均方误差(RMSE)之间的预测和目标。
为i = 1:尺寸(欧美,1)rmse (i) =√意味着(欧美{我}- tt{我})^ 2,。“所有”));结束
在一个柱状图可视化的错误。较低的值表明更大的准确性。
图直方图(rmse)包含(“RMSE”)ylabel (“频率”)
计算平均RMSE在所有测试观察。
(rmse)
ans =单0.5080
预测未来时间的步骤
给定一个输入时间序列或序列,预测未来值的多个步骤,使用predictAndUpdateState
时间预测函数一次一个步骤在每个预测和更新网络状态。对于每一个预测,使用前面的预测作为函数的输入。
想象一个测试序列的阴谋。
idx = 2;X = XTest {idx};T = tt {idx};图stackedplot (X ', DisplayLabels =“通道”+ (1:numChannels))包含(“时间步”)标题(“测试观察”+ idx)
开环预测
开环预测预测下一个时间步长序列只使用输入数据。时预测随后的时间步骤,收集真实的数据源,并使用这些值形式作为输入。例如,假设你想预测时间步的值 序列在时间步骤1至步骤使用收集的数据 。为时间步做出预测 等到你记录时间步的真正价值 和使用,作为输入,使未来的预测。使用开环预测当你拥有真正的值提供网络之前下一个预测。
初始化网络状态首先重置状态使用resetState
函数,然后使用前几次做一个初始预测步骤的输入数据。更新网络状态使用第一个75时间步的输入数据。
网= resetState(净);抵消= 75;(净,~)= predictAndUpdateState(净,X(:, 1:抵消));
随着时间的推移进一步预测预测,循环步骤和更新网络状态使用predictAndUpdateState
函数。预期值的剩余时间步骤测试观察循环的时间步骤输入数据,并使用它们作为网络的输入。第一个预测是时间步对应的值抵消+ 1
。
numTimeSteps =大小(X, 2);numPredictionTimeSteps = numTimeSteps -抵消;Y = 0 (numChannels numPredictionTimeSteps);为t = 1: numPredictionTimeSteps Xt = X(:,抵消+ t);(净,Y (:, t)) = predictAndUpdateState(净,Xt);结束
比较预测与目标的价值观。
图t = tiledlayout (numChannels, 1);标题(t)“开环预测”)为i = 1: numChannels nexttile情节(T(我,:))在情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”)ylabel (“通道”+ i)结束包含(“时间步”)nexttile(1)传说([“输入”“预测”])
闭环预测
闭环预测预测随后的时间步骤序列通过使用先前的预测作为输入。在这种情况下,该模型不需要真正的值进行预测。例如,假设你想预测时间步的值 通过 的序列在时间步骤1至步骤使用收集的数据 只有。为时间步做出预测 ,用时间步的预测价值 作为输入。使用闭环预测预测多个后续时间步骤或当你没有真值提供网络之前下一个预测。
初始化网络状态首先重置状态使用resetState
函数,然后做出一个初步的预测Z
使用前几次步骤的输入数据。更新网络状态使用第一个75时间步的输入数据。
网= resetState(净);抵消=大小(X, 2);[净,Z] = predictAndUpdateState(净,X);
随着时间的推移进一步预测预测,循环步骤和更新网络状态使用predictAndUpdateState
函数。预计接下来的200时间步迭代通过先前的预测价值网络。因为网络不需要输入数据进行任何进一步的预测,可以指定任意数量的时间预测的步骤。
numPredictionTimeSteps = 200;Xt = Z(:,结束);Y = 0 (numChannels numPredictionTimeSteps);为t = 1: numPredictionTimeSteps[净,Y (:, t)] = predictAndUpdateState(净,Xt);Xt = Y (:, t);结束
可视化预测的值在一个阴谋。
numTimeSteps = + numPredictionTimeSteps抵消;图t = tiledlayout (numChannels, 1);标题(t)“闭环预测”)为i = 1: numChannels nexttile情节(T(我,1:抵消)在情节(抵消:numTimeSteps [T(我,抵消)Y(我:)],“——”)ylabel (“通道”+ i)结束包含(“时间步”)nexttile(1)传说([“输入”“预测”])
闭环预测可以预测任意数量的时间步骤,但可以不准确开环预测相比,因为网络没有在预测过程中获得真正的价值。
另请参阅
trainNetwork
|trainingOptions
|lstmLayer
|sequenceInputLayer