共计 2533 个字符,预计需要花费 7 分钟才能阅读完成。
问题背景
非平稳时序信号预测在电力负荷、金融时间序列等领域具有重要应用价值。传统方法如 STFT 和 Wavelet 变换虽然能提供时频分析,但存在以下问题:

- 模态混叠:不同频率成分在时频平面上重叠,导致特征提取困难
- 窗口效应:固定窗口大小难以适应非平稳信号的局部特性
- 信噪比敏感:低信噪比环境下高频分量容易被噪声淹没
相比于 STFT 的固定分辨率和小波变换的基函数选择依赖,CEEMDAN 通过自适应噪声添加策略,实现了更优的模态分离效果。其核心优势在于:
- 噪声辅助分析避免模式混淆
- 自动确定本征模态函数 (IMF) 数量
- 残差分解更彻底
架构设计
CEEMDAN 部分
算法通过迭代添加自适应白噪声来改进 EMD 的模态混叠问题。关键步骤数学描述如下:
$$IMF_1 = \frac{1}{I}\sum_{i=1}^I E_1(x + \epsilon w_i)$$
$$r_k = r_{k-1} – IMF_k$$
其中:
– $E_k(\cdot)$ 表示第 k 阶 IMF 提取算子
– $w_i$ 为高斯白噪声
– $\epsilon$ 控制噪声强度
停止条件采用相对标准差(RDS):
$$RDS = \frac{\sum_{t=1}^T |h_{k-1}(t) – h_k(t)|^2}{\sum_{t=1}^T h_{k-1}^2(t)} < \delta$$
Transformer 部分
处理 IMF 分量的结构示意:
[Input] -> [IMF1] -> [IMF2] -> ... -> [IMFn]
| | |
[Embedding] [Embedding] [Embedding]
| | |
[Multi-Head Attention] <- [Positional Encoding]
|
[Prediction]
多头注意力机制允许模型同时关注不同 IMF 分量的时频特征,其计算公式:
$$Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V$$
代码实现
CEEMDAN 停止条件实现
def check_stopping_criterion(h_prev, h_current, threshold=0.05):
"""
计算相对标准差 (RDS) 判断是否停止分解
Args:
h_prev (np.array): 前次迭代结果
h_current (np.array): 当前迭代结果
threshold (float): RDS 阈值
Returns:
bool: 是否停止分解
"""
numerator = np.sum((h_prev - h_current)**2)
denominator = np.sum(h_prev**2)
rds = np.sqrt(numerator / denominator)
return rds < threshold
IMF 与 Transformer 接口设计
class IMF2Tensor(nn.Module):
def __init__(self, d_model):
super().__init__()
# 每个 IMF 分量独立嵌入
self.embedding = nn.Linear(1, d_model)
def forward(self, imfs):
"""
Args:
imfs (list): 可变长度的 IMF 分量列表
Returns:
torch.Tensor: [seq_len, batch, d_model]
"""
# 对每个 IMF 进行零填充和嵌入
max_len = max(imf.shape[0] for imf in imfs)
embedded = []
for imf in imfs:
padded = F.pad(imf, (0, max_len - imf.shape[0]))
embedded.append(self.embedding(padded.unsqueeze(-1)))
return torch.stack(embedded, dim=1)
变长 Positional Encoding
class AdaptivePositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
super().__init__()
position = torch.arange(max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))
pe = torch.zeros(max_len, d_model)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe)
def forward(self, x):
"""
Args:
x: [seq_len, batch, d_model]
"""
# 动态截取实际序列长度
return x + self.pe[:x.size(0)]
实验环节
数据集与基线
使用 UCI 电力负荷数据集,对比模型包括:
- LSTM
- EMD-LSTM
- Wavelet-Transformer
- 本文方法
关键指标
| Model | MAE | RMSE | Memory(MB) |
|---|---|---|---|
| LSTM | 0.142 | 0.198 | 1,024 |
| EMD-LSTM | 0.121 | 0.173 | 1,280 |
| Wavelet-TF | 0.115 | 0.162 | 1,536 |
| CEEMDAN-TF | 0.089 | 0.125 | 1,344 |
生产建议
IMF 数量与数据量关系
- 样本量 <10k:IMF 数量建议 3 - 5 个
- 样本量 10k-100k:5- 8 个
- 样本量 >100k:通过 RDS 自动确定
注意力头数选择
经验公式:
$$heads = \lceil log_2(IMF_{count}) \rceil + 1$$
增量更新策略
- 固定 CEEMDAN 分解层数
- 仅微调 Transformer 最后两层
- 使用滑动窗口更新历史均值
开放问题
- 如何量化评估不同 IMF 分量对最终预测的贡献度?
- 在边缘计算场景下,如何平衡 CEEMDAN 的计算开销与预测精度?
通过本文的实现可以看到,CEEMDAN-Transformer 架构在保持模型解释性的同时,显著提升了非平稳时序信号的预测精度。特别是在处理电力负荷这类具有明显周期突变特征的数据时,自适应分解与全局注意力机制的组合展现出独特优势。
