主要内容

使用深度学习时间序列预测

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

预测未来的值时间序列的步骤,你可以训练一个sequence-to-sequence回归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 = (dataTrain -μ)/团体;

准备预测和响应

预测未来时间的步骤序列的值,指定的训练序列的响应值由一个时间步转移。也就是说,在每个时间步的输入序列,LSTM网络学习来预测下一个时间步的价值。预测是没有最后的时间步长训练序列。

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

定义LSTM网络体系结构

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

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

指定培训选项。将解算器“亚当”和培训250时代。防止爆炸的梯度,梯度阈值设置为1。指定初始学习率0.005,和学习速率下降后125时代乘以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 =(人数(μ)/团体;XTest = dataTestStandardized (1: end-1);

初始化网络状态,首先对训练数据预测XTrain。接下来,让第一个预测使用最后一个时间步的训练反应YTrain(结束)。循环剩余的预测和输入之前的预测predictAndUpdateState

对于大型数据集合,长序列,或大型网络,预测在GPU上通常比预期更快的计算CPU。否则,预测在CPU上通常是更快的计算。一步预测单次使用CPU。预测使用的CPU,设置“ExecutionEnvironment”选择predictAndUpdateState“cpu”

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

Unstandardize预测使用前面计算的参数。

YPred =团体* YPred +μ;

培训情节进展报告均方根误差(RMSE)从标准化的数据计算。计算的RMSE unstandardized预测。

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

情节的培训时间序列预测的值。

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

比较测试数据的预测价值。

图次要情节(2,1,1)情节(欧美)情节(YPred“。”)举行传奇([“观察”“预测”])ylabel (“案例”)标题(“预测”次要情节(2,1,2)干细胞(YPred -欧美)包含(“月”)ylabel (“错误”)标题(" RMSE = "+ rmse)

更新网络状态与观测值

如果你有访问时间的实际值预测之间的步骤,你可以更新网络状态与观测值的预测值。

首先,初始化网络状态。在一个新的序列进行预测,重置网络状态使用resetState。重置网络状态阻止先前的预测影响预测新数据。重置网络状态,然后初始化网络状态由训练数据的预测。

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

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

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

Unstandardize预测使用前面计算的参数。

YPred =团体* YPred +μ;

计算均方根误差(RMSE)。

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

比较测试数据的预测价值。

图次要情节(2,1,1)情节(欧美)情节(YPred“。”)举行传奇([“观察”“预测”])ylabel (“案例”)标题(“与更新预测”次要情节(2,1,2)干细胞(YPred -欧美)包含(“月”)ylabel (“错误”)标题(" RMSE = "+ rmse)

这里的预测更准确的更新网络状态时观察到的值而不是预测的值。

另请参阅

|||

相关的话题