FredNormer: 非平稳时间序列预测的频域正则化方法

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: FredNormer是一种创新的频域正则化方法,旨在提高时间序列预测模型处理非平稳数据的能力。现有正则化技术虽在分布偏移上有所成效,但在频域动态模式捕捉方面存在不足。FredNormer通过自适应增强关键频率分量的权重,解决了这一问题,并设计了即插即用模块,便于集成到各类预测模型中。实验表明,FredNormer在多个公共数据集上显著提升了预测精度,特别是在复杂频率特征的数据集上效果显著。此外,其计算效率也优于现有方法。该方法为非平稳时间序列预测提供了有力工具。

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。

FredNormer论文的研究目的主要包括:

  1. 理论分析现有正则化方法如何影响频率分量,并证明它们在处理非零频率时的局限性。
  2. 提出一种新的频域正则化方法,能够自适应地增强关键频率分量的权重。
  3. 设计一种即插即用的模块,可以轻松集成到各种预测模型中,而不影响效率。

方法改进

FredNormer的核心思想是从频率角度观察数据集,并自适应地增加关键频率分量的权重。

该方法主要包含两个关键组件:

1、频率稳定性度量

FredNormer首先定义了一个频率稳定性度量,用于量化每个频率分量在训练集中的统计显著性:

 S(k) =μ(A(k)) /σ(A(k))

其中,μ(A(k))和σ(A(k))分别表示第k个频率分量幅度的均值和标准差。这个度量具有以下特点:

  • 捕捉了每个频率分量在整个训练集中的分布情况
  • 无量纲,允许公平比较不同频率分量
  • 避免了均匀频率缩放的问题

2、频率稳定性加权层

这一层的主要功能是根据稳定性动态调整频率分量的权重。具体步骤如下:

对输入时间序列数据进行差分和离散傅里叶变换(DFT)

将DFT系数分解为实部和虚部

应用两个线性投影到频率稳定性度量S上:

 F'r = Fr ⊙ (S × Wr + Br)
 F'i = Fi ⊙ (S × Wi + Bi)

将加权后的频谱通过逆DFT变换回时间域

这种设计允许模型分别处理实部和虚部,从而捕捉更丰富的时间动态。

3、代码实现

我们这里根据论文中的描述实现一个FredNormer的基本版本。这个实现可能不包含所有的优化和细节,但它应该能够展示FredNormer的核心概念。

导入必要的库并定义FredNormer类:

 importnumpyasnp
 importtorch
 importtorch.nnasnn
 importtorch.fftasfft

 classFredNormer(nn.Module):
     def__init__(self, num_channels, seq_length):
         super(FredNormer, self).__init__()
         self.num_channels=num_channels
         self.seq_length=seq_length
         self.freq_length=seq_length//2+1

         # 定义可学习的权重和偏置
         self.W_r=nn.Parameter(torch.randn(self.freq_length, num_channels))
         self.B_r=nn.Parameter(torch.zeros(self.freq_length, num_channels))
         self.W_i=nn.Parameter(torch.randn(self.freq_length, num_channels))
         self.B_i=nn.Parameter(torch.zeros(self.freq_length, num_channels))

     defcompute_stability(self, x):
         # 计算频率稳定性度量
         fft_x=fft.rfft(x, dim=1)
         amplitude=torch.abs(fft_x)

         mean=torch.mean(amplitude, dim=0)
         std=torch.std(amplitude, dim=0)

         stability=mean/ (std+1e-5)  # 添加小值以避免除零
         returnstability

     defforward(self, x):
         # 应用一阶差分
         x_diff=torch.diff(x, dim=1, prepend=x[:, :1])

         # 计算FFT
         fft_x=fft.rfft(x_diff, dim=1)

         # 计算稳定性度量
         stability=self.compute_stability(x)

         # 分离实部和虚部
         real=fft_x.real
         imag=fft_x.imag

         # 应用频率稳定性加权
         real=real* (stability*self.W_r+self.B_r)
         imag=imag* (stability*self.W_i+self.B_i)

         # 重构复数FFT
         fft_weighted=torch.complex(real, imag)

         # 应用逆FFT
         x_normalized=fft.irfft(fft_weighted, n=self.seq_length, dim=1)

         returnx_normalized

 # 使用示例
 seq_length=96
 num_channels=7
 batch_size=32

 # 创建一个随机输入张量
 x=torch.randn(batch_size, seq_length, num_channels)

 # 初始化FredNormer
 frednormer=FredNormer(num_channels, seq_length)

 # 应用FredNormer
 x_normalized=frednormer(x)

 print(f"Input shape: {x.shape}")
 print(f"Output shape: {x_normalized.shape}")

这个实现包含了FredNormer的主要组件:

compute_stability: 计算频率稳定性度量。

forward: 实现了FredNormer的前向传播,包括:

  • 应用一阶差分
  • 计算FFT
  • 计算稳定性度量
  • 应用频率稳定性加权
  • 应用逆FFT

要将FredNormer集成到完整的预测模型中,可以这样做:

 classTimeSeriesModel(nn.Module):
     def__init__(self, input_dim, hidden_dim, output_dim, seq_length):
         super(TimeSeriesModel, self).__init__()
         self.frednormer=FredNormer(input_dim, seq_length)
         self.lstm=nn.LSTM(input_dim, hidden_dim, batch_first=True)
         self.fc=nn.Linear(hidden_dim, output_dim)

     defforward(self, x):
         x=self.frednormer(x)
         lstm_out, _=self.lstm(x)
         returnself.fc(lstm_out[:, -1, :])

 # 使用示例
 input_dim=7
 hidden_dim=64
 output_dim=1
 seq_length=96
 batch_size=32

 model=TimeSeriesModel(input_dim, hidden_dim, output_dim, seq_length)
 x=torch.randn(batch_size, seq_length, input_dim)
 output=model(x)

 print(f"Input shape: {x.shape}")
 print(f"Output shape: {output.shape}")

我们上面的代码将FredNormer作为预处理步骤集成到一个基于LSTM的时间序列预测模型中。

这个实现是基于论文的描述,可能需要进一步的调整和优化以达到论文中报告的性能。另外在实际应用中可能还需要添加训练循环、损失函数、优化器等组件。

实验设置与结果

研究者使用了7个公共时间序列数据集进行实验,包括Weather、ETT系列(ETTh1, ETTh2, ETTm1, ETTm2)、Electricity和Traffic。这些数据集涵盖了不同的时间粒度和应用场景。

基线模型与骨干网络

FredNormer与两个主要的基线方法进行了比较:

  • RevIN: 一种广泛使用的基本正则化模块
  • SAN: 当前最先进的正则化方法

实验中使用了三种不同的预测模型作为骨干网络:

  • DLinear: 一种基于MLP的轻量级模型
  • PatchTST: 一种基于Transformer的模型,使用补丁操作捕捉局部时间模式
  • iTransformer: 另一种Transformer模型,强调通道间的注意力机制

实验结果

整体性能:

  • FredNormer在所有数据集上都显著改善了骨干模型的性能
  • 在具有复杂频率特征的数据集(如ETTm2)上,FredNormer将PatchTST和iTransformer的性能分别提高了33.3%和55.3%

与基线方法的比较:

  • 在28个设置中,FredNormer取得了18个第一名和6个第二名的结果
  • 在ETTh1数据集上,FredNormer将DLinear和iTransformer的MSE值分别降低到0.407和0.445,优于RevIN(0.460和0.463)和SAN(0.421和0.466)

运行时间:

  • FredNormer在计算时间上始终优于SAN
  • 在28个设置中的16个中,FredNormer实现了60%到70%的速度提升

消融研究

研究者还进行了消融研究,将频率稳定性度量替换为两种替代滤波器:低通滤波器和随机频率选择。结果显示,FredNormer的频率稳定性分数始终实现了最佳准确性,证明了从频谱中提取稳定特征有助于模型学习一致的模式。

可视化分析

在Traffic、ETTh1和ETTh2数据集上应用FredNormer前后的输入序列可视化

如上图所示,绿线表示输入数据,蓝线表示预测目标,橙线表示FredNormer生成的输入数据,红线表示每个数据集的频率稳定性度量。这个分析展示了:

  1. FredNormer能够自适应地为不同数据集分配权重
  2. 该方法能够识别并增强在输入序列和预测目标中都出现显著波动的分量
  3. 即使某些频率分量的幅度较低,只要它们表现出一致性,FredNormer也会为其分配较高的权重

总结

FredNormer通过在频域中处理非平稳性,为时间序列预测提供了一种新的视角。它不仅在理论上分析了现有方法的局限性,还提出了一种简单而有效的解决方案。实验结果表明,FredNormer在多个数据集和预测模型上都取得了显著的性能提升,同时保持了较低的计算开销。这种方法为处理复杂的非平稳时间序列数据提供了一个强大而灵活的工具。

论文地址:

https://avoid.overfit.cn/post/85db3d9e923c4562a6206f1c9b38d120

目录
相关文章
|
19天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2559 21
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
12天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
14天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
16天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1550 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
18天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
767 14
|
13天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
571 8
|
6天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
158 69
|
6天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
147 69
|
18天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
601 52
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界