LSTM长短时记忆网络,用于回归预测或者时间序列预测 长短时记忆网络,机器学习,深度学习,Matlab 代码 保证源代码都能正常运行,结果如下图,可以根据自己的数据调参,替换自己数据就可以。 多维输入,单输出。


最近在折腾时间序列预测的项目,试了试Matlab自带的LSTM工具箱,发现对工程师简直太友好了。今天咱们不聊理论,直接上代码,用最接地气的方式实现多维输入单输出的预测模型。

先搞点训练数据

假设我们有三个传感器采集的时序数据(温度、湿度、压强),要预测未来时刻的压强值。这里用正弦波+噪声模拟生成样本:

% 生成模拟数据
t = 0:0.1:20;
X = [sin(t); cos(t); 0.5*randn(size(t))]; % 三维输入
Y = 0.5*sin(t+0.3) + 0.1*randn(size(t));  % 单输出目标值

% 转换为matlab需要的cell格式
trainX = con2seq(X(:,1:180)'); 
trainY = con2seq(Y(1:180)');
testX = con2seq(X(:,181:200)');
testY = Y(181:200);

这里用con2seq把矩阵转成LSTM需要的序列格式,注意输入数据是三维特征(行)随时间(列)变化的排列方式。

网络结构搭起来

numFeatures = 3; % 输入特征维度
numHiddenUnits = 128; % 玄学数字,效果不好就改这个

layers = [...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(50)
    dropoutLayer(0.2)
    fullyConnectedLayer(1)
    regressionLayer];

options = trainingOptions('adam',...
    'MaxEpochs',200,...
    'LearnRateSchedule','piecewise',...
    'LearnRateDropPeriod',100,...
    'Verbose',0);

敲黑板!这里有几个关键点:

  1. LSTM层设置OutputMode为sequence才能传递完整时间信息
  2. 全连接层逐渐压缩特征维度(128→50→1)
  3. Dropout层防过拟合,比例0.2比较保险
  4. 学习率分段设置:前100轮用默认0.001,后面降到0.0001

开训!

net = trainNetwork(trainX,trainY,layers,options);

这时候可以去泡杯咖啡,200轮训练大概需要5分钟(取决于显卡)。训练完成会看到loss曲线,如果震荡太大可能需要降低学习率。

预测与可视化

predY = predict(net,testX);
predY = cell2mat(predY); % 转回普通矩阵

figure
plot(testY,'b-','LineWidth',2)
hold on
plot(predY,'r--','LineWidth',1.5)
legend('真实值','预测值')
title('预测效果对比')

!

LSTM长短时记忆网络,用于回归预测或者时间序列预测 长短时记忆网络,机器学习,深度学习,Matlab 代码 保证源代码都能正常运行,结果如下图,可以根据自己的数据调参,替换自己数据就可以。 多维输入,单输出。

(假装这里有张效果对比图)

调参经验包

  1. 数据预处理:归一化!归一化!归一化!重要事情说三遍,建议用mapminmax做[-1,1]归一化
  2. 时间窗选择:尝试用前10个时间步预测下一步,修改数据分段方式:
% 时间窗处理
inputWindow = 10;
[XTrain, YTrain] = createTimeSeriesData(trainData, inputWindow);
  1. 过拟合处理:增加Dropout比例(0.3-0.5),或加L2正则化
  2. 提升预测精度:在LSTM后接两个全连接层,比单层效果更好

移植到自己的数据

  1. 保持输入数据为N×T矩阵(N特征,T时间步)
  2. 修改numFeatures为实际特征数
  3. 调整inputWindow参数匹配业务周期
  4. 如果预测步长变化,需要修改输出层结构

遇到报错先检查维度是否匹配,90%的问题都是数据格式不对。LSTM对缺失值敏感,建议提前做插值处理。完整代码已测试通过,在Matlab2021b及以上版本都能跑通。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐