LSTM-Attention基于长短期记忆网络融合注意力机制的多变量时间序列预测MATLAB代码 代码注释清楚。 main为运行主可以读取本地EXCEL数据。 很方便,容易上手。

打开MATLAB时总能看到各种时序预测的论文漫天飞,但真到自己动手就发现连数据都读不明白。最近在GitHub扒到个挺有意思的LSTM-Attention预测代码,实测能用EXCEL直接喂数据,对刚入门的朋友特别友好。咱们直接上硬货,手把手拆解这个预测框架。

先看数据准备部分,这个脚本最舒服的就是不需要搞复杂的数据接口。主程序开头几行就能把EXCEL表格读得明明白白:

data = xlsread('你的数据.xlsx');
train_data = data(1:800,:);
test_data = data(801:end,:);

这里注意EXCEL数据得是列向量的特征排列,比如第一列温度、第二列湿度这种多变量结构。建议先把数据做归一化,代码里用的是最大最小值缩放:

[data_normalized,ps] = mapminmax(data', 0, 1);

这个mapminmax函数处理后的数据会保持在[0,1]区间,对LSTM这种对数值范围敏感的模型特别关键。ps结构体保存了缩放参数,预测完记得用mapminmax('reverse')反归一化才能得到真实值。

模型搭建才是重头戏。作者把LSTM层和Attention机制用Sequential方式堆叠,比传统LSTM多出两个关键组件:

layers = [...
    sequenceInputLayer(num_features)
    lstmLayer(128,'OutputMode','sequence')
    attentionLayer('Name','attn')
    fullyConnectedLayer(64)
    reluLayer
    fullyConnectedLayer(num_responses)
    regressionLayer];

那个attentionLayer是自定义层,藏在utils文件夹里。扒开它的源码会发现核心是计算时序权重:

function [Z,attention_weights] = attentionOperation(X)
    scores = tanh(X * weights_query + bias_query) * weights_value;
    attention_weights = softmax(scores);
    Z = X .* attention_weights;
end

这里用双线性注意力计算每个时间步的重要性,比直接全连接做权重更符合时序特性。注意LSTM层的OutputMode要设成'sequence'才能保留时间维度,要是设成'last'后面注意力就废了。

LSTM-Attention基于长短期记忆网络融合注意力机制的多变量时间序列预测MATLAB代码 代码注释清楚。 main为运行主可以读取本地EXCEL数据。 很方便,容易上手。

训练参数设置里有个小技巧:

options = trainingOptions('adam', ...
    'MaxEpochs',200,...
    'MiniBatchSize',32,...
    'InitialLearnRate',0.001,...
    'LearnRateSchedule','piecewise',...
    'LearnRateDropPeriod',50);

初始学习率千万别设太高,0.001刚好适合大多数工业数据。LearnRateDropPeriod配合piecewise策略,每50轮学习率自动衰减,防止后期震荡。实测200个epoch足够收敛,要是数据量特别大可以适当增加。

预测阶段有个隐藏功能:模型会自动处理变长序列。比如测试数据比训练数据长的时候,只要保持特征数一致就能直接预测。可视化部分代码写得相当贴心:

plot(testPredictions,'b-');
hold on;
plot(testData(:,end),'r--');
legend('预测值','真实值');
title('测试集预测效果');

这里假设最后一列是目标变量,如果数据排列不同记得调整索引。发现预测曲线滞后的话,可以尝试在数据预处理时加入移动平均或差分处理。

整个项目最爽的是自带数据兼容性——支持任意维度时序预测。试过用8维气象数据直接训练,改个num_features参数就能跑。不过要注意EXCEL里别留空行空列,matlab的xlsread函数遇到空值会直接报维度错误。

想要进阶调优的话,可以在Attention层后面加dropout层防止过拟合。实测在负荷预测数据集上,加入0.2的dropout能让MAPE指标下降1.5%左右。代码里默认用的128个LSTM单元,遇到长周期数据可以试着加到256,但要注意爆显存的问题。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐