使用深度学习时间序列预测
这个例子展示了如何使用很长一段时间序列数据预测短期记忆(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)
这里的预测更准确的更新网络状态时观察到的值而不是预测的值。
另请参阅
lstmLayer
|sequenceInputLayer
|trainingOptions
|trainNetwork