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

news2024/10/7 10:37:03

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型时代来了,35岁+程序员都去哪了?

在 AI 大潮中,AI 大模型如同一艘巨轮,引领着技术的前进方向。然而,随着这股浪潮的汹涌,人们开始关注那些35岁以上的程序员,在这个快速变化的时代中,面临着怎样的挑战和机遇?本文将带您深入了解程…

UART驱动学习二(TTY体系)

目录 一、TTY体系中设备节点的差别1. 傻傻分不清 /dev/tty*2. 要讲历史了2.1 电传机teletype2.2 计算机需要控制2.2.1 使用teletype2.2.2 teletype被淘汰了2.2.3 个人电脑和虚拟终端 3. tty相关设备节点3.1 各类设备节点的差别3.2 /dev/ttyN(N1,2,3,..., 63)3.3 /dev/tty03.4 /…

python数据分析与可视化介绍

本文主要讲述了数据可视化的基础知识,包括什么是数据可视化,数据可视化应用以及Python可视化工具库。 什么是数据可视化 可视化是一种通过视觉的方式有效传达信息的技术。数据可视化旨在借助于图形化手段,将数据以视觉形式来呈现&#xff0c…

什么样的孩子适合学C++?

随着科技的飞速发展,编程已成为许多家长和教育者重视的技能之一。在众多编程语言中,C因其强大的功能和广泛的应用,成为许多青少年学习编程的首选。然而,C相较于其他编程语言,如Python或Scratch,其学习难度更…

Golang | Leetcode Golang题解之第461题汉明距离

题目: 题解: func hammingDistance(x, y int) (ans int) {for s : x ^ y; s > 0; s & s - 1 {ans}return }

AutoSar CP 通信服务核心—Com模块详解

文章目录 Com模块的主要功能Com模块的配置与其他模块的交互应用举例应用层通过Com模块接收CAN报文应用层通过Com模块发送CAN报文 在AUTOSAR Classic Platform (CP) 中, Com模块(Communication模块)是负责实现 应用层与通信栈之间的接口。它…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站:Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符,拉取 GitLab 镜像: docker pull gitlab/gitlab-ee:latest或则使用社区版: docker pull gitlab/gitlab-ce…

【五分钟学会】YOLO11 自定义数据集从训练到部署

数据集地址 数据集包含 360 张红血细胞图像及其注释文件,分为训练集与验证集。训练文件夹包含 300 张带有注释的图像。测试和验证文件夹都包含 60 张带有注释的图像。我们对原始数据集进行了一些修改以准备此 CBC 数据集,并将数据集分成三部分。在360张…

feign文件上传

记录一下 feign文件上传 环境 spring-boot 2.3.7 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath/> <!-- lo…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

通过 LLMs 自动探索量化投资策略

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的al…

SpringBoot项目:前后端打包与部署(使用 Maven)

文章目录 IDEA后端打包与部署&#xff08;使用 Maven&#xff09;1. 确保 Maven 已安装&#xff0c;并引入 pom 插件2. 清理并安装项目3. 定位生成的 JAR 包和配置文件4. 创建部署文件夹5. 上传到服务器 前端打包与部署&#xff08;使用 npm&#xff09;1. 确保 Node.js 和 npm…

提升LLM结果:何时使用知识图谱RAG

通过知识图谱增强 RAG 可以帮助检索&#xff0c;使系统能够更深入地挖掘数据集以提供详细的响应。 译自Boost LLM Results: When to Use Knowledge Graph RAG&#xff0c;作者 Brian Godsey。 有时&#xff0c;检索增强生成 (RAG) 系统无法深入文档集以找到所需的答案。我们可能…

同质化的卷需要支撑多样化的环境来调和

(*^__^*) 代价高昂的免费机器人课程{人工智能与机器人教育之个人感悟}_从事机器人工程专业或机器人方向相关课程开发3年多的时间,从编写控制机器人的第一-CSDN博客 如上这篇写于2016&#xff0c;发表在博客的时间是2018。 总是觉得要补充些什么&#xff0c;但是&#xff0c;…

【模板进阶】std::true_type和std::false_type

一、 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_type的实现 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_t…

Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)

反向代理与跨域描述 什么是跨域&#xff1f; 跨域&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是指在浏览器中&#xff0c;当一个网页的脚本试图从一个域名&#xff08;协议、域名、端口&#xff09;请求另一个域名的资源时&#xff0c;浏览器会阻止这种请求…

php常用的注释符号

如果没有安装vscode和小皮&#xff0c;请点击下方链接安装&#xff1a; Vscode、小皮面板安装-CSDN博客 在学习php过程中&#xff0c;肯定少不了注释&#xff0c;也可以理解为备注的信息&#xff0c;来提醒自己这段代码有什么用&#xff0c;是什么意思等&#xff0c;接下来就介…

JS测试框架——Jest

文章目录 安装yarn安装jestvscode支持jest的智能提示创建JS测试用例 安装yarn yarn是meta发布的一款取代npm的包管理工具。 npm install -g yarn查看yarn软件源 yarn config get registry换源 yarn config set registry https://registry.npmmirror.com恢复官方源 yarn co…

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…