CNN-RNN混合回归预测MATLAB代码
最后更新于:2026-07-06 00:06:19
- 使用波士顿房价预测作为演示案例。
- 可以设置 CNN 卷积核数量、卷积核宽度、池化窗口等结构参数。
- 可以在 LSTM、GRU、BiLSTM 三种循环网络结构之间快速切换。
- 可以快速划分训练集、验证集、测试集,并保证测试集只在模型训练完成后参与最终评价。
- 程序运行完后自动绘制训练集预测效果、测试集预测效果、训练/验证/测试散点图、MAE/RMSE/MAPE/R² 指标对比图、训练与验证损失曲线。
- 可自动计算 MAE、MSE、RMSE、MAPE、R² 等回归评价指标。
- 多种训练参数可设置,包括最大迭代次数、初始学习率、批尺寸、提前停止轮数等。
- 可设置随机种子,保证每次运行的数据划分和训练结果尽量保持一致。
需要你做的基本只有导入数据和调参。
绝大多数流程都已经封装固化到 FunRegCNNRNN 函数中,仿照案例导入自己的数据,即可快速得到预测结果、评价指标和结果图。
需要注意的是,本程序适合“每条样本内部具有明确顺序”的一维数据,例如滑动时间窗、光谱波段、传感器空间位置等。波士顿房价数据主要用于演示代码调用流程;普通表格特征并不天然具有时间顺序,实际使用时应根据业务含义确认列顺序是否合理。
一、代码运行环境
MATLAB R2022a 及更新版本,需安装 Deep Learning Toolbox。
如果使用更早版本 MATLAB,可能会遇到部分深度学习层或训练参数不兼容的问题,建议优先使用 R2022a 及以上版本运行。
二、程序介绍
程序文件
CNN_RNN_Regression/
├── demoCNNRNN_Regression.m
├── FunRegCNNRNN.m
├── EvaRegEffect.m
├── housing.txt
├── 代码说明.txt
└── figure/图1.png ... 图5.png
注:脚本文件可以直接运行;函数文件在没有输入变量的情况下无法直接运行。更详细的解释可以看 MATLAB 官方文档:脚本和函数。
1. demoCNNRNN_Regression.m 文件
使用波士顿城郊区域的房价数据集进行回归预测的演示案例,其中演示了 FunRegCNNRNN 函数的应用方式。
文件可以直接运行。程序运行完成后,会在 figure 文件夹中自动保存如下图像:
训练集预测效果与误差分布图:

测试集预测效果与误差分布图:

训练集、验证集、测试集真实值与预测值散点图:

MAE、RMSE、MAPE、R² 等指标对比图:

训练与验证损失收敛曲线:

在命令行窗口还会打印出以下内容:
- 数据集样本数、序列长度、目标值范围;
- 当前使用的循环结构、卷积核数量、隐藏单元数量;
- 训练集、验证集、测试集划分数量;
- 训练集、验证集、测试集上的 MAE、MSE、RMSE、MAPE、R² 等指标;
- 实际训练迭代次数。
2. FunRegCNNRNN.m 文件
使用 CNN-RNN 混合网络进行回归预测的快速实现函数。
代码说明:
function [foreData, foreDataTrain, info] = FunRegCNNRNN(X, Y, options)
% CNN-RNN混合回归预测函数
%
% 重要输入约束:
% X 的每一行是一条有序一维序列,列方向会被 CNN 当作局部邻域、
% 被 RNN 当作前后顺序。适合滑动时间窗、光谱、传感器位置等列顺序
% 有意义的数据。普通无序表格特征必须固定并论证列顺序。
%
% 输入:
% X - [样本数 × 有序序列长度]
% Y - [样本数 × 1] 连续目标
% options - 参数结构体,控制数据划分、网络结构、训练过程、归一化和绘图
%
% 输出:
% foreData - 最终测试集预测值
% foreDataTrain - 训练集拟合值
% info - 网络、归一化参数、三组索引/指标和训练过程
options 为结构体类型,是使用这个函数时最常调整的部分。它不是一个“随便填的参数包”,而是把数据怎么划分、网络怎么搭、训练怎么停、结果要不要画图都集中到一起。常用设置如下:
options.rTrain = 0.8;
options.validationRatio = 0.15;
options.networkType = 'LSTM';
options.convChannels = 16;
options.kernelSize = 3;
options.poolSize = 2;
options.rnnHidden = 32;
options.epochs = 150;
options.lr = 0.01;
options.batchSize = 32;
options.earlyStoppingPatience = 50;
options.mapflag = 'on';
options.figflag = 'on';
options.shuffle = true;
options.seed = 42;
各字段含义如下:
| 参数 | 默认值 | 允许取值/范围 | 作用与调参影响 |
|---|---|---|---|
rTrain |
0.8 |
[0.5, 1) |
训练+验证数据比例,其余样本作为最终测试集。注意它不是纯训练集比例。 |
validationRatio |
0.15 |
(0, 0.5) |
验证集占训练+验证数据的比例,用于早停和观察泛化,不参与参数更新。 |
shuffle |
true |
true/false |
划分前是否打乱样本。独立样本可打乱;严格时间序列通常应先构造滑动窗口,再按时间顺序切分。 |
seed |
42 |
非负整数 | 随机种子。固定整数便于复现实验,设为 0 表示不固定随机性。 |
networkType |
'LSTM' |
'LSTM'/'GRU'/'BiLSTM' |
循环层类型。LSTM 较稳,GRU 参数较少,BiLSTM 同时读正反两个方向。 |
convChannels |
16 |
正整数 | 一维卷积通道数。越大可提取更多局部模式,但训练更慢、更容易过拟合。 |
kernelSize |
3 |
正奇数 | 一维卷积核宽度。越大表示一次观察更宽的相邻区域;太大可能抹掉局部细节。 |
poolSize |
2 |
[1, 序列长度] |
最大池化窗口。设为 1 基本等价于不池化;越大压缩越强,可能丢失细节。 |
rnnHidden |
32 |
正整数 | 循环层隐藏单元数。越大记忆容量越强,但训练更慢,也更容易过拟合。 |
epochs |
150 |
正整数 | 最大训练轮数。实际训练可能因为早停提前结束。 |
lr |
0.01 |
正数 | Adam 初始学习率。太大容易震荡,太小收敛慢。 |
batchSize |
32 |
正整数 | 批尺寸。小批次波动更大,大批次更稳定但占内存。 |
earlyStoppingPatience |
50 |
正整数 | 验证损失连续不改善的容忍次数。越小越早停,越大训练更充分但可能过拟合;当前演示设为 50,以避免过早停止。 |
mapflag |
'on' |
'on'/'off' |
是否归一化。建议开启;开启时只用训练集拟合归一化参数,避免数据泄漏。 |
figflag |
'on' |
'on'/'off' |
是否自动绘图并保存到 figure 文件夹。批量调参时可设为 'off'。 |
其中,networkType 支持三种取值:
options.networkType = 'LSTM'; % 单向 LSTM,默认设置
options.networkType = 'GRU'; % GRU,结构相对精简
options.networkType = 'BiLSTM'; % 双向 LSTM,同时汇总两个方向的信息
函数内部会自动完成:
- 输入参数检查;
- 训练集、验证集、测试集划分;
- 仅使用训练集拟合归一化参数,再应用到验证集和测试集;
- CNN-RNN 网络构建;
- 网络训练与验证集提前停止;
- 测试集预测;
- MAE、MSE、RMSE、MAPE、R² 指标计算;
- 结果图自动保存。
3. EvaRegEffect.m 文件
用于评价回归预测效果的通用函数,可以计算 MAE、MSE、RMSE、MAPE、R² 等指标。
function ind = EvaRegEffect(realData, foreData, indNames)
% 输入:
% realData:真实值
% foreData:预测值
% indNames:拟计算的指标名称,cell类型
%
% 当前支持:
% MAE、MSE、RMSE、MAPE、R2
%
% 输出:
% ind:预测效果评价指标结果数组,其顺序与 indNames 一一对应
例如:
indNames = {'MAE','MSE','RMSE','MAPE','R2'};
ind = EvaRegEffect(realData, foreData, indNames);
4. housing.txt 文件
波士顿房价演示数据集,共 506 条样本。前 13 列为输入特征,第 14 列为房价目标值。
5. figure 文件夹
程序运行后自动生成的结果图会保存在该文件夹中。
三、快速开始
1. 运行测试脚本
先在 MATLAB 中打开下载好的文件夹,将当前工作路径切换到 CNN_RNN_Regression 代码目录,然后运行:
demoCNNRNN_Regression
程序运行完毕后,如果命令行没有报错,并且 figure 文件夹中正常生成上述 5 张图像,则说明运行环境正常,程序可以使用。
2. 修改仿真数据 / 导入自己的数据
复制一份 demoCNNRNN_Regression.m,在副本中修改第一部分的数据导入代码。
根据你的文件类型不同,Excel、txt、csv 等数据导入 MATLAB 的方式也不同。常用数据导入方式可以参考这个教程:
教程中未包含的数据类型,可以参考 MATLAB 官方文档:
Supported File Formats for Import and Export
导入数据后,需要整理出两个变量:
X = data(:, 1:end-1); % 输入数据:[样本数 × 有序序列长度]
Y = data(:, end); % 输出目标:[样本数 × 1]
注意,X 的列方向会被程序当作一维序列。若你的数据是时间序列预测任务,建议先在外部构造滑动窗口,再把每个窗口作为一行输入。
3. 调整网络与训练参数
参照脚本文件中第二部分,根据需要调整相关参数。例如:
options.networkType = 'LSTM';
options.convChannels = 16;
options.kernelSize = 3;
options.poolSize = 2;
options.rnnHidden = 32;
options.epochs = 150;
options.lr = 0.01;
options.batchSize = 32;
options.seed = 42;
如果想比较不同循环结构,只需修改 networkType,并在相同数据划分下比较验证集和测试集指标。
4. 运行程序
数据导入和参数设置完成后,运行脚本即可。程序会自动训练模型、生成预测结果、计算评价指标并保存结果图。
四、关于完整版与公开版代码
| 功能 | 完整版 | 公开版 |
|---|---|---|
| 数据导入、参数设置 | √ | √ |
| 软件全部源码(函数 m 文件) | √ | × |
| 核心函数加密 | × | √,核心函数为 .p 文件 |
| 数据长度限制 | 无限制 | 100 个样本以内 |
| 结果图水印 | 无水印 | 有“试用版@khsci.com/docs”水印 |
| 自动绘制训练集/测试集预测图 | √ | √ |
| 自动绘制散点图、指标图、损失曲线 | √ | √ |
| 导出测试集预测结果、训练集预测结果、训练信息 | √ | 受限 |
| 修改核心算法细节 | √ | × |
公开版随包 housing.txt 固定为 100 条样本,主要用于验证运行环境和调用流程。完整版不限制样本数,且包含可编辑源码。
五、获取公开版程序(需使用电脑浏览器打开)
公开版程序可以直接下载,用于测试运行环境和体验完整调用流程。
注:公开版代码建议使用 MATLAB R2022a 及以上版本。公开版限制为 100 个样本以内,生成图片带水印,核心函数已加密。
六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)
点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
20260621 完成初版代码。
八、常见问题
Q1:这个程序是不是只能做时间序列预测?
不是。它本质上是“有序一维输入到连续数值输出”的回归预测程序。只有当输入行表示历史时间窗口,并且目标值表示未来某一时刻时,才属于时间序列预测。光谱估计、传感器序列回归等任务也可以使用。
Q2:为什么普通表格数据也能跑,但文章里说要注意列顺序?
因为 CNN 和 RNN 会把相邻列、前后列当作有意义的结构。如果普通表格的列没有天然顺序,模型仍然能运行,但相邻关系未必有业务含义。因此,普通表格数据建议谨慎使用,或者固定列顺序并结合实际效果判断。
Q3:我想换成自己的数据,最少需要改哪里?
最少只需要改 demoCNNRNN_Regression.m 中的数据导入部分,把自己的输入整理为 X,输出整理为 Y,然后根据需要调整 options 参数。