SparseTSF:Modeling Long-term Time Series Forecasting with 1k Parameters [时序必读论文]

SparseTSF:Modeling Long-term Time Series Forecasting with 1k Parameters [时序必读论文]



前言

该文章发表在 ICML 2024 (CCF A)。该文章介绍了一个及其轻量级的模型Sparse,用于长期时间序列预测。SparseTSF的核心技术是跨周期稀疏预测技术,通过解耦时间序列的周期性和趋势来简化预测任务。首先对原始序列进行降采样,专注跨周期的趋势预测,提取周期特征。
论文连接:https://arxiv.org/pdf/2405.00946
github连接:https://github.com/lss-1138/SparseTSF/blob/main/models/SparseTSF.py


一、滑动聚合

事实上在这里,论文使用的方法是对原始序列简单的卷积操作,保留更多的上下文信息。

二、下采样(Downsample)

将输入数据序列按照已知的周期w分为n个子序列,每个子序列的长度为n=[L/w],其中L为输入长度。

三、线性预测(Linear Layer)

使用线性层将长度n映射为m,其中m=[H/w],H为预测长度。

四、上采样(Upsample)

将预测到长度为w的n个子序列重新组合为一个完整的预测序列。这样使得SparseTSF能够生成与原始序列长度一致的预测结果。
模型框架图

五、模型部分代码

import torch
import torch.nn as nn
from layers.Embed import PositionalEmbedding

class Model(nn.Module):
    def __init__(self, configs):
        super(Model, self).__init__()

        # 输入长度
        self.seq_len = configs.seq_len
        # 输出长度
        self.pred_len = configs.pred_len
        # 通道数,或者说为变量个数
        self.enc_in = configs.enc_in
        # 子序列长度
        self.period_len = configs.period_len

		# 输入子序列个数
        self.seg_num_x = self.seq_len // self.period_len
        # 输出组序列个数
        self.seg_num_y = self.pred_len // self.period_len

		# 滑动聚合
        self.conv1d = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=1 + 2 * (self.period_len // 2),
                                stride=1, padding=self.period_len // 2, padding_mode="zeros", bias=False)
		# 线性预测
        self.linear = nn.Linear(self.seg_num_x, self.seg_num_y, bias=False)


    def forward(self, x):
        batch_size = x.shape[0]
		# 实例标准化以及转置 (Batch_size, Seq_len, Channel_num) -> (Batch_size, Channel_num, Seq_len)
        seq_mean = torch.mean(x, dim=1).unsqueeze(1)
        x = (x - seq_mean).permute(0, 2, 1)

        # 卷积聚合以及残差连接
        x = self.conv1d(x.reshape(-1, 1, self.seq_len)).reshape(-1, self.enc_in, self.seq_len) + x

        # 下采样: (Batch_size, Channel_num, Seq_len) -> (B*C, Seg_num_x, period_len) ->  (B*C, period_len, Seg_num_x)
        x = x.reshape(-1, self.seg_num_x, self.period_len).permute(0, 2, 1)

        # 线性预测  (B*C, period_len, Seg_num_x) ->  (B*C, period_len, Seg_num_y)
        y = self.linear(x)

        # 上采样: (B*C, period_len, Seg_num_y) -> (B*C, Seg_num_y, period_len) -> (B, C, pred_len)
        y = y.permute(0, 2, 1).reshape(batch_size, self.enc_in, self.pred_len)

        # 转置和逆实例标准化
        y = y.permute(0, 2, 1) + seq_mean

        return y

六、实验效果

多变量时序预测
这里使用常用的几个数据集,在ETTh1和ETTh2这样的轻量级数据集上确实有很好的效果,但是在Electricity和Traffic这样重的数据集上,效果相比PatchTST确实有所下降,但是SparseTSF它轻呀,比FITS还轻,PatchTST多重。


总结

该论文的模型部分较为简单,简单来说是一个基于子序列的Linear预测,但是在数学上的意义比较大。

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值