主要内容

时间序列预测快速入门

此示例说明如何使用深度网络设计器创建一个简单的长短期记忆 (LSTM) 网络来预测时间序列数据。

LSTM 网络是一种循环神经网络 (RNN),它通过遍历时间步并更新 RNN 状态来处理输入数据。RNN 状态包含在所有先前时间步中记住的信息。您可以使用 LSTM 神经网络,通过将先前的时间步作为输入来预测时间序列或序列的后续值。

加载序列数据

WaveformData 加载示例数据。要访问此数据,请以实时脚本形式打开此示例。Waveform 数据集包含以合成方式生成的具有三个通道且具有不同长度的波形。此示例训练一个 LSTM 神经网络,根据先前时间步提供的值来预测波形的将来值。

load WaveformData

可视化一些序列。

idx = 1;
numChannels = size(data{idx},2);

figure
stackedplot(data{idx},DisplayLabels="Channel " + (1:numChannels))

对于此示例,请使用辅助函数 prepareForecastingData,该函数作为支持文件包含在此示例中,用于准备训练数据。该函数使用以下步骤准备数据:

  1. 要预测序列在将来时间步的值,请将目标指定为将值移位了一个时间步的训练序列。在输入序列的每个时间步,LSTM 神经网络都学习预测下一个时间步的值。不要在训练序列中包含最终时间步。

  2. 将数据划分为训练集(包含 90% 数据)和测试集(包含 10% 数据)。

[XTrain,TTrain,XTest,TTest] = prepareForecastingData(data,[0.9 0.1]);

为了更好地拟合并防止训练发散,您可以将预测变量和目标值归一化,以使通道的均值和单位方差为零。在进行预测时,还必须使用与训练数据相同的统计量对测试数据进行归一化。有关详细信息,请参阅使用深度网络设计器编译时间序列预测网络

定义网络架构

要构建网络,请打开深度网络设计器。

deepNetworkDesigner

要创建序列网络,请在序列到序列分类网络(未训练) 部分中点击 LSTM

这会打开一个适合序列分类问题的预置网络。通过编辑最终层,您可以将分类网络转换为回归网络。

首先,删除 softmax 层。

接下来,调整层的属性,使其适用于 Waveform 数据集。由于目标是预测时间序列中将来的数据点,因此输出大小必须与输入大小相同。在此示例中,输入数据有三个输入通道,因此网络输出也必须有三个输出通道。

选择序列输入层 input,并将 InputSize 设置为 3。

选择全连接层 fc,并将 OutputSize 设置为 3。

要检查网络是否准备好进行训练,请点击分析。深度学习网络分析器报告零错误或警告,因此,网络已准备就绪,可以开始进行训练。要导出网络,请点击导出。该 App 将网络保存在变量 net_1 中。

指定训练选项

指定训练选项。在选项中进行选择需要经验分析。要通过运行试验探索不同训练选项配置,您可以使用Experiment Manager。由于循环层一次处理一个时间步的序列数据,最终时间步中的任何填充都会对层输出产生负面影响。通过将 SequencePaddingDirection 选项设置为 "left",来填充或截断左侧的序列数据。

options = trainingOptions("adam", ...
    MaxEpochs=300, ...
    SequencePaddingDirection="left", ...
    Shuffle="every-epoch", ...
    Plots="training-progress", ...
    Verbose=false);

训练神经网络

使用 trainnet 函数训练神经网络。由于目标是回归,因此使用均方误差 (MSE) 损失。

net = trainnet(XTrain,TTrain,net_1,"mse",options);

预测将来时间步

闭环预测通过使用先前的预测作为输入来预测序列中的后续时间步。

选择第一个测试观测值。通过使用 resetState 函数重置状态,来初始化 RNN 状态。然后使用 predict 函数进行初始预测 Z。使用输入数据的所有时间步更新 RNN 状态。

X = XTest{1};
T = TTest{1};

net = resetState(net);
offset = size(X,1);
[Z,state] = predict(net,X(1:offset,:));
net.State = state;

要进行进一步的预测,请遍历时间步并使用 predict 函数和上一个时间步的预测值进行预测。每次预测后,更新 RNN 状态。通过将先前的预测值迭代传递给 RNN 来预测接下来的 200 个时间步。由于 RNN 不需要输入数据来进行任何进一步的预测,因此您可以指定任意数量的时间步来进行预测。初始预测的最后一个时间步是第一个预测的时间步。

numPredictionTimeSteps = 200;
Y = zeros(numPredictionTimeSteps,numChannels);
Y(1,:) = Z(end,:);

for t = 2:numPredictionTimeSteps
    [Y(t,:),state] = predict(net,Y(t-1,:));
    net.State = state;
end

numTimeSteps = offset + numPredictionTimeSteps;

将预测值与输入值进行比较。

figure
l = tiledlayout(numChannels,1);
title(l,"Time Series Forecasting")

for i = 1:numChannels
    nexttile
    plot(X(1:offset,i))
    hold on
    plot(offset+1:numTimeSteps,Y(:,i),"--")
    ylabel("Channel " + i)
end

xlabel("Time Step")
legend(["Input" "Forecasted"])

这种预测方法称为闭环预测。有关时间序列预测和执行开环预测的详细信息,请参阅使用深度学习进行时间序列预测

另请参阅

| | | |

主题