CNN-RNN时间序列预测MATLAB代码
最后更新于:2026-07-19 21:14:30
本文介绍一套 MATLAB 版 CNN-RNN 混合时间序列预测代码。程序以 chickenpox.mat 中的一维月度时间序列作为演示案例,封装了单步预测和多步递归预测两个入口,适合用于有明显局部波动、周期性或长期依赖的一维序列预测任务。
- 使用 chickenpox 月度时间序列数据作为演示案例。
- 可以自由设置滑动窗口长度、CNN 卷积层通道数、卷积核大小、池化窗口、RNN 类型和隐藏单元数。
- MATLAB 版 RNN 层支持 LSTM、GRU、BiLSTM 三种结构。
- 可按时间顺序快速划分训练+验证数据、验证集、测试集,避免把未来信息提前泄露给模型。
- 程序运行后自动绘制收敛过程、训练集预测结果、验证集预测结果、测试集预测结果、测试段递归预测图、MAE/MSE/MAPE/RMSE/R²/R 等指标对比图。
- 支持随机种子设置,便于复现实验结果。
- 需要你做的主要是导入自己的时间序列、设置窗口长度、网络结构和训练参数。
一、代码运行环境
推荐运行环境为 MATLAB R2022a 及更新版本,并安装 Deep Learning Toolbox。
本代码开发和测试时使用 MATLAB R2024a。程序中用到了 convolution1dLayer、lstmLayer、gruLayer、bilstmLayer、trainNetwork、trainingOptions、exportgraphics 等函数。如果你使用更早版本 MATLAB,建议先确认这些函数是否可用。
二、程序介绍
完整版代码文件结构如下:
CNN_RNNs_Forecast/
├── demoCNNRNNsForecast.m
├── demoCNNRNNsForecastMul.m
├── FunCNNRNNsForecast.m
├── FunCNNRNNsForecastMul.m
├── EvaForeEffect.m
├── chickenpox.mat
├── figure/
└── 代码说明.txt
注:demo*.m 为脚本文件,可以直接运行;Fun*.m 和 EvaForeEffect.m 为函数文件,一般不直接双击运行,而是在脚本中调用。
1. demoCNNRNNsForecast.m 文件
该脚本演示 CNN-RNN 混合模型的单步时间序列预测流程。所谓单步预测,就是用前 lookBack 个历史点预测紧接着的下一个点;在测试阶段,每个测试样本仍然使用真实历史窗口作为输入。
脚本主要完成三件事:加载 chickenpox.mat 数据,设置 options 参数,然后调用:
[foreData, foreDataTrain, foreDataVal, net, info] = FunCNNRNNsForecast(data, options);
程序运行完成后,会自动在 figure/ 文件夹下保存如下图像。

图 1 展示训练损失和验证损失的变化。如果验证损失长期不再下降,程序会根据早停参数停止训练。

图 2 展示单步预测模式下测试集真实值与预测值的对比,同时给出相对误差。它主要用于观察模型在未参与训练的未来数据上是否仍能跟住整体趋势。
2. demoCNNRNNsForecastMul.m 文件
该脚本演示 CNN-RNN 混合模型的多步递归预测流程。多步递归预测比单步预测更接近真实的未来外推:模型先预测测试段第一个点,再把这个预测值放回历史窗口,继续预测下一个点。
脚本调用:
[foreData, foreDataTrain, foreDataVal, net, info] = FunCNNRNNsForecastMul(data, options);
多步递归预测的难点在于误差会一步一步累积,所以本程序额外加入了 baselineMode、seasonPeriod、residualScale 等稳定参数,用于在递归预测时结合季节基准与模型输出,减少预测漂移。

图 3 展示测试段多步递归预测效果。读图时要注意:这里不是每一步都喂入真实测试值,而是把前面预测出的结果继续作为后续输入,因此比单步预测更难。

图 4 汇总训练集、验证集和测试集上的 MAE、MSE、RMSE、MAPE、R²、R 等指标,便于快速判断模型是否过拟合、测试集误差是否明显偏大。
3. FunCNNRNNsForecast.m 文件
该函数是单步预测的核心函数。
[foreData, foreDataTrain, foreDataVal, net, info] = FunCNNRNNsForecast(data, options)
输入参数说明:
data:一维时间序列,可以是行向量、列向量或 cell。程序会将其整理成一条有序数值序列。options:参数结构体,可不传。不传时使用默认参数。
输出参数说明:
foreData:测试集预测值。foreDataTrain:训练集预测值。foreDataVal:验证集预测值。net:训练好的 MATLAB 神经网络模型。info:训练过程、数据划分、归一化参数、评价指标等信息。
options 逐项说明如下。
| 参数名 | 默认值 | 含义与调参说明 |
|---|---|---|
lookBack |
12 |
滑动窗口长度,表示用前多少个时间点预测下一个点。窗口太短可能看不到周期和滞后关系,太长会增加模型复杂度。 |
rTrain |
0.8 |
训练+验证数据占原始序列的比例。剩余部分作为最终测试集,按时间顺序切分。 |
validationRatio |
0.15 |
在训练+验证数据中再切出多少作为验证集,用于早停和调参参考。 |
shuffle |
true |
是否打乱训练窗口的 mini-batch 顺序。它不会改变训练集、验证集、测试集的时间顺序。 |
seed |
42 |
随机种子。设为 0 表示不固定随机性。 |
networkType |
'LSTM' |
RNN 层类型,可选 'LSTM'、'GRU'、'BiLSTM'。LSTM 较稳,GRU 参数更少,BiLSTM 可同时利用窗口内正反方向信息。 |
convChannels |
16 |
1D CNN 卷积输出通道数。越大表示可提取更多局部模式,但更容易过拟合。 |
kernelSize |
3 |
1D 卷积核大小,必须为正奇数。较小卷积核关注短期局部波动,较大卷积核覆盖更宽局部范围。 |
poolSize |
2 |
最大池化窗口。设为 1 表示不池化;池化会压缩序列长度,增强局部鲁棒性,但过大可能丢失细节。 |
rnnHidden |
32 |
RNN 隐藏单元数。越大模型表达能力越强,训练时间和过拟合风险也越高。 |
dropoutProb |
0.1 |
Dropout 概率,用于减轻过拟合。取值范围为 [0,1)。 |
maxEpochs |
200 |
最大训练轮数。轮数太少可能欠拟合,太多可能浪费时间或过拟合。 |
miniBatchSize |
32 |
小批量大小。较小 batch 更新更频繁,较大 batch 训练更平滑但占内存更多。 |
gradientThreshold |
1 |
梯度裁剪阈值,用于防止训练过程中梯度过大。 |
initialLearnRate |
0.005 |
初始学习率。学习率过大容易震荡,过小收敛慢。 |
learnRateSchedule |
'piecewise' |
学习率调度方式,可选 'piecewise' 或 'none'。 |
learnRateDropPeriod |
50 |
当使用分段下降学习率时,每隔多少轮下降一次。 |
learnRateDropFactor |
0.5 |
学习率下降系数。例如 0.5 表示下降为原来的一半。 |
l2Regularization |
1e-4 |
L2 正则化系数,用于抑制过拟合。 |
validationPatience |
30 |
验证集早停容忍轮数。验证损失长时间不改善时提前停止训练。 |
mapflag |
'on' |
是否归一化。建议开启;程序只用训练集拟合归一化参数,避免数据泄露。 |
figflag |
'on' |
是否绘制结果图。设为 'on' 时,每张结果图会分别弹出,并自动保存到 figure/ 文件夹;设为 'off' 时不绘图也不保存。 |
executionEnvironment |
'auto' |
训练设备,可选 'auto'、'cpu'、'gpu'。 |
plots |
'none' |
是否弹出 MATLAB 训练过程窗口,可选 'none'、'training-progress'。 |
4. FunCNNRNNsForecastMul.m 文件
该函数是多步递归预测的核心函数。
[foreData, foreDataTrain, foreDataVal, net, info] = FunCNNRNNsForecastMul(data, options)
它的大部分参数与单步预测函数一致,区别在于测试阶段采用递归滚动预测:先预测第 1 个测试点,再把预测值放回窗口预测第 2 个测试点,直到完成整个测试段。
多步版额外参数如下。
| 参数名 | 默认值 | 含义与调参说明 |
|---|---|---|
baselineMode |
'seasonal' |
递归预测时的基准方式,可选 'seasonal' 或 'last'。'seasonal' 表示参考同周期历史点,'last' 表示参考窗口最后一个点。 |
seasonPeriod |
[] |
季节周期。为空时默认等于 lookBack。对于月度数据,常用 12。 |
residualScale |
'auto' |
模型修正量比例。设为 'auto' 时,程序只使用验证集在候选强度中自动选择,避免偷看测试集;也可以手动填写 [0,1] 内的数值。越接近 1 越相信模型输出,越接近 0 越贴近基准序列。 |
5. EvaForeEffect.m 文件
该函数用于计算预测评价指标。
ind = EvaForeEffect(realData, foreData, indNamesCell)
输入参数:
realData:真实值。foreData:预测值。indNamesCell:需要计算的指标名称,例如{'MAE','MSE','RMSE','MAPE','R2','R'}。
输出参数:
ind:各指标计算结果,顺序与indNamesCell一一对应。
6. chickenpox.mat 文件
示例数据文件,包含一条一维月度时间序列。实际使用时,可以把这里替换为自己的 Excel、CSV、TXT、MAT 文件中的一维序列。
7. figure 文件夹
程序运行后自动生成,里面保存收敛图、训练集预测图、验证集预测图、测试集预测图、多步递归预测图和指标对比图。完整版图像无水印,公开版图像带有试用版水印。
8. 代码说明.txt 文件
简要说明代码文件组成、运行入口和注意事项。
三、快速开始
1. 运行测试脚本
先在 MATLAB 中打开下载好的代码文件夹,然后运行:
demoCNNRNNsForecast
如果需要测试多步递归预测,再运行:
demoCNNRNNsForecastMul
程序正常运行后,会在命令行窗口打印网络结构、数据划分和评价指标,并在 figure/ 文件夹中保存结果图。
2. 替换成自己的数据
复制一个 demo 脚本副本,在副本中修改数据加载部分即可。例如你的数据是一列时间序列,只需要把它读入为一个向量:
data = yourData(:);
然后保持后面的函数调用不变。
时间序列预测不建议随机抽取最后测试集。程序默认按时间顺序切分:前面一段用于训练和验证,最后一段作为测试集,这样更接近真实预测场景。
3. 调整常用参数
最常改的参数通常是:
options.lookBack = 12;
options.networkType = 'LSTM';
options.convChannels = 16;
options.rnnHidden = 32;
options.maxEpochs = 200;
options.initialLearnRate = 0.005;
options.figflag = 'on';
如果做多步递归预测,还可以重点调整:
options.baselineMode = 'seasonal';
options.seasonPeriod = 12;
options.residualScale = 'auto'; % 只用验证集自动选择修正强度,避免偷看测试集
当多步预测曲线漂移明显时,建议先使用 residualScale='auto'。程序会只根据验证集表现选择修正强度,不会利用测试集调参;也可以手动调小该参数,或者增加训练数据量、调整 lookBack 与 seasonPeriod。
四、关于完整版与公开版代码
| 功能 | 完整版 | 公开版 |
|---|---|---|
| 单步时间序列预测 | √ | √ |
| 多步递归时间序列预测 | √ | √ |
| 示例数据与 demo 脚本 | √ | √ |
| 核心函数源码 | 提供 | 不提供 |
| 自动保存结果图 | √ | √ |
| 结果图水印 | 无水印 | 有 试用版@khsci.com/docs 水印 |
| 数据长度限制 | 无限制 | 最多 100 个时间点 |
| 最大训练轮数 | 无限制 | 最多 50 轮 |
| 可导出训练好的模型、预测结果和 info 信息 | √ | 部分受限 |
| 适合正式项目和二次修改 | √ | 仅适合体验流程 |
公开版主要用于确认运行环境、查看程序调用方式和体验基本流程。正式项目建议使用完整版。
五、获取公开版程序
注:公开版代码包含演示脚本、示例数据和运行所需文件。公开版最多支持 100 个时间点,最大训练轮数为 50,结果图带有试用版水印。
六、获取完整版程序
点击本页面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。本通道处于测试阶段,付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
- 20260719:修正相对误差图方向,结果图改为弹窗显示并同步保存;多步版加入季节基准、残差学习和验证集自动选择
residualScale,减缓递归漂移。 - 20260717:完成 CNN-RNN 时间序列预测 MATLAB 版初版代码,包含单步预测、多步递归预测、自动画图和评价指标。
八、常见问题
Q1:这个代码做的是回归、分类还是时间序列预测?
这是时间序列预测代码,本质输出是连续数值,因此也属于回归预测的一种。它不是分类代码。
Q2:单步预测和多步递归预测有什么区别?
单步预测每次用真实历史窗口预测下一个点;多步递归预测会把前一步预测值放回窗口继续预测后续点。多步递归更接近真正预测未来一长段数据,但误差也更容易累积。
Q3:为什么要按时间顺序划分数据?
时间序列有先后顺序。如果随机把未来数据混进训练集,模型可能提前看到了未来模式,测试结果会虚高。程序默认把最后一段作为测试集,更符合实际应用。
Q4:多步预测测试集 R² 不高怎么办?
多步递归预测本来就更难。可以优先检查数据是否有明显周期,尝试调整 lookBack、seasonPeriod、residualScale、networkType、rnnHidden、initialLearnRate,也可以增加训练数据量。
Q5:可以换成自己的 Excel 或 CSV 数据吗?
可以。只要最终整理成一维数值序列 data 即可。建议先保证没有缺失值、异常字符串和非数值内容。