Bootstrap

一维数据预测FilterNet: Harnessing Frequency Filters for Time Series Forecasting

FilterNet: Harnessing Frequency Filters for Time Series Forecasting

1.layerNorm

在这里插入图片描述

https://blog.csdn.net/weixin_41978699/article/details/122778085

1.1)NCHW 求CHW的均值和方差

在这里插入图片描述

1.2)NCHW 求C的均值和方差

先把C换到最后一位
在这里插入图片描述

1.3) N, seq_len, em_dim 求 em_dim的均值和方差

在这里插入图片描述

2.pandas.tseries

2.1 tseries.frequencies.to_offset

在这里插入图片描述

2.2 pandas.tseries.offsets

参考:https://blog.csdn.net/qq_40206371/article/details/130202526
在这里插入图片描述

在这里插入图片描述

3. StandardScaler

根据特征均值和标准差 normalization

每一行是一个样本,每一列是一个特征,求每个特征的均值和标准差进行计算。

4. torch.cuda.amp

https://blog.csdn.net/qq_38253797/article/details/116210911

用法:
在这里插入图片描述


在这里插入图片描述

5.PaiFilter,对应论文4.1节

整体架构:
在这里插入图片描述

5.1 norm和denorm

假如是 [batch_size, seq_len , feature_num] 的数据
得到的均值和方差的 shape 是[batch_size, 1 , feature_num]

表示该序列长度seq_len中的数据的feature的均值和方差

import torch
import torch.nn as nn

class RevIN(nn.Module):
    def __init__(self, num_features: int, eps=1e-5, affine=True, subtract_last=False):
        """
        :param num_features: the number of features or channels
        :param eps: a value added for numerical stability
        :param affine: if True, RevIN has learnable affine parameters
        """
        super(RevIN, self).__init__()
        self.num_features = num_features
        self.eps = eps
        self.affine = affine
        self.subtract_last = subtract_last
        if self.affine:
            self._init_params()

    def forward(self, x, mode:str):
        if mode == 'norm':
            self._get_statistics(x)
            x = self._normalize(x)
        elif mode == 'denorm':
            x = self._denormalize(x)
        else: raise NotImplementedError
        return x

    def _init_params(self):
        # initialize RevIN params: (C,)
        self.affine_weight = nn.Parameter(torch.ones(self.num_features))
        self.affine_bias = nn.Parameter(torch.zeros(self.num_features))

    def _get_statistics(self, x):
        dim2reduce = tuple(range(1, x.ndim-1))
        if self.subtract_last:
            self.last = x[:,-1,:].unsqueeze(1) # batch_size,seq_len,feature_num   seq_len最后一个
        else:
            self.mean = torch.mean(x, dim=dim2reduce, keepdim=True).detach( )# 特征的均值(每个序列 seq_len个样本 的均值)
        self.stdev = torch.sqrt(torch.var(x, dim=dim2reduce, keepdim=True, unbiased=False) + self.eps).detach() # 特征的方差

    def _normalize(self, x):
        if self.subtract_last:
            x = x - self.last
        else:
            x = x - self.mean
        x = x / self.stdev
        if self.affine:
            x = x * self.affine_weight
            x = x + self.affine_bias
        return x

    def _denormalize(self, x):
        if self.affine:
            x = x - self.affine_bias
            x = x / (self.affine_weight + self.eps*self.eps)
        x = x * self.stdev
        if self.subtract_last:
            x = x + self.last
        else:
            x = x + self.mean
        return x

5.2 frequency filter

频域滤波

每个特征都是 长度为swq_len的序列,转换到频域信息,滤波,再转换回

在这里插入图片描述

5.3 一个全连接层

在这里插入图片描述

直接看源代码还是比较清晰明了的,具体来说就是

5.4 paifilter总结

一共以下几个步骤:
input:batch_size, seq_len, feature_num
norm: 求每个特征的均值和方差(seq_len个数的均值和方差),以及norm
filter: x是输入,w 是可学习的滤波系数, 将两者转换到频域,相乘,再转回来。 频域也是针对feature而言的,就是求每个特征的 频域(seq_len个数的fft)
fc: 一个线性全连接层 输出 batch_size, pred_len, feature_num
denorm

关于数据,首先搞清楚输入输出,代码写的有点绕,对于ETTm1实验来说:
input是 seq_len=96的序列,预测 后面 pred_len=96的序列

6. TexFilter

直接看作者源码,有个疑问
in paifilter code: torch.fft.rfft(x, dim=1, norm=‘ortho’) is on seq_len , but texfilter code torch.fft.rfft is calculated on feature_num ?

;