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常见数据导入方法

教程中未包含的数据类型,可以参考 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 条样本,主要用于验证运行环境和调用流程。完整版不限制样本数,且包含可编辑源码。

五、获取公开版程序(需使用电脑浏览器打开)

公开版程序可以直接下载,用于测试运行环境和体验完整调用流程。

公开版下载:
点击此处下载 CNN-RNN 混合回归预测 MATLAB 公开版代码

注:公开版代码建议使用 MATLAB R2022a 及以上版本。公开版限制为 100 个样本以内,生成图片带水印,核心函数已加密。

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 76元 才能查看此处内容!立即支付

七、完整版代码重要更新

20260621 完成初版代码。

八、常见问题

Q1:这个程序是不是只能做时间序列预测?

不是。它本质上是“有序一维输入到连续数值输出”的回归预测程序。只有当输入行表示历史时间窗口,并且目标值表示未来某一时刻时,才属于时间序列预测。光谱估计、传感器序列回归等任务也可以使用。

Q2:为什么普通表格数据也能跑,但文章里说要注意列顺序?

因为 CNN 和 RNN 会把相邻列、前后列当作有意义的结构。如果普通表格的列没有天然顺序,模型仍然能运行,但相邻关系未必有业务含义。因此,普通表格数据建议谨慎使用,或者固定列顺序并结合实际效果判断。

Q3:我想换成自己的数据,最少需要改哪里?

最少只需要改 demoCNNRNN_Regression.m 中的数据导入部分,把自己的输入整理为 X,输出整理为 Y,然后根据需要调整 options 参数。