本文共 2216 字,大约阅读时间需要 7 分钟。
首先,我们需要清除工作区变量、关闭所有图窗,并清空命令窗口:
clear allclose allclc
接下来,加载内置的数据集 WaveformData
。数据集中的每个观测序列 data{n}
都是一个大小为 [时间步 × 通道数]
的矩阵。例如,data{1}
可能是一个形状为 [100 × 3]
的矩阵,表示 100 个时间步和 3 个通道:
load WaveformData
然后,我们可以通过以下命令获取每个序列的通道数:
numChannels = size(data{1}, 2)
为了可视化前 4 个时间序列样本,我们可以使用 tiledlayout
创建一个 2x2 的布局,并调用 stackedplot
绘制多通道数据图:
tiledlayout(2, 2)for i = 1:4 nexttile stackedplot(data{i}) xlabel("Time Step")end
将数据按 90% 的训练集和 10% 的测试集划分:
numObservations = numel(data);idxTrain = 1:floor(0.9 * numObservations);idxTest = floor(0.9 * numObservations) + 1:numObservations;dataTrain = data(idxTrain);dataTest = data(idxTest);
对训练数据进行输入-目标配对处理:
X = dataTrain{n};XTrain{n} = X(1:end-1, :);TTrain{n} = X(2:end, :);
每个样本的训练对表示:输入为去掉最后一个时间点的序列,目标为去掉第一个时间点的序列,实现“当前时刻预测下一时刻”的任务。
对输入数据进行归一化处理:
muX = mean(cell2mat(XTrain));sigmaX = std(cell2mat(XTrain), 0);XTrain{n} = (XTrain{n} - muX) ./ sigmaX;
构建 LSTM 网络模型:
layers = [ sequenceInputLayer(numChannels) % 输入层 lstmLayer(128) % LSTM 隐藏层 fullyConnectedLayer(numChannels) % 输出层(与输入通道数相同)];
配置训练参数并训练模型:
options = trainingOptions("adam", ... MaxEpochs=200, ... SequencePaddingDirection="left", ... Shuffle="every-epoch", ... Plots="training-progress", ... Verbose=false);
进行模型训练:
net = trainnet(XTrain, TTrain, layers, "mse", options);
对测试数据进行归一化处理并进行模型评估:
XTest{n} = (X(1:end-1, :) - muX) ./ sigmaX;TTest{n} = (X(2:end, :) - muT) ./ sigmaT;
使用 minibatchpredict
进行批量预测:
YTest = minibatchpredict(net, XTest, ...);err(n) = rmse(YTest, TTest, "all");
使用前 75 个真实输入进行预测:
offset = 75;[Z, state] = predict(net, X(1:offset, :));net.State = state;
循环预测后续时间步:
for t = 1:numPredictionTimeSteps - 1 Xt = X(offset + t, :); [Y(t + 1, :], state] = predict(net, Xt); net.State = state;end
使用历史数据预测:
[Z, state] = predict(net, X(1:offset, :));Y(1, :) = Z(end, :);
循环预测后续时间步:
for t = 2:numPredictionTimeSteps [Y(t, :], state] = predict(net, Y(t - 1, :));end
预测图将显示原始真实数据(蓝线)和预测结果(虚线)。Open Loop 模式下,预测基于真实输入;Closed Loop 模式下,预测基于前一步的预测值,实现完全自回归预测。
本项目的完整流程包括数据预处理、网络搭建、模型训练、性能评估以及未来预测(Open Loop 和 Closed Loop)。
转载地址:http://eyyfk.baihongyu.com/