笔记本 - 时间序列

时间序列

(长时序列的预测)

窗口滑动

短时预测:prophet(适合预测趋势),arima(短序列预测还算准确,但趋势不准)

长时预测:informer

基本定义:

规律性:长期趋势,季节变动,循环变动,不规则变动

叠加模型:时间序列图的波动保持恒定

乘积模型:序列的季节波动越来越大

三大基本模型:指数平滑模型,自回归模型(AR),滑动平均模型(MA),自回归滑动平均模型(ARMA)

传统方法

模型基本步骤

一.经典

1>时间序列分解

分解为三部分:趋势项,季节项,残差项,相加与乘法,对于乘法可以取对数变成相加项

2>常见分解方法

移动平均法:估计周期长度,以一周期为区间,对一块块数据取均值,得出趋势,然后使用原数据减趋势,求不同块数据的均值,得出周期,计算残差

X11该方法的鲁棒性强,能处理时间序列中的异常值和数据突变

二.ARIMA

本质是AR+I+MA

要确定差分阶数,保证数据平稳。在确定AR,MA还是ARMA

可以通过网格搜索确定piq最优质,一般以AIC/BIC信息准则为变量

三.Holt模型

没有明显趋势和季节因素的数据可以使用简单指数平滑(一阶holt)

transformer

(QKV计算方法重构输入)

(注意力集中机制

Attention要快,decoder一次输出,堆叠encoder要快)

RNN(递归神经网络)

输入的数据不再是相互独立,后面的数据可能会对前面的产生影响

(时间序列不局限,还可以是文本数据,视频数据)

依旧是滑动窗口(马卡洛夫假设)

LTSM

模型的基本结构

class LSTM(nn.Module):
    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
        super().__init__()
        self.hidden_layer_size = hidden_layer_size

        self.lstm = nn.LSTM(input_size, hidden_layer_size)

        self.linear = nn.Linear(hidden_layer_size, output_size)

        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
                            torch.zeros(1,1,self.hidden_layer_size)) # (num_layers * num_directions, batch_size, hidden_size)

    def forward(self, input_seq):
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        return predictions[-1]
  • 数据处理可以使用MinMaxScaler缩放,效果更好
  • 输入一般两种i形式:一种是以以为向量为每个时间步的输入,一种是以(年月日时分秒)n维向量输入
  • 全连接层拼接在LSTM最后一个单元
  • 一般仅支持单步预测(滑动窗口)
  • 结合teacher-force和no-teacher-force(还不清楚是什么)

个人项目总结

序列平稳化检验(确定d值)

对序列绘图,进行ADF检验,然后可以进行一阶平稳化,二阶平稳化

检验值t大于三个level统计值则是非平稳的

确定p值和d值

1.p值由偏自相关系数PACF图的最大滞后点来判断,q值由自相关系数ACF图的最大之后点判断

2.遍历搜索AIC和BIC最小参数的组合

3.拟合ARIMA模型(p,d,q)

判定方法

残差判定

判断线性以及正态分布情况

猜你喜欢

转载自blog.csdn.net/RandyHan/article/details/130212908