matlab实现LSTM时序预测-ChatGPT4o+mathworks文档
发布日期:2025-04-12 08:06:40 浏览次数:9 分类:精选文章

本文共 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 和目标 T

对训练数据进行输入-目标配对处理:

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 网络

构建 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");

八、Open Loop 预测

使用前 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

九、Closed Loop 预测(自回归)

使用历史数据预测:

[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)。

上一篇:MATLAB实现主成分分析
下一篇:Matlab安装

发表评论

最新留言

不错!
[***.144.177.141]2025年05月23日 12时56分33秒