CNN-LSTM多变量回归预测(Matlab) 基于卷积-长短期记忆网络(CNN-LSTM)的数据回归预测 1.CNN结合LSTM做拟合回归预测,数据多维输入单维输出,代码内注释详细,直接替换数据就可以使用 2.运行环境Matlab2020b及以上; 3.多输入单输出,数据回归预测; 4.CNN_LSTMNN.m为主文件,data为数据; 5.所有程序经过验证,保证运行 注意:数据和文件放在一个文件夹运行。
卷积神经网和LSTM这对组合拳在时序预测领域算是老搭档了。咱们今天要聊的这套CNN-LSTM混合模型,专治各种不服------尤其是那种多个传感器数据怼脸,最后只要预测一个关键指标的场合。比如工厂里十几台设备振动数据预测设备寿命,或者气象站多维数据预测温度变化,都是它的拿手好戏。
先看数据怎么喂给模型。假设你手头有个CSV文件,第一列是时间戳,后面跟着风速、气压、湿度等六个气象参数,最后一列是要预测的降水量。这时候数据预处理就得这么玩:
matlab
data = readmatrix('weather_data.csv');
train_data = data(1:800,2:7); % 取前800行6个特征
train_label = data(1:800,8); % 降水量作为标签
test_data = data(801:end,2:7);
test_label = data(801:end,8);
% 数据归一化(重要!)
[input_train, input_ps] = mapminmax(train_data', 0, 1);
[output_train, output_ps] = mapminmax(train_label', 0, 1);
input_test = mapminmax('apply', test_data', input_ps);
这里有个坑要注意:归一化必须用训练集的参数来处理测试集,不然就数据泄漏了。见过有人直接用全量数据归一化,结果过拟合到亲妈都不认识。

模型架构才是重头戏。咱们的CNN-LSTM网络结构长这样:
matlab
layers = [
sequenceInputLayer(6) % 对应6个输入特征
convolution1dLayer(3, 64, 'Padding','same') % 一维卷积核
batchNormalizationLayer
reluLayer
maxPooling1dLayer(2,'Stride',2)
convolution1dLayer(3, 128, 'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling1dLayer(2,'Stride',2)
lstmLayer(100, 'OutputMode','sequence')
dropoutLayer(0.2)
fullyConnectedLayer(50)
reluLayer
fullyConnectedLayer(1)
regressionLayer];
这个结构里卷积层相当于特征提取器,专门捕捉局部时序模式。比如3个时间步长的卷积核,可以抓住类似"气压骤降+风速突增"这种组合特征。后面的LSTM层则负责捕捉长期依赖,比如连续三天的湿度变化趋势。
CNN-LSTM多变量回归预测(Matlab) 基于卷积-长短期记忆网络(CNN-LSTM)的数据回归预测 1.CNN结合LSTM做拟合回归预测,数据多维输入单维输出,代码内注释详细,直接替换数据就可以使用 2.运行环境Matlab2020b及以上; 3.多输入单输出,数据回归预测; 4.CNN_LSTMNN.m为主文件,data为数据; 5.所有程序经过验证,保证运行 注意:数据和文件放在一个文件夹运行。
训练配置这块别手软,该砸资源就砸:
matlab
options = trainingOptions('adam', ...
'MaxEpochs', 150, ...
'MiniBatchSize', 64, ...
'InitialLearnRate', 0.001, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod', 50, ...
'LearnRateDropFactor', 0.2, ...
'GradientThreshold', 1, ...
'Shuffle','every-epoch', ...
'Plots','training-progress', ...
'Verbose',0);
注意学习率调整策略,前50轮猛学,后面开始收敛时适当降速。遇到梯度爆炸也别慌,设置GradientThreshold=1相当于给梯度加了个安全阀。

预测阶段记得把输出数据反归一化:
matlab
pred = predict(net, input_test);
pred = mapminmax('reverse', pred, output_ps);
figure
plot(test_label,'b')
hold on
plot(pred,'r')
legend('真实值','预测值')
title('预测效果对比')
这里经常有人忘记反归一化,结果看着预测曲线在0-1之间一脸懵逼。可视化时建议用hold on把真实值和预测值叠在同一张图上,对比更直观。
实际跑代码时可能会遇到内存不足的问题,特别是数据量大的时候。这时候可以调整MiniBatchSize,或者试试把卷积层的filter数量减半。另外,如果发现验证集loss早早就停止下降,不妨把LSTM层的dropout率提到0.3试试。
最后说个骚操作:在工业场景部署时,可以把训练好的网络转成ONNX格式,再通过Matlab Coder生成C++代码,直接集成到嵌入式设备里实时预测。这套流程我们团队在风电故障预测项目里验证过,延迟能控制在50ms以内。
