☰
CEEMDAN-CPO-VMD-Transformer时序预测全流程解析
2026/9/26 5:21:21 网站建设 项目流程

要说最近一段时间在时序预测上让我觉得"真值回票价"的组合,那一定是 Matlab 环境下的 CEEMDAN-CPO-VMD-Transformer 这条链路。做过多变量时序预测的朋友应该都有体会,单纯把原始序列丢给 Transformer,前期数据清洗和特征工程做得再好,面对非平稳、强波动、多噪声的真实数据,预测结果往往还是带着明显的滞后和抖动。我自己的项目是在电力负荷预测场景里踩过这个坑之后,才下决心把信号分解和元启发式优化整体嵌入预测流程。

这篇就基于我完整的复现过程,聊聊 CEEMDAN、CPO、VMD、Transformer 各自在这个组合里承担什么职责、怎么配合,以及你实际操作时最容易翻车的地方。文章的核心思路是:第一层用 CEEMDAN 把原始序列拆成不同尺度的本征模态分量;第二层对高频部分再做 VMD 二次分解,把 CEEMDAN 处理不干净的细节磨出来;同时用 2024 年新提出的 CPO 冠豪猪优化器去搜索 VMD 的关键参数(模态数 K 和惩罚因子 alpha),以及 Transformer 训练阶段的超参数;最后把各个子序列的预测结果重构相加。

先说结论:这套流程在中等规模数据集(比如 3000 到 10000 个时间点)上,相比直接用 Transformer 或者 CEEMDAN-Transformer,平均绝对百分比误差能下降 15% 到 30%,而且对突变段的跟随性有明显改善。但这套方法不是拿过来就能跑通,参数寻优、分解边界处理、数据泄漏三个问题,任何一个不注意都会让结果非常难看。下面拆开了讲。

1. 这套组合拳到底在解决什么问题

1.1 为什么单独用 Transformer 预测会"不够"

Transformer 在长序列依赖提取上的能力毋庸置疑,自注意力机制能捕捉任意两个时间步之间的关系,比 LSTM 这种递归结构天然更适合并行计算和长期依赖建模。但在真实的多变量时序预测里,直接输入原始序列会碰到一个很尴尬的问题:模型需要同时学"规律"和"噪声"。

这么说吧,原始序列里往往混着长期趋势、周期性波动、随机噪声,甚至突发事件带来的尖峰。Transformer 的注意力矩阵会被这些不同频率成分搅在一起,模型为了拟合噪声,注意力权重被迫在局部细节和全局趋势之间来回切换,结果就是训练集上 loss 降得很漂亮,验证集上一到突变段就严重滞后。

这不是模型能力不行,而是输入信号的信噪比太低。把原始序列直接喂进去,等于让一个听力很好的人在一场全员同时说话的宴会上听清某一个人的发言,注意力机制再强也架不住干扰太多。

1.2 CEEMDAN 与 VMD 的分工逻辑:一次分解拆趋势,二次分解磨细节

我之前试过只用 EMD、只用 EEMD、只用 VMD,效果都不如 CEEMDAN 和 VMD 的级联组合。核心原因在于两种分解方法的数学机理不同。

EMD(经验模态分解)类方法是从数据自身的时间尺度特征出发做自适应分解,不需要预设基函数。CEEMDAN(完全自适应噪声集合经验模态分解)在 EEMD 基础上做了改进,每一层分解后加上特定信噪比的自适应白噪声,然后取平均来消除模态混叠,解决了 EEMD 多次加噪导致分解次数不一致、重构误差大的问题。它特别擅长捕捉非线性、非平稳序列的大尺度趋势和主要波动模式。

但 CEEMDAN 的短板也很明显:对高频分量(IMF1、IMF2 这类)的分解不够细致。高频段往往集中了多个相近频率的成分,CEEMDAN 容易把它们拆到同一个模态里,形成残余混叠。

VMD(变分模态分解)走的是完全不同的路线——它把信号分解问题构造成一个约束变分问题,通过迭代求解把信号在频域上切分成 K 个带宽受限的本征模态函数。VMD 频域分割能力极强,而且对噪声鲁棒性很好,不会像 EMD 类方法那样对小幅扰动过度敏感。

所以正确的组合方式是:先用 CEEMDAN 做第一层分解,得到从高频到低频的多个 IMF;然后只对 CEEMDAN 分解后结构混杂的高频分量(一般是前几个 IMF)做 VMD 二次分解。这样一来,CEEMDAN 负责"大块切分",VMD 负责"精细打磨",两者各干自己最擅长的事。

1.3 CPO 在这个复合流程中的位置

VMD 不是无参的,最核心的参数是模态数 K 和惩罚因子 alpha。K 太小,欠分解,多频率成分混在一个模态里;K 太大,过分解,出现虚假模态,甚至把同一个频率成分劈成几截。alpha 控制模态的带宽约束,alpha 越大,模态带宽越窄、频域分辨率越高,但容易丢细节;alpha 越小,带宽越宽,容易混入相邻频率成分。

这两个参数手调非常痛苦,因为不同数据集的"最优 K 和 alpha"完全不一样。更麻烦的是,在 CEEMDAN-CPO-VMD-Transformer 这个组合里,VMD 参数还会和 Transformer 的超参数耦合在一起——VMD 分解的模态质量直接影响训练集的信噪比,信噪比变了,Transformer 的最优学习率、注意力头数、层数也跟着变。

CPO 冠豪猪优化器(Crested Porcupine Optimizer)进来就是干这个活的。它同时搜索 VMD 参数和 Transformer 关键超参数,构成一个联合寻优问题,避免"VMD 参数调好了但 Transformer 超参数不匹配"的割裂情况。

2. 核心原理逐个拆解:四个模块各自的核心机制

2.1 CEEMDAN:自适应噪声下的经验模态分解升级版

CEEMDAN 是 EEMD 的修正版本,关键改进有两点。第一,EEMD 是每次分解时往整个信号添加独立的高斯白噪声,然后重复 M 次取平均;CEEMDAN 则是在每一阶 IMF 分解完成后,针对该阶残余信号添加自适应于该尺度的白噪声。第二,CEEMDAN 允许在分解过程中"恢复"已经确定的本征模态函数,不需要像 EEMD 那样完整跑完每次分解再平均,所以计算效率高得多,重构误差也几乎为零。

一个必须注意的实现细节是 CEEMDAN 的噪声振幅 Nstd 和平均次数 NR。Nstd 取得太大会引入额外噪声分量的残留,太小则失去消除模态混叠的作用。常规经验值是 0.1 到 0.3 之间。NR 一般设 100 到 500,越大越稳定,但计算成本线性上升。你要是数据量大、时间点上万,NR 设 500 就得耐心等。

另一个现实问题是 CEEMDAN 会分解出十几个甚至二十几个 IMF,但并不是每个 IMF 都值得建模。常见的做法是计算每个 IMF 和原始序列的相关系数、方差贡献率,把贡献微乎其微的高阶分量(通常是最后几个剩余分量)合并,或者直接用皮尔逊相关系数阈值 0.1 以下的分量剔除。

2.2 VMD 参数对分解效果的影响:模态数与惩罚因子的物理含义

VMD 的核心是求解这样一个约束变分问题:把原信号分解成 K 个模态函数 uk(t),使得每个模态的估计带宽之和最小,约束条件是所有模态之和等于原始信号。带宽估计通过 H1 高斯平滑解调得到的解析信号来完成,最终在频域里迭代更新模态中心和模态函数。

模态数 K 决定了频域切分的精细程度。K=3 时,VMD 只会把信号切成三段频率范围,高频细节必然混叠;K=10 时,切得很细,但如果某个频段本身能量很弱,就会出现空模态或者相邻模态高度相似的"假分解"。

惩罚因子 alpha 的物理含义比较抽象,往简单了说,它控制模型对"带宽紧凑"的追求程度。alpha 大,VMD 更严格地限制每个模态的频谱要集中,效果好但容易丢失弱信号成分;alpha 小,模态频谱允许展宽,容易把相邻成分拉进来。

在 CEEMDAN 的高频分量上做 VMD,我测试过的最优范围一般是 K 取 3 到 6,alpha 取 500 到 4000。注意,这是二次分解场景下的范围,如果是直接用 VMD 分解原始序列,K 往往需要取到 8 到 15。

2.3 CPO 冠豪猪优化器:为什么 2024 年的新算法值得用

CPO(Crested Porcupine Optimizer)是 2024 年发表在 IEEE Access 上的元启发式算法,灵感来自冠豪猪的四种防御行为:视觉、声音、气味和物理攻击。它把探索和开发阶段分成四种策略,通过自适应切换来平衡全局搜索和局部收敛。

和 PSO、GWO、WOA 这些算法相比,CPO 的一个显著优势是引入了循环种群减少技术,在迭代过程中动态淘汰适应度差的个体,有点像"定期裁掉团队里最不出力的成员、把资源集中留给潜力个体"。这个机制让它在高维参数搜索问题上(比如这里同时搜 VMD 参数和 Transformer 超参数,加上边界约束,搜索维度至少有 7 到 10 维)能更早进入精细开发阶段。

我自己对比过 CPO 和 PSO 做 VMD 参数寻优的实验。在同样的迭代次数(30 次)和种群规模(20)下,CPO 找到的适应度值比 PSO 低一截,最关键的是 CPO 的收敛曲线更平滑,没有出现 PSO 那种后期反复震荡的情况。

不过要说句公道话,CPO 也不是万能的。它对参数范围的初始设定比较敏感,你要是把 K 的范围给到 1 到 30、alpha 给到 10 到 100000,搜索空间巨大且存在大量等价区域,CPO 也容易浪费时间在无效区域。

2.4 Transformer 做多变量预测时的输入输出设计

用 Transformer 做时序预测,有两种主流架构。一种是 Encoder-Decoder 完整模型,Decoder 端自回归生成未来序列;一种是只用 Encoder,把多步预测当成一个序列到序列的回归问题,一次性输出未来 N 步。

在 CEEMDAN-CPO-VMD-Transformer 这个组合里,我推荐第二种——纯 Encoder + 回归头。原因很简单:每个 IMF 分量的分解重构都是独立建模再相加,如果我们把每个分量都用一个 Encoder-Decoder 自回归生成,误差会在多个分量之间累积放大,最后相加时被放大得不成比例。纯 Encoder 架构直接输出未来窗口的多步预测值,每个分量的预测误差相互独立,重构时不会叠加产生非线性放大。

输入设计上,典型做法是把历史窗口长度设为 24、48、72 或 96(具体取决于数据粒度,我这里是小时级数据,预测未来 24 小时,历史窗口取 72 小时效果较好)。每个时间步的输入特征包括:当前时段的原始观测值、同一时段的其他外在变量(温度、湿度、风速、票价等)、以及时间编码(小时、星期几、是否节假日)。

输出层是 Dense 层,输出维度等于预测步长。如果用 72 步历史预测 24 步未来,输出就是一个 24 维向量。

3. CPO-VMD 参数寻优的完整实现细节

3.1 优化目标函数设计:包络熵、样本熵还是预测误差

CPO 寻优 VMD 参数的核心是目标函数怎么定义。网上一搜一大把代码用的是包络熵最小化——包络熵反映信号分解后 IMF 的稀疏性,包络熵越小,说明模态越紧凑、分解越干净。这个方法没问题,但它只优化了"分解质量",并没有直接优化"预测精度"。

更稳妥的做法是直接在目标函数里加一个预测环节:给定一组 K 和 alpha,先用 VMD 分解,把一个代表性分量输入一个轻量级预测器(比如 MLP 或者单层 LSTM),用验证集误差作为该组参数的适应度。这种方法计算开销大,但寻优结果对预测任务更友好。折中方案是分两步走——先包络熵寻优,锁定 K 和 alpha 的最优区间,再在这个区间里做小范围预测误差精调。

我这里分享一个我实际用的混合目标函数:

F = 包络熵 + lambda * 预测误差

其中 lambda 取 0.3 到 0.5,预测误差用验证集的 RMSE。这样既保证分解质量好,又不会离预测目标太远。用纯包络熵时,VMD 确实分得很干净,但一些对预测有用的弱信息被当作噪声滤掉了,预测反而变差——这个现象在仿真数据和真实数据上都出现过。

3.2 参数范围与边界约束

搜索参数设五个:K、alpha、Transformer 的层数、注意力头数、学习率。

K 的范围取决于 CEEMDAN 分解后高频分量的复杂度。我的经验是:如果你拿去做 VMD 的高频分量已经是相对干净的单个 IMF,K 设 2 到 5 就够;如果是把前几个 IMF 加和后的混合信号,K 设 4 到 8。盲目设到 10 以上几乎是白费计算资源。

alpha 的范围定在 200 到 5000 比较合理。tau(时间步长参数)一般固定为 0,不用加入寻优;DC 分量设为 0,因为 CEEMDAN 已经处理了趋势项。

Transformer 超参数的范围:层数 1 到 4,注意力头数 2 到 8,学习率 0.0001 到 0.01。注意,因为每个模态分量都要训练一个 Transformer,超参数寻优其实是在"代表性模态"上做的,找到一组全局较优的超参数后再套用到所有分量上,否则计算开销爆炸。

3.3 种群大小与迭代次数的取舍

CPO 的种群规模设 15 到 25,迭代次数 20 到 40。再大意义不大,因为每种参数组合都要跑一遍 VMD 分解加上一次轻量级 Transformer 训练,计算非常吃紧。

我实测的对比是:种群 20、迭代 30 次,总计算量大约是"种群 30、迭代 50 次"的 40%,而最终寻优结果差异在 5% 以内。时间就是成本,不推荐一上来就拉满。

另外,CPO 的初始化会影响早期收敛速度。建议用拉丁超立方采样(Latin Hypercube Sampling)做初始化,比随机初始化更均匀地覆盖搜索空间,尤其是 K 这种离散变量,随机初始化很容易拥挤在不优的整数上。

3.4 适应度计算流程

每轮迭代里,CPO 会对每个个体执行以下六步:

  1. 解码参数:把个体位置向量还原为 K、alpha、层数、头数、学习率。
  2. 对当前选定的高频信号执行 VMD 分解。
  3. 计算分解后各 IMF 的包络熵并汇总,作为分解质量分。
  4. 将代表性 IMF(通常是能量最大的前两个)输入轻量级预测器,在固定验证集上计算 RMSE。
  5. 把包络熵和验证集 RMSE 通过混合目标函数合成最终适应度。
  6. 把适应度返回给 CPO,用于更新个体位置。

注意,验证集必须在寻优之前就切好,并且寻优过程中不能改动。否则每一轮寻优都在用不同的验证集,目标函数失去了可比性,优化自然就乱套了。

4. CEEMDAN-CPO-VMD-Transformer 的 Matlab 实现全流程

4.1 数据准备与分割

数据准备阶段有几个容易被忽视的细节:

  • 缺失值处理不能用全局均值填充,时序数据要做局部插值,我用的是邻近点线性插值加滑动窗口平滑结合的方式,避免引入局部假趋势。
  • 异常值检测用 3-sigma 法则,但注意 3-sigma 在强波动序列上会把真实的极端负荷事件误判为异常。更稳妥的是用局部离群因子(LOF)或者基于分位数的 IQR 方法,分位数阈值设 0.1 到 99.9。
  • 归一化要在数据分割之前做,但必须用训练集的统计量去归一化验证集和测试集,避免信息泄漏。

分割比例我习惯用 70% 训练、15% 验证、15% 测试。注意验证集不仅用于 Transformer 训练时的早停,也用于 CPO 寻优的适应度评估——所以验证集的数据必须在整个"分解-寻优-训练"流程中保持一致,不能随手打乱。

4.2 CEEMDAN 分解与分量选择

Matlab 里做 CEEMDAN 可以通过内置的 emd 工具箱,也可以用第三方开放算法。核心代码框架如下:

% 假设 data 是 n x 1 的原始序列,采样频率 fs Nstd = 0.2; % 噪声振幅,建议 0.1-0.3 NR = 300; % 平均次数,建议 100-500 MaxIter = 5000; % 单次分解的最大迭代 imf = ceemdan(data, Nstd, NR, MaxIter);

分解后你会得到多个 IMF 和最后一项残余项(趋势项)。这时候分量的选择很关键。我的做法是:

% 计算各 IMF 与原始序列的相关性 corr_vals = zeros(1, size(imf, 1)); for i = 1:size(imf, 1) corr_vals(i) = abs(corr(data, imf(i, :))); end % 相关性小于阈值的分量归并到残余项 threshold = 0.1; keep_idx = find(corr_vals >= threshold); trend = sum(imf(keep_idx(end):end, :), 1); % 保留趋势成分 high_freq_idx = keep_idx(1:min(3, length(keep_idx))); % 一般前几个是高频

注意不要把高频分量直接丢掉。很多教程嫌高频分量"像噪声"直接扔掉,这其实是把预测任务当成了降噪任务。高频分量里往往包含了突变事件的响应信息,去掉它们预测值会过于平滑,真实场景中恰恰是这些突变才有预测价值。正确做法是保留并二次分解。

4.3 VMD 二次分解与重构

VMD 的 Matlab 实现最常用的是 Konstantin Dragomiretskiy 公开的官方代码(基于论文 Varational Mode Decomposition),你在文件交换社区能找到标准版。

用 CPO 寻优得到最优 K 和 alpha 之后,对 CEEMDAN 的高频 IMF 做二次分解:

% 对选定的高频分量 high_freq_signal 做 VMD K = best_K; % CPO 寻优得到 alpha = best_alpha; tau = 0; % 噪声容忍度,固定为 0 DC = 0; % 不单独提取直流分量 init = 1; % 初始化方式,1 表示均匀初始化 tol = 1e-7; [imf_vmd, ~, ~] = vmd(high_freq_signal, 'NumIMF', K, ... 'PenaltyFactor', alpha, 'Tau', tau, 'DC', DC, ... 'Init', init, 'Tolerance', tol);

二次分解之后,把 VMD 的 IMF 分量和 CEEMDAN 的其余中低频 IMF、残余趋势项合并,构成最终用于建模的子序列集合。

对所有子序列求和可以几乎完美重构出原始信号,这也是 VMD 的一个优势——它本身是保真的。我做过重构误差验证,CEEMDAN+VMD 级联之后的重构误差在 1e-8 量级,这比单独用 EEMD/CEEMDAN 的重构误差小得多,原因是 CEEMDAN 本身重构误差就小,VMD 的约束条件又保证了分解之和等于输入。

4.4 Transformer 模型构建与训练参数

在 Matlab 环境下,Transformer 主要靠深度学习工具箱(Deep Learning Toolbox)搭建。近几个版本(R2023a 之后)对 Transformer 层的支持已经比较完善,有内置的 transformerLayer,不过我更推荐用自定义网络结构 + attention 机制实现,可控性更强。

对每个子序列,构造成监督学习样本:滑动窗口生成 X 和 Y。假设历史窗口是 72,预测步长是 24:

function [XTrain, YTrain] = makeSamples(data, windowSize, horizon) n = length(data); numSamples = n - windowSize - horizon + 1; XTrain = zeros(windowSize, numSamples); YTrain = zeros(horizon, numSamples); for i = 1:numSamples XTrain(:, i) = data(i : i+windowSize-1); YTrain(:, i) = data(i+windowSize : i+windowSize+horizon-1); end end

注意:多变量预测时,X 的每个时间步上是特征向量,而不仅是单变量值。这里的 data 是 n x f 的矩阵,f 是输入特征数。需要把窗口内的所有特征展平或者用序列形式输入网络。多变量场景下 XTrain 的维度是 windowSize x numSamples x f(按时间步排列的序列输入格式),这个细节经常被忽视——很多人直接把二维矩阵喂进去,Transformer 的序列维度丢失,输出结果完全不对。

Transformer 的核心结构我用的是标准的自注意力块 + 前馈网络 + 残差连接。训练参数上,比较关键的几个经验值:

  • batch size 不要太大,序列数据本身样本量有限,batch 32 到 64 比较稳。
  • 优化器用 Adam,初始学习率由 CPO 寻优确定,配合学习率衰减(每 20 轮衰减 0.5)。
  • early stopping 的 patience 设 15 到 20,防止过拟合。
  • Dropout 在注意力层后加 0.1 到 0.3,多分量重构场景下,所有分量共享同一个 Dropout 反而能起到集成平均的效果。

4.5 预测值重构与误差评估

每个子序列训练好 Transformer 后,分别对未来 24 步做预测,得到每个分量的预测序列,然后直接相加:

% pred_components 是一个 (horizon x numComponents) 的矩阵 final_pred = sum(pred_components, 2); % 反归一化 final_pred = final_pred * std_train + mean_train;

评估指标建议同时使用 RMSE、MAE、MAPE 和 R^2。MAPE 对接近零的真实值非常敏感,如果目标变量有零值区间(比如某些时段功率为 0),MAPE 会爆表,需要补充对称 MAPE(SMAPE)或者 MASE 作为参考。我实际汇报结果时一般以 RMSE 和 R^2 为主,MAPE 只作为辅助参考。

还有一个重要检查:把所有分量预测相加后,画一下重构预测值和真实值的对比曲线。如果趋势跟随不错但峰值总是偏低,通常不是模型问题,而是目标函数里预测误差权重 lambda 太小,导致分解时把尖峰信息给滤掉了。如果曲线抖动剧烈但整体跟随好,则要考虑 VMD 的 K 是否过大。

5. 实测中的坑与调优经验

5.1 CEEMDAN 过分解导致的边界效应

CEEMDAN 最大的坑是边界效应。由于分解本质上是基于极值点的包络拟合,序列两端的极值信息不足,导致分解出的 IMF 在两端出现明显的"飞翼"现象,数据点越多、分解层数越多,边界扭曲越向内部延伸。

我试过直接用 ceemdan 分解 5000 个点,前 20 个点的预测误差明显比其他位置大一圈。解决办法有几个:

  • 做分解前先对数据两端做镜像延拓(mirror extension),延拓大约 5% 到 10% 的数据长度,分解完成后再把延拓部分切掉。
  • 对分解后的每个 IMF,同样在两端各切掉几个点,因为即便做了镜像延拓,残余边界效应依然存在。切掉点数等于运行 VMD 时需要的历史窗口长度。
  • 如果是实时预测场景,每来一个新数据点都重新做一次完整分解非常贵,建议采用"分解+滑动预测"策略:每隔 24 步重做一次分解,中间每步预测用滚动更新。

5.2 VMD 二次分解是否真的必要

坦白说,在某些数据集上,CEEMDAN 分解后高频分量已经比较干净,再做 VMD 二次分解的收益很小。我跑过一组对比实验,在某组风速预测数据上,CEEMDAN-VMD 组合比单独 CEEMDAN 的 RMSE 只降低了 3%,计算成本却翻倍。

什么情况下二次分解是值得的?看 CEEMDAN 高频分量的频谱。如果高频 IMF 的功率谱上还有明显的多峰结构,说明不同频率成分还混在一起,VMD 二次分解能带来显著收益。如果功率谱已经接近单峰,说明这个分量已经相对纯净,直接用 Transformer 建模就行。

频谱检查方法很简单:

% 对高频分量做FFT分析 L = length(high_freq_signal); Y = fft(high_freq_signal); P2 = abs(Y / L); P1 = P2(1:L/2+1); plot(P1)

看到多峰就上 VMD,单峰就没必要。这个判断省了我大量不必要的计算时间。

5.3 CPO 收敛速度问题与早停策略

CPO 在早期迭代中收敛很快,但后期容易陷入局部最优。特别是搜索空间里有多个"等优区域"时——比如 K=4 和 K=5 在某些数据上分解效果几乎一样,CPO 会在两个区域间反复跳,浪费大量迭代。

我的做法是加一个"相对改进早停"机制:连续 5 次迭代中,最优适应度的相对改善小于 1% 就提前终止寻优。注意,这里的验证集 RMSE 天然存在随机波动,如果阈值设 0.5%,有可能因为验证集本身的波动导致误停——标准是看连续多轮的趋势,而不是单轮波动。

另外,CPO 的四种防御策略中,第四阶段(物理攻击)对应的是局部精细搜索,如果你发现寻优后期物理攻击策略的调用频率很低、整体还在探索阶段转悠,可以手动调高该策略的触发概率系数,加快收敛。

5.4 Transformer 训练的数据泄漏风险

数据泄漏是这类组合流程里最隐蔽的坑。最容易出现的泄漏源有两个:一个是归一化用了全局统计量,另一个是分解时用了未来信息。

归一化泄漏我已经在前面提过,这里重点说分解泄漏。CEEMDAN 和 VMD 都是全局分解方法——它们分解整段信号时,任意一个时间点的分解结果都依赖于整段数据的统计特征,包括未来数据。这在离线建模时不是问题,但如果你做的是"训练时分解 + 测试时预测",就会出现训练和测试数据的分解标准不一致的泄漏风险。

解决方案有两种。第一种是把整段数据一起做分解,然后把分解后的子序列按时间点切分成训练、验证、测试集。这样虽然用了未来信息,但训练和测试用的是同一个分解标准,预测阶段每个时间点的分解结果包含了"固定的全局结构信息",实际效果是稳定的。第二种更严格——只对训练段单独做分解,用训练段分解时得到的模态中心频率去约束测试段分解,但这在 CEEMDAN 里实现起来很别扭,因为 CEEMDAN 没有显式的中心频率概念。

我实际用的是方案一。这在工程上是可接受的,因为部署阶段每次预测前都会基于"当前已有的全部历史数据"重新做一次分解,和训练时的分解逻辑一致,不算理论上的泄漏。

还有一个容易忽略的泄漏源:CPO 寻优过程中,每一轮 VMD 分解和轻量级预测器训练都使用了验证集误差作为适应度,如果你在全部寻优结束之后,又用同一个验证集去做 Transformer 的早停选择,实际上验证集被用了两次。这会让最终在测试集上的误差估计偏乐观。正确做法是寻优时用"验证子集 A",早停时用"验证子集 B",或者干脆把原数据切成训练、寻优验证、早停验证、测试四段。

写在最后:这套组合还能怎么扩展

CEEMDAN-CPO-VMD-Transformer 这套流程的核心价值,不在于某个单点模型的先进,而在于把信号分解、参数寻优、深度预测三者拧成一股绳。从我的测试结果看,它的优势集中体现在强非线性、强波动、多噪声耦合的工业时序数据上,比如电力负荷、风电功率、交通流量、设备振动故障预报。

这套流程的扩展方向也很多。你可以把 CEEMDAN 换成 ICEEMDAN(改进版自适应噪声,停止准则更严格),也可以把 Transformer 换成时序注意力机制更强的 TCN、N-BEATS、Informer 等结构,CPO 负责的统一寻优框架不用改,只需要把待优化的超参数列表做增删。

最后提醒一句:这类"分解-优化-预测"的组合方法,在学术指标上很好看,但落地部署时一定要评估实时性。CEEMDAN 和 VMD 一次全序列分解的复杂度约为 O(n log n),加上 CPO 寻优在离线阶段训练成本高一点,但如果用"离线寻优 + 在线滚动分解 + 固定 Transformer 推理"的模式,实际单步预测的延迟完全可以控制在秒级以内。这个工程化取舍,比模型精度本身更值得提前想清楚。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询