功能概述
该代码实现了一种基于变分模态分解(VMD)与双向长短期记忆网络(BiLSTM)的滚动多变量时间序列预测方法,专门用于防止在时间序列预测中因使用未来数据而导致的信息泄露问题。核心思想为:在预测未来每一步时,仅使用截至当前时刻的已知数据重新进行模态分解,再对每个模态分别建模预测,最后集成重构,从而保证模型的真实可用性与泛化能力。
主要功能:
- 对目标时间序列进行在线滚动 VMD 分解(随新数据到来动态更新分解结果)。
- 为每个 VMD 分解出的本征模态函数(IMF)训练独立的 BiLSTM 网络。
- 利用历史多变量特征(含目标变量历史值)构造滑动窗口输入,预测未来单步或多步目标值。
- 评估模型在测试集上的 RMSE、MAE、MAPE、R² 指标,并提供丰富的可视化图表。
算法步骤与技术路线
1. 数据准备与初始划分
- 读取 Excel 数据(
data.xlsx),前四列为特征 A~D,第五列为待预测目标 E。 - 按时间顺序划分训练集(前 70%)和测试集(后 30%),初始时仅训练集目标值对模型已知。
2. 滚动分解预测循环(逐测试点推进)
对于每一个测试点t=1,2t = 1, 2t=1,2,…\dots…,NtestN_{\text{test}}Ntest:
- VMD 分解:对当前累积已知目标序列执行 VMD,得到KKK个 IMF 分量。
- 模态独立建模:对每个 IMF,利用全部已知特征矩阵(包含特征列与目标历史)构造输入输出样本,训练 BiLSTM 网络,并预测未来第zimzimzim步的该模态值。
- 模态集成:将所有 IMF 预测值相加,得到目标变量的最终预测值。
- 数据集更新:将当前测试点的真实值(含所有特征与目标)追加至已知数据池,供下一轮分解与训练使用。
3. 误差评估与结果可视化
- 计算测试集上的 RMSE、MAE、MAPE、R²。
- 绘制预测对比曲线、回归散点图、误差直方图、最后一次 VMD 分解子图、各模态预测贡献柱状图以及功率谱密度图。
涉及公式与核心原理
变分模态分解(VMD)
VMD 将非平稳信号f(t)f(t)f(t)分解为KKK个具有稀疏中心频率的窄带 IMFuk(t)u_k(t)uk(t),求解如下约束变分问题:
min{uk},{ωk}{∑k=1K∥∂t[(δ(t)+jπt)∗uk(t)]e−jωkt∥22}s.t.∑k=1Kuk=f(t) \min_{\{u_k\},\{\omega_k\}} \left\{ \sum_{k=1}^{K} \left\| \partial_t \left[ \left( \delta(t) + \frac{j}{\pi t} \right) * u_k(t) \right] e^{-j\omega_k t} \right\|_2^2 \right\} \quad \text{s.t.} \quad \sum_{k=1}^{K} u_k = f(t){uk},{ωk}min{k=1∑K∂t[(δ(t)+πtj)∗uk(t)]e−jωkt22}s.t.k=1∑Kuk=f(t)
引入二次惩罚因子α\alphaα与拉格朗日乘子λ\lambdaλ,通过交替方向乘子法(ADMM)迭代求解。
BiLSTM 预测模型
BiLSTM 包含前向和后向 LSTM 层,能够同时捕捉序列的过去与未来上下文信息(训练时未来信息已知,但预测时仅使用历史窗口输入)。代码中采用'OutputMode', 'last'仅取最后时间步的双向输出。
数据归一化
使用mapminmax将输入与输出映射至[0,1][0,1][0,1]:
xnorm=x−xminxmax−xmin x_{\text{norm}} = \frac{x - x_{\min}}{x_{\max} - x_{\min}}xnorm=xmax−xminx−xmin
预测误差指标
- RMSE:1n∑i=1n(yi−y^i)2\sqrt{\frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2}n1∑i=1n(yi−y^i)2
- MAE:1n∑i=1n∣yi−y^i∣\frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i|n1∑i=1n∣yi−y^i∣
- MAPE:1n∑i=1n∣yi−y^iyi∣×100%\frac{1}{n}\sum_{i=1}^n \left|\frac{y_i - \hat{y}_i}{y_i}\right| \times 100\%n1∑i=1nyiyi−y^i×100%
- R²:1−∑(yi−y^i)2∑(yi−yˉ)21 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}1−∑(yi−yˉ)2∑(yi−y^i)2
参数设定一览
| 参数名 | 取值 | 含义 |
|---|---|---|
kim | 4 | 历史窗口长度(使用过去 4 步数据预测未来) |
zim | 1 | 预测步长(预测未来 1 步目标值) |
K_imf | 6 | VMD 分解模态个数 |
alpha | 2000 | VMD 惩罚因子(控制带宽约束强度) |
tau | 0 | 噪声容忍度(通常为 0) |
DC | 0 | 是否保留直流分量(0 为不保留) |
init | 1 | 初始化方式(1 为随机初始化) |
tol | 1e-7 | VMD 收敛容差 |
train_ratio | 0.7 | 初始训练集比例 |
bilstm_units | 64 | BiLSTM 隐藏层单元数 |
max_epochs | 200 | 最大训练轮数 |
mini_batch_size | 24 | 批量大小 |
initial_lr | 1e-3 | 初始学习率(随轮次下降) |
LearnRateDropFactor | 0.2 | 学习率下降因子 |
LearnRateDropPeriod | 80 | 学习率下降周期(轮) |
运行环境要求
- 软件:MATLAB(建议 R2019b 及以上版本)
- 数据格式:Excel 文件
.xlsx,第一行为表头,数据列为连续数值型。
应用场景
该方法适用于对数据时效性要求严格、禁止未来信息泄露的中长期时间序列预测任务,典型场景包括:
- 能源领域:电力负荷预测、风电/光伏出力预测(需逐日更新并重分解)
- 金融工程:股票价格或波动率预测(逐笔交易不可使用未来信息)
- 工业过程控制:传感器信号趋势预测(在线监测需滚动更新模型)
- 气象/环境:气温、空气质量指数预报(数据实时新增)
其滚动分解机制保证了模型在真实部署时能始终基于当前最新信息进行建模与预测,避免了传统一次性全局分解可能引入的未来数据污染问题。