序列模型

时间序列

时间序列是一种按照时间顺序排列的数据点集合,这些数据点通常是某个变量在不同时间点的观测值。常见的时间序列有文本(每个文字、词语或句子按照出现的先后顺序构成了一个时间序列)、视频、音频、气象数据、股票价格等等。

时间序列中的每个数据点都与特定的时间点相对应,它能够反映出数据岁时间的变化规律和趋势。通过对时间序列的分析,可以揭示出数据的长期趋势、季节性波动、周期性变化以及不规则波动等特征,进而用于预测未来数据、发现数据中的异常情况、分析数据之间的相关性等。

时间序列分析的常用方法主要有以下几类:

传统统计方法:

  • 移动平均法:通过计算一定时间窗口内数据的平均值来平滑时间序列,消除短期波动突出长期趋势。例如,对过去\(n\)个时间点的数据求平均,得到当前时间点的移动平均值,随着时间的推移,窗口不断移动,能较好地展示数据的趋势变化: \[ x_t = \frac{x_{t-1}+x_{t-2}+\cdots+x_{t-n}}{n} \] 其中\(x_t\)表示第\(t\)个时间节点的数据

  • 指数平滑法:移动平均法的改进,基于近期数据更高的权重,对时间序列进行加权平均。它考虑了不同时期数据的重要性差异,更能及时反映数据的变化趋势。指数平滑法有一次指数平滑、二次指数平滑和三次指数平滑等,适用于不同类型的时间序列数据。

    • 一次指数平滑法:适用于数据无显著趋势或季节性(平稳序列) \[ F_{t+1} = \alpha Y_t + (1-\alpha)F_t \] 其中,\(F_{t}\)为第\(t\)期的预测值(\(F_t\)\(F_{t-1}\)\(Y_{t-1}\)得出),\(F_{t+1}\)为第\(t+1\)期的预测值,\(Y_t\)为第\(t\)期的实际观测值。\(\alpha\)为平滑常数(\(0\leq\alpha\leq1\)),控制近期数据的权重,\(\alpha\)越大,模型对变化反应越快

    • 二次指数平滑法:适用于数据含线性趋势但无季节性,二次指数平滑法在一次指数平滑的基础上进行二次平滑 \[ \left\{ \begin{aligned} &S_t^{(1)} = \alpha y_t + (1-\alpha)S_{t-1}^{(1)}\\ &S_t^{(2)} = \alpha S_t^{(1)} + (1-\alpha)S_{t-1}^{(2)} \end{aligned} \right. \] 其中,\(S_t^{(1)}\)\(t\)时刻的一次指数平滑值,当\(t=1\)时,\(S_1^{(1)}=y_1\)\(S_t^{(2)}\)\(t\)时刻的二次指数平滑值。\(y_t\)\(t\)时刻的实际观测值。二次指数平滑石在一次指数平滑的基础上进行的,这两个公式使用的是同一个\(\alpha\)

      可以通过一次指数平滑和二次指数平滑来建立预测模型:\(\hat y_{t+\tau} = a_t+b_t\tau\),其中\(a_t = 2S_t^{(1)}-S_t^{(2)}\)\(b_t = \frac{\alpha}{1-\alpha}(S_t^{(1)}-S_t^{(2)})\)\(\hat y_{t+\tau}\)\(t+\tau\)时刻的预测值。

      证明:

      假设\(y_t\)遵循下列线性方程: \[ y_{t\pm\tau}=a_t\pm b_t\tau \] 因为 \[ \begin{aligned} S_t^{(1)} &= \alpha y_t + (1-\alpha)S_{t-1}^{(1)}\\ &= \alpha y_t + (1-\alpha)[\alpha y_{t-1}+(1-\alpha)S_{t-2}^{(1)}]\\ &= \alpha y_t + \alpha(1-\alpha)y_{t-1}+\alpha(1-\alpha)^2S_{t-2}^{(1)}\\ &= \alpha y_t + \alpha(1-\alpha)y_{t-1}+\alpha(1-\alpha)^2y_{t-2}+\alpha(1-\alpha)^3S_{t-3}^{(1)}\\ &= \cdots\cdots\\ &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^iy_{t-i}+(1-\alpha)^tS_0^{(1)} \end{aligned} \]\(t\rightarrow+\infty\)时,\((1-\alpha)^t=0\),因此 \[ S_t^{(1)} = \alpha\sum_{i=0}^{t-1}(1-\alpha)^iy_{t-i} \] 因为\(y_{t\pm\tau}=a_t\pm b_t\tau\),则 \[ \begin{aligned} S_t^{(1)} &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^iy_{t-i}\\ &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^i(a_t-b_ti)\\ &= \alpha\bigg[a_t\sum_{i=0}^{t-1}(1-\alpha)^i - b_t\sum_{i=0}^{t-1}i(1-\alpha)^i\bigg] \end{aligned} \] 由等差数列求和公式可得 \[ \sum_{t=0}^{t-1}(1-\alpha)^i = \frac{1-(1-\alpha)^t}{\alpha} \] 对于\(\displaystyle\sum_{i=0}^{t-1}i(1-\alpha)^i\),令\(S = \displaystyle\sum_{i=0}^{t-1}i(1-\alpha)^i\),有 \[ \begin{aligned} (1-\alpha)S &= \sum_{i=0}^{t-1}i(1-\alpha)^{i+1}\\ &= \sum_{i=1}^t(i-1)(1-\alpha)^i\\ &= \sum_{i=1}^{t-1}(i-1)(1-\alpha)^{i} + (t-1)(1-\alpha)^t \end{aligned} \]\[ \begin{aligned} S - (1-\alpha)S &= \sum_{i=0}^{t-1}i(1-\alpha)^i - \sum_{i=1}^{t-1}(i-1)(1-\alpha)^i - (t-1)(1-\alpha)^t\\ &= 0\cdot(1-\alpha)^0 + \sum_{i=1}^{t-1}i(1-\alpha)^i - \sum_{i=1}^{t-1}(i-1)(1-\alpha)^i - (t-1)(1-\alpha)^t\\ &= \sum_{i=1}^{t-1}\Big[i(1-\alpha)^i - (i-1)(1-\alpha)^i\Big] - (t-1)(1-\alpha)^t\\ &= \sum_{i=1}^{t-1}(1-\alpha)^i - (t-1)(1-\alpha)^t\\ &= \sum_{i=0}^{t-1}(1-\alpha)^i - 1 - (t-1)(1-\alpha)^t\\ &= \frac{1-(1-\alpha)^t}{\alpha} - 1 - (t-1)(1-\alpha)^t\\ &= \alpha S \end{aligned} \] 因此 \[ S = \frac{\frac{1-(1-\alpha)^t}{\alpha} - 1 - (t-1)(1-\alpha)^t}{\alpha} \]\[ \begin{aligned} S_t^{(1)} &= \alpha\bigg[a_t\cdot\frac{1-(1-\alpha)^t}{\alpha} - b_t\cdot\frac{\frac{1-(1-\alpha)^t}{\alpha} - 1 - (t-1)(1-\alpha)^t}{\alpha}\bigg]\\ &= a_t[1-(1-\alpha)^t] - b_t\cdot\frac{1-(1-\alpha)^t - \alpha - \alpha(t-1)(1-\alpha)^t}{\alpha} \end{aligned} \]\(t\rightarrow+\infty\)时,\((1-\alpha)^t=0\),因此 \[ S_t^{(1)} = a_t - b_t\cdot\frac{1-\alpha}{\alpha}\tag{1} \]

      \[ \begin{aligned} S_t^{(2)} &= \alpha S_t^{(1)} + (1-\alpha)S_{t-1}^{(2)}\\ &= \alpha S_t^{(1)} + \alpha(1-\alpha)S_{t-1}^{(1)} + \alpha(1-\alpha)^2S_{t-2}^{(2)}\\ &=\cdots\cdots\\ &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^iS_{t-i}^{(1)} + (1-\alpha)^tS_0^{(2)} \end{aligned} \]

      \(t\rightarrow+\infty\)时,\((1-\alpha)^t=0\),因此 \[ S_t^{(2)} = \alpha\sum_{i=0}^{t-1}(1-\alpha)^iS_{t-i}^{(1)} \] 接下来求解\(S_{t-i}^{(1)}\)\[ \begin{aligned} S_{t-i}^{(1)} &= \alpha y_{t-i} + (1-\alpha)S_{t-i-1}^{(1)}\\ &= \alpha y_{t-i} + \alpha(1-\alpha)y_{t-i-1} + \alpha(1-\alpha)^2S_{t-i-2}^{(1)}\\ &= \cdots\cdots\\ &= \alpha\sum_{j=0}^{t-i-1}(1-\alpha)^jy_{t-i-j} + \alpha(1-\alpha)^{t-i}S_0^{(1)} \end{aligned} \]\(t\rightarrow+\infty\)时,\((1-\alpha)^t=0\),因此 \[ \begin{aligned} S_{t-i}^{(1)} &= \alpha\sum_{j=0}^{t-i-1}(1-\alpha)^jy_{t-i-j}\\ &= \alpha\sum_{j=0}^{t-i-1}(1-\alpha)^j[a_t-b(i+j)]\\ &= \alpha\bigg[(a_t-b_ti)\sum_{j=0}^{t-i-1}(1-\alpha)^j - b_t\sum_{j=0}^{t-i-1}(1-\alpha)^j\bigg] \end{aligned} \] 由上述数列求和结论可知, \[ \left\{ \begin{aligned} &\sum_{j=0}^{t-i-1}(1-\alpha)^j = \frac{1-(1-\alpha)^{t-i}}{\alpha}\\ &\sum_{j=0}^{t-i-1}j(1-\alpha)^j = \frac{\frac{1-(1-\alpha^{t-i})}{\alpha}-1-(t-i-1)(1-\alpha)^{t-i}}{\alpha} \end{aligned} \right. \]\[ S_{t-i}^{(1)} = (a_t-b_ti)[1-(1-\alpha)^{t-i}] - b_t\frac{1-(1-\alpha)^{t-i}-\alpha-\alpha(t-i-1)(1-\alpha)^{t-i}}{\alpha} \]\(t\rightarrow+\infty\)时,由于\(t>>i\),此处\(i\)为一个常数,则\((1-\alpha)^{t-i}=0\),因此 \[ S_{t-i}^{(1)} = a_t - b_t\cdot i-b_t\frac{1-\alpha}{\alpha} \] 所以 \[ \begin{aligned} S_t^{(2)} &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^iS_{t-i}^{(1)}\\ &= \alpha\sum_{i=0}^{t-1}(1-\alpha)^i\Big(a_t - b_t\cdot i-b_t\frac{1-\alpha}{\alpha}\Big)\\ &= \alpha\bigg[\Big(a_t-b_t\frac{1-\alpha}{\alpha}\Big)\sum_{i=0}^{t-1}(1-\alpha)^i - b_t\sum_{i=0}^{t-1}i(1-\alpha)^i\bigg]\\ &= \Big(a_t-b_t\frac{1-\alpha}{\alpha}\Big)[1-(1-\alpha)^t] - b_t\frac{1-(1-\alpha)^t - \alpha - \alpha(t-1)(1-\alpha)^t}{\alpha} \end{aligned} \]\(t\rightarrow+\infty\)时,\((1-\alpha)^t=0\),因此 \[ \begin{aligned} S_t^{(2)} &= a_t-b_t\frac{1-\alpha}{\alpha} - b_t\frac{1-\alpha}{\alpha}\\ &= a_t-2b_t\frac{1-\alpha}{\alpha} \end{aligned}\tag{2} \] 联立\((1), (2)\)\[ \left\{ \begin{aligned} &S_t^{(1)} = a_t - b_t\cdot\frac{1-\alpha}{\alpha}\\ &S_{t}^{(2)} = a_t-2b_t\cdot\frac{1-\alpha}{\alpha} \end{aligned} \right. \] 解得: \[ \left\{ \begin{aligned} &a_t = 2S_t^{(1)} - S_t^{(2)}\\ &b_t = \frac{\alpha}{1-\alpha}[S_t^{(1)} - S_t^{(2)}] \end{aligned} \right. \]

    • 三次指数平滑法:适用于具有非线性趋势的时间序列,预测模型为\(y_{t+\tau} = a_t + b_t\tau + c_t\tau^2\),三次指数平滑石在二次指数平滑的基础上再进行一次平滑, \[ \left\{ \begin{aligned} &S_t^{(1)} = \alpha y_t + (1-\alpha)S_{t-1}^{(1)}\\ &S_t^{(2)} = \alpha S_t^{(1)} + (1-\alpha)S_{t-1}^{(2)}\\ &S_t^{(3)} = \alpha S_t^{(2)} + (1-\alpha)S_{t-1}^{(3)} \end{aligned} \right. \] 其中, \[ \left\{ \begin{aligned} &a_t = 3S_t^{(1)} - 3S_t^{(2)} + S_t^{(3)}\\ &b_t = \frac{\alpha}{2(1-\alpha)^2}\Big[(6-5\alpha)S_t^{(1)} - 2(5-4\alpha)S_t^{(2)} + (4-3\alpha)S_t^{(3)}\Big]\\ &c_t = \frac{\alpha^2}{2(1-\alpha)^2}\Big(S_t^{(1)}-2S_t^{(2)} + S_t^{(3)}\Big) \end{aligned} \right. \] 可以依此类推到多次指数平滑法

  • 自回归模型(AR):假设当前值与过去的观测值存在线性关系,用过去的观测值来预测当前值: \[ x_t = \varphi_1x_{t-1} + \varphi_2x_{t-2} + \cdots + \varphi_px_{t-p} + \epsilon_t \] \(x_t\)是时间序列在\(t\)时刻的观测值,\(\varphi_1, \varphi_2, \cdots, \varphi_p\)是自回归系数,衡量了过去不同时刻的观测值对当前值的影响程度,\(\epsilon_t\)是误差项,也称为白噪声项,代表了无法由过去观测值解释的部分,通常假设\(\epsilon_t\)服从均值为0,方差为\(\sigma^2\)的正态分布。

    在实际应用中,需要估计自回归模型的参数\(\varphi_1, \varphi_2, \cdots, \varphi_p\)。常用的估计方法有最小二乘法、极大似然估计法等(与线性回归模型方法相同)

  • 移动平均模型(MA):假设当前值是过去若干个随机误差项的线性组合,主要用于处理时间序列中的噪声和短期波动,MA (q) 模型表示当前值是前 q 个随机误差项的线性组合。

  • 自回归移动平均模型(ARMA):结合了自回归模型和移动平均模型的特点,同时考虑了时间序列的自相关性和移动平均特性,适用于更复杂的时间序列分析,ARMA (p,q) 模型由 p 阶自回归部分和 q 阶移动平均部分组成。

  • 自回归积分滑动平均模型(ARIMA):在 ARMA 模型的基础上,增加了对非平稳时间序列的处理能力,通过对时间序列进行差分使其平稳化,然后再建立 ARMA 模型进行分析和预测,常用于具有趋势和季节性的时间序列。

频域分析方法:

  • 傅里叶变换:将时间序列从时域转换到频域,把一个时间序列分解为不同频率的正弦和余弦函数的叠加,通过分析频域上的能量分布,揭示时间序列中的周期性成分和频率特征。
  • 小波分析:是一种时频局部化分析方法,能够同时在时间和频率域上对时间序列进行分析,它可以将时间序列分解为不同尺度和位置的小波系数,更好地捕捉时间序列中的局部特征和突变信息,适用于分析具有非平稳性和复杂结构的时间序列。

机器学习方法:

  • 人工神经网络(ANN):如多层感知机(MLP)、递归神经网络(RNN)及其变体长短时记忆网络(LSTM)、门控循环单元(GRU)等,可以自动学习时间序列中的复杂模式和长期依赖关系,适用于处理具有高度非线性和动态变化的时间序列数据。
  • 支持向量机(SVM):在时间序列分析中,通过将时间序列数据映射到高维特征空间,寻找最优的分类超平面或回归函数,用于时间序列的分类和预测任务,对小样本数据有较好的泛化能力。
  • 随机森林:通过构建多个决策树并综合它们的结果进行预测,能够处理高维数据和具有复杂关系的时间序列,对数据中的噪声和异常值有较好的鲁棒性,可用于时间序列的分类、回归和特征选择等任务。

机器学习方法的引入

在时间\(t\)观察到\(x_t\),那么得到\(T\)个不独立的随机变量: \[ (x_1, x_2, \cdots, x_T)\sim p(\mathbf{x}) \]\[ \begin{aligned} p(\mathbf{x}) &= p(x_1, x_2, \cdots, x_T)\\ &= p(x_1)\cdot p(x_2|x_1)\cdot p(x_3|x_1, x_2)\cdot\ \cdots\ \cdot p(x_T|x_1, x_2, \cdots, x_{T-1}) \end{aligned} \] 即,序列\(\mathbf{x} = (x_1, x_2, \cdots, x_T)\)出现的概率等于\(t=1\)时刻出现\(x_1\)的概率乘上在\(t=1\)时刻出现\(x_1\)的基础上\(t=2\)时刻出现\(x_2\)的概率乘上……

时间序列需要根据已经出现过的数据去预测下一个时间还未出现的数据,因此需要计算条件概率 \[ p(x_t|x_1, x_2, \cdots, x_{t-1}) \] 即在\(x_1, x_2, \cdots, x_{t-1}\)出现的情况下\(x_t\)出现的概率,在对\(x_t\)的预测时,选择能使概率最大的\(x_t\)作为时刻\(t\)出现的数据的预测。

为了实现这个预测,可以对条件概率进行建模: \[ p(x_t|x_1, x_2, \cdots, x_{t-1}) = p(x_t|f(x_1, \cdots, x_{t-1})) \] 输入为\(x_1, x_2, \cdots, x_{t-1}\),输出\(x_t\)或者\({x_t}\)构成的集合中每个元素的概率。

但这样的缺点是\(t\)不同时,输入的数据量也不同,输入数据的数量会随着遇到的数据量的增加而增加。下面有两种解决方案:

自回归模型

第一种策略:假设在现实情况下相当长的序列\(x_{t-1}, \cdots, x_1\)可能是不必要的,因此我们只需要满足某个长度为\(\tau\)的时间跨度,即使用观测序列\(x_{t-1}, \cdots, x_{t-\tau}\)。这样做最直接的好处就是参数的数量总是不变的,至少在\(t>\tau\)时如此,这样就可以使用许多需要固定输入的模型进行预测,比如全连接神经网络(MLP)等。这种模型被称为自回归模型,因为它们是对自己执行回归(使用之前的数据进行回归,没有单独的标签label)。

第二种策略:保留一些对过去观测的总结\(h_t\),并且同时更新预测\(\hat x_t\)和总结\(h_t\)。这就产生了基于\(\hat x_t = P(x_t|h_t)\)估计\(x_t\),以及公示\(h_t = g(h_{t-1}, x_{t-1})\)更新的模型。由于\(h_t\)从未被观测到,这类模型也被称为隐变量自回归模型(latent autoregressive models)。

隐变量自回归模型

隐变量自回归模型也可以是\(\hat x_t = P(x_t|h_t, x_{t-1})\)以及公式\(h_t = g(h_{t-1}, x_{t-1})\)更新的模型:

隐变量自回归模型

马尔科夫模型

在自回归模型的近似法中,我们使用\(x_{t-1}, \cdots, x_{t-\tau}\)而不是\(x_{t-1}, \cdots, x_1\)来估计\(x_t\)。只要是这种近似精确的,我们就说序列满足马尔科夫条件(Markov condition)。特别是,如果\(\tau=1\),得到一个一阶马尔可夫模型(first-order Markov model),\(P(x)\)由下式给出: \[ P(x_1, x_2, \cdots, x_T) = \prod_{t=1}^TP(x_t|x_{t-1}) \]\(t=1\)时,\(P(x_1|x_0) = P(x_1)\)

注:当\(\tau=1\)时,我们认为\(x_t\)仅与\(x_{t-1}\)有关,因此\(P(x_t|x_1, \cdots, x_{t-1}) = P(x_t|x_{t-1})\)

一般情况下,若\(x_t\)\(x_{t-1}, \cdots, x_{t-\tau}\)有关,则,\(P(x_t|x_1, \cdots, x_{t-1}) = P(x_t|x_{t-\tau}, \cdots, x_{t-1})\)

因果关系

原则上,将\(P(x_1, \cdots, x_T)\)倒序展开也没什么关系。因为根据全概率公式,总是可以写出: \[ P(x_1, \cdots, x_T) = \prod_{t=T}^1P(x_t|x_{t+1}, \cdots, x_T) \] 事实上,如果基于一个马尔科夫模型,我们还可以得到一个反向的条件概率分布。然而,在许多情况下,数据存在于一个自然的方向,即在时间上是前进的。很明显,未来的事件不能影响过去。因此,如果我们改变\(x_t\),可能会影响未来发生的事情\(x_{t+1}\),但不能反过来。也就是说,如果我们改变\(x_t\),基于过去事件得到的分布不会改变。因此,解释\(P(x_{t+1}|x_t)\)应该比解释\(P(x_t|x_{t+1})\)更容易。例如,在某些情况下,对于某些可加性噪声\(\epsilon\),显然我们可以找到\(x_{t+1} = f(x_t) + \epsilon\),而反之则不行。而这个向前推进的方向恰好也是我们通常感兴趣的方向。

实例

比如我们使用MLP使用一个马尔可夫模型对时间序列进行预测,假定\(\tau = 4\),时间序列为正弦周期性变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
import matplotlib.pyplot as plt

tau = 4
net = nn.Sequential(
nn.Linear(tau, 20),
nn.PReLU(),
nn.Linear(20, 1)
)
T = 1000
x = torch.linspace(0, 3.14*4, T)
y = torch.sin(x) + torch.randn_like(x)*0.1

data = torch.zeros(T-tau, tau)
for i in range(tau):
data[:, i] = y[i: T - tau + i]
label = y[tau:].reshape(-1, 1)
train_dataset = TensorDataset(data[:600], label[:600])
train_dataloader = DataLoader(train_dataset, batch_size=16, shuffle=True)

num_epoch = 6
loss_function = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.01)

net.train()
for epoch in range(num_epoch):
for train_data, train_label in train_dataloader:
y_hat = net(train_data)
loss = loss_function(y_hat, train_label)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch {epoch + 1}, Loss {loss.item():.5f}')

net.eval()
with torch.no_grad():
y_hat = net(data).reshape(1, -1).squeeze()

plt.plot(x, y)
plt.plot(x[tau:], y_hat)

结果:

其中蓝色的线为实际曲线,黄色的线为预测曲线

这只是用真实数据预测后面一个时刻的数据,可以使用简单模型实现较高的准确率,但是如果进行较长时间的预测,则误差会越来越大,因为我们首先使用几个真实的数据去预测第一个数据,然后使用部分真实数据和第一个预测数据去预测第二个预测数据,再使用部分真实数据和第一个、第二个预测数据去预测第三个预测数据,依此类推,第一个预测数据可能有比较小的误差,而第二个预测数据基于第一个预测数据,第一个预测数据已经产生误差了,第二个预测数据可能会有更大的误差,这些误差越往后面产生的影响越大,预测越不准确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def add_data(data, x):
for i in range(tau - 1):
data[0, i] = data[0, i+1]
data[0, tau - 1] = x.item()

net.eval()
multistep_pred = y[:tau].unsqueeze(dim=0).clone()
multistep_data = multistep_pred.squeeze().tolist()

with torch.no_grad():
for i in range(tau, T):
y_hat = net(multistep_pred)
add_data(multistep_pred, y_hat)
multistep_data.append(y_hat.item())

multistep_data = torch.tensor(multistep_data)

plt.plot(x, y)
plt.plot(x, multistep_data)

结果:

时间序列多步预测

序列模型
https://blog.shinebook.net/2025/03/15/人工智能/理论基础/深度学习/序列模型/
作者
X
发布于
2025年3月15日
许可协议