主要内容

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

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

为了预测序列未来的时间步长的值,可以训练一个序列到序列的回归LSTM网络,其中的响应是值移动了一个时间步长的训练序列。即在输入序列的每一个时间步上,LSTM网络学习预测下一个时间步的值。

若要预测未来多个时间步长的值,请使用predictAndUpdateState函数预测时间步,并在每次预测时更新网络状态。

本例使用数据集chickenpox_dataset.该示例训练LSTM网络,根据前几个月的病例数预测水痘病例数。

加载序列数据

加载示例数据。chickenpox_dataset包含单个时间序列,时间步长对应于月份,值对应于案例数量。输出是一个单元格数组,其中每个元素是单个时间步长。将数据重塑为行向量。

数据= chickenpox_dataset;数据=({}):数据;图绘制(数据)包含(“月”) ylabel (“案例”)标题(“每月水痘个案”

分割训练和测试数据。训练前90%的内容,测试后10%的内容。

地板numTimeStepsTrain =(0.9 *元素个数(数据);dataTrain =数据(1:numTimeStepsTrain + 1);人数(=数据(numTimeStepsTrain + 1:结束);

标准化数据

为了更好的拟合和防止训练发散,将训练数据标准化为均值和单位方差为零。在预测时,您必须使用与训练数据相同的参数对测试数据进行标准化。

μ=意味着(dataTrain);sig =性病(dataTrain);dataTrainStandardized = (datatrainmu) / sig;

准备预测和回应

为了预测序列的未来时间步长的值,将响应指定为值移了一个时间步长的训练序列。即在输入序列的每一个时间步上,LSTM网络学习预测下一个时间步的值。预测器是没有最终时间步长的训练序列。

XTrain = dataTrainStandardized (1: end-1);YTrain = dataTrainStandardized(2:结束);

定义LSTM网络架构

创建一个LSTM回归网络。指定LSTM层有200个隐藏单元。

numFeatures = 1;numResponses = 1;numHiddenUnits = 200;层= [...sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) fullconnectedlayer (numResponses) regressionLayer];

指定培训选项。将求解器设置为“亚当”为250个时代而训练。为了防止梯度爆炸,设置梯度阈值为1。指定初始学习速率为0.005,并将125个epoch之后的学习速率乘以0.2倍来降低。

选择= trainingOptions (“亚当”...“MaxEpochs”, 250,...“GradientThreshold”, 1...“InitialLearnRate”, 0.005,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”, 125,...“LearnRateDropFactor”, 0.2,...“详细”0,...“阴谋”“训练进步”);

火车LSTM网络

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

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

预测未来时间步长

若要预测未来多个时间步长的值,请使用predictAndUpdateState函数预测时间步,并在每次预测时更新网络状态。对于每个预测,使用前面的预测作为函数的输入。

使用与训练数据相同的参数对测试数据进行标准化。

dataTestStandardized = (dataTest - mu) / sig;XTest = dataTestStandardized (1: end-1);

为了初始化网络状态,首先对训练数据进行预测XTrain.接下来,使用训练响应的最后一个时间步骤进行第一个预测YTrain(结束).循环剩余的预测,并输入之前的预测predictAndUpdateState

对于大数据集合、长序列或大型网络,GPU上的预测通常比CPU上的预测计算速度更快。否则,CPU上的预测通常计算起来更快。对于单时间步预测,使用CPU。要使用CPU进行预测,请设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

网= predictAndUpdateState(净,XTrain);[净,YPred] = predictAndUpdateState(净,YTrain(结束));numTimeStepsTest =元素个数(XTest);i = 2:numTimeStepsTest [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数取消预测的标准化。

YPred = sig*YPred + mu;

训练进度图报告了从标准化数据计算出的均方根误差(RMSE)。从非标准化的预测计算均方根误差。

欧美=人数((2:结束);rmse =√意味着(YPred-YTest)。^ 2))
rmse =248.5531

用预测值绘制训练时间序列。

图绘制(dataTrain (1: end-1))idx = numTimeStepsTrain:(numTimeStepsTrain + numTimeStepsTest);情节(idx (numTimeStepsTrain) YPred][数据,“。”)举行包含(“月”) ylabel (“案例”)标题(“预测”)传说([“观察”“预测”])

将预测值与试验数据进行比较。

图subplot(2,1,1) plot(YTest) hold情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“预测”) subplot(2,1,2) stem(YPred - YTest) xlabel()“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)

用观测值更新网络状态

如果您能够访问预测之间的时间步长的实际值,那么您就可以用观测值而不是预测值来更新网络状态。

首先,初始化网络状态。要对新序列进行预测,请使用resetState.重置网络状态可以防止以前的预测影响对新数据的预测。重新设定网络状态,然后通过对训练数据的预测来初始化网络状态。

网= resetState(净);网= predictAndUpdateState(净,XTrain);

预测每一个时间步。对于每个预测,使用前一个时间步的观测值预测下一个时间步。设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

YPred = [];numTimeStepsTest =元素个数(XTest);i = 1: numtimestestest [net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),“ExecutionEnvironment”“cpu”);结束

使用前面计算的参数取消预测的标准化。

YPred = sig*YPred + mu;

计算均方根误差(RMSE)。

rmse =√意味着(YPred-YTest)。^ 2))
rmse = 158.0959

将预测值与试验数据进行比较。

图subplot(2,1,1) plot(YTest) hold情节(YPred“。”)举行传奇([“观察”“预测”]) ylabel (“案例”)标题(“与更新预测”) subplot(2,1,2) stem(YPred - YTest) xlabel()“月”) ylabel (“错误”)标题(" RMSE = "+ rmse)

在这里,用观测值更新网络状态比用预测值更新网络状态更准确。

另请参阅

|||

相关的话题