做时间序列预测的人,十有八九都卡在同一个问题上:手里拿着多变量数据,却不知道怎么把空间特征和时间依赖同时吃进去。CNN擅长抓局部模式,LSTM天生处理时序,两个拼一起听起来很合理,但真动手写代码、调网络结构的时候,坑一个接一个。这篇就来聊聊用Matlab实现CNN-BiLSTM做多变量/时间序列预测的完整流程,从数据处理、滑窗构造、网络搭建到训练预测,全程给可直接抄的代码和参数经验。如果你是刚接触深度学习的Matlab用户,或者已经在用RNN但想进一步提升预测精度,这篇文章应该能帮你少走很多弯路。
1. 为什么多变量预测绕不开CNN-BiLSTM
1.1 多变量时间序列到底难在哪
单变量时间序列预测,比如只看历史温度预测未来温度,本质上是“一条线上的游戏”。多变量就不一样了,它同时涉及多个特征,比如空气污染预测里同时有PM2.5、SO2、NO2、CO、温度、湿度,每个特征都对目标值有影响,而且彼此之间还互相纠缠。你要处理的不是一个序列,而是一组序列的联合演化。
这种问题难在三个层面。第一,特征之间的局部关联很难手工建模。某个污染物浓度骤升,往往意味着PM2.5会在后续几个小时内爬升,这种“变量A在一段时间窗内对变量B的影响”,靠人工构造特征既费劲又不全面。第二,时间依赖是长跨度的。气象类数据尤其明显,今天的湿度变化可能影响明天乃至后天的污染扩散,用普通的前馈神经网络根本兜不住这种长期记忆。第三,数据里全是非线性关系。线性模型搞不定,传统统计方法比如VAR也做得吃力,深度学习方法反而成了最现实的选择。
1.2 CNN和BiLSTM各自扮演什么角色
CNN在这套组合里的定位是“特征提取器”。它通过卷积核在时间维度上滑动,自动学习相邻几个时间步内的局部模式。一维卷积非常适合这种场景:核大小为3的时候,每个卷积核只看最近的3个时刻,提取范围内的局部趋势、突变、周期性片段。多个卷积核相当于多个“观察视角”,有的关注上升趋势,有的关注波动幅度,有的关注值之间的差值。CNN把多变量数据里的空间特征压缩成更紧凑的表达,再往下传。
BiLSTM接在CNN后面,干的是“时序建模”的活儿。LSTM的优点是带门控机制,能记住重要信息、忘掉无关信息,从而捕捉长距离依赖。BiLSTM比普通LSTM更进一步:它同时从正向和反向两个方向读序列。你可以理解成读一句话的时候,既从左往右看语法,又从右往左看语境,双向信息综合起来判断。对于离线预测任务——也就是整个序列已经拿到手,再预测未来的场景——这种双向建模能更充分地利用上下文信息。
1.3 为什么不直接用单LSTM或单CNN
很多人会问,都用上BiLSTM了,何必还要前面的CNN?直接堆LSTM不就行了?
理论上可以,但效果通常不理想。纯LSTM处理高维多变量输入时,每个时间步要同时消化所有特征,信息太密集,模型很难自动区分哪些特征在局部时间窗内更重要。简单说就是“眉毛胡子一把抓”。而CNN的权值共享和局部感受野能先做一步关键筛选,把原始输入转化成更紧凑的特征序列,再喂给BiLSTM,后者就可以集中精力学时间先后关系。
反过来只用CNN也不行。CNN擅长提取局部特征,但感受野始终有限,哪怕堆很多层,对长距离依赖的建模能力依然弱于LSTM。另一个现实问题是,CNN的输出是定长的,对变长时间序列不友好,而LSTM天然支持变长序列。所以CNN-BiLSTM是一种互补结构:先用CNN收拾局部特征,再用BiLSTM收拾全局时序,各干各擅长的事。
| 模型 | 优点 | 缺点 |
|---|---|---|
| 纯LSTM | 时序建模强,结构简单 | 高维多变量输入时特征利用效率低 |
| 纯CNN | 训练快,局部特征提取能力强 | 长期依赖建模弱,感受野受限 |
| BiLSTM | 双向上下文建模,长依赖好 | 参数多,训练慢,容易过拟合 |
| CNN-BiLSTM | 局部特征与双向时序兼顾 | 超参数变多,调参成本上升 |
Matlab这块的实现也有别的选择,比如GRU、Attention、Transformer,但对大多数工程场景来说,CNN-BiLSTM是一个性价比极高的方案:训练成本可控,预测精度已经能打赢大多数普通模型,而且Matlab的Deep Learning Toolbox对这些网络层的支持很完善,不需要自己写底层算子。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手之前:数据清洗、归一化与滑动窗口构造
2.1 数据清洗与归一化
很多人一上来就搭网络,结果预测效果稀烂,最后发现数据没洗干净。时间序列数据最容易出问题的地方就是缺失值。传感器断传、网络异常、人工记录漏写,都会产生NaN,深度学习模型遇到NaN基本就是灾难。常规做法是用fillmissing做线性插值,短段缺失线性插值够用,长段缺失可以考虑前面的均值填充,但别指望插值能创造信息,如果缺失太多,该删就删。
归一化这一步绝对不能省。CNN-BiLSTM用的是梯度下降类优化器
