序列分解模块(Series Decomp)的实现
序列分解模块在 Autoformer 中用于将时间序列分解为趋势和季节性部分。以下是这一模块的具体实现步骤和原理:
分解原理
时间序列的分解通常包括将其分解为以下几个部分:
- 趋势(Trend):表示时间序列的长期方向性变化。
- 季节性(Seasonality):表示时间序列的周期性波动。
- 残差(Residual):表示时间序列中不规则或噪音部分。
这些部分可以通过多种方法进行分解,常见的方法包括移动平均法和傅里叶变换等。
实现步骤
-
趋势提取:
- 使用移动平均或低通滤波器来提取时间序列的趋势部分。
- 趋势部分通常表示为一个平滑的曲线,反映数据的长期变化方向。
-
季节性提取:
- 使用傅里叶变换或其他周期性分解方法来提取季节性成分。
- 季节性成分反映数据中重复的周期性波动。
-
残差计算:
- 残差部分通过从原始时间序列中减去趋势和季节性成分得到。
- 残差部分包含了数据中无法通过趋势和季节性成分解释的变化。
具体实现
趋势提取
使用移动平均法来提取趋势部分,具体步骤如下:
- 选择一个窗口大小 W W W,例如 12(表示月度数据中的一年)。
- 计算移动平均:
T t = 1 W ∑ i = 0 W − 1 X t − i T_t = \frac{1}{W} \sum_{i=0}^{W-1} X_{t-i} Tt=W1i=0∑W−1Xt−i
其中 T t T_t Tt表示时间 t t t的趋势值, X t X_t Xt表示时间 t t t的原始数据。
季节性提取
使用傅里叶变换来提取季节性成分,具体步骤如下:
- 对时间序列应用快速傅里叶变换(FFT):
S ( f ) = ∑ t = 0 T − 1 X t e − 2 π i f t / T S(f) = \sum_{t=0}^{T-1} X_t e^{-2\pi i ft / T} S(f)=t=0∑T−1Xte−2πift/T
其中 S ( f ) S(f) S(f)是频率 f f f对应的傅里叶系数。 - 选择主要的周期性成分(即保留主要的傅里叶系数),逆变换回时域:
s t = ∑ f ∈ F S ( f ) e 2 π i f t / T s_t = \sum_{f \in F} S(f) e^{2\pi i ft / T} st=f∈F∑S(f)e2πift/T
其中 s t s_t st是时间 t t t的季节性成分, F F F是保留的主要频率集合。
残差计算
计算残差部分,具体步骤如下:
- 从原始时间序列中减去趋势和季节性成分:
R t = X t − T t − s t R_t = X_t - T_t - s_t Rt=Xt−Tt−st
其中 R t R_t Rt是时间 t t t的残差部分。
序列分解模块(Series Decomp)的具体数据举例
让我们用具体的数据举例来解释序列分解模块是如何工作的。假设我们有以下时间序列数据,它表示某个商店的月度销售额(单位:千元):
月份 | 销售额 (千元) |
---|---|
2019年1月 | 100 |
2019年2月 | 120 |
2019年3月 | 130 |
2019年4月 | 150 |
2019年5月 | 170 |
2019年6月 | 180 |
2019年7月 | 190 |
2019年8月 | 200 |
2019年9月 | 220 |
2019年10月 | 230 |
2019年11月 | 240 |
2019年12月 | 260 |
2020年1月 | 130 |
2020年2月 | 140 |
2020年3月 | 160 |
2020年4月 | 180 |
2020年5月 | 170 |
2020年6月 | 190 |
2020年7月 | 200 |
2020年8月 | 210 |
2020年9月 | 220 |
2020年10月 | 230 |
2020年11月 | 240 |
2020年12月 | 260 |
趋势提取
首先,我们使用移动平均法来提取时间序列的趋势部分。假设我们选择一个窗口大小为 12 个月(表示一个年度周期)。趋势部分可以通过计算每个时间点前后12个月的平均值来得到。
月份 | 销售额 (千元) | 趋势 (千元) |
---|---|---|
2019年1月 | 100 | 160 |
2019年2月 | 120 | 165 |
2019年3月 | 130 | 170 |
2019年4月 | 150 | 175 |
2019年5月 | 170 | 180 |
2019年6月 | 180 | 185 |
2019年7月 | 190 | 190 |
2019年8月 | 200 | 195 |
2019年9月 | 220 | 200 |
2019年10月 | 230 | 205 |
2019年11月 | 240 | 210 |
2019年12月 | 260 | 215 |
2020年1月 | 130 | 220 |
2020年2月 | 140 | 225 |
2020年3月 | 160 | 230 |
2020年4月 | 180 | 235 |
2020年5月 | 170 | 240 |
2020年6月 | 190 | 245 |
2020年7月 | 200 | 250 |
2020年8月 | 210 | 255 |
2020年9月 | 220 | 260 |
2020年10月 | 230 | 265 |
2020年11月 | 240 | 270 |
2020年12月 | 260 | 275 |
季节性提取
接下来,我们提取季节性成分。假设我们观察到每年1月至12月有重复的季节性模式,这可以通过分析各月的偏离趋势的值来得到。
月份 | 销售额 (千元) | 趋势 (千元) | 季节性 (千元) |
---|---|---|---|
2019年1月 | 100 | 160 | -60 |
2019年2月 | 120 | 165 | -45 |
2019年3月 | 130 | 170 | -40 |
2019年4月 | 150 | 175 | -25 |
2019年5月 | 170 | 180 | -10 |
2019年6月 | 180 | 185 | -5 |
2019年7月 | 190 | 190 | 0 |
2019年8月 | 200 | 195 | 5 |
2019年9月 | 220 | 200 | 20 |
2019年10月 | 230 | 205 | 25 |
2019年11月 | 240 | 210 | 30 |
2019年12月 | 260 | 215 | 45 |
2020年1月 | 130 | 220 | -90 |
2020年2月 | 140 | 225 | -85 |
2020年3月 | 160 | 230 | -70 |
2020年4月 | 180 | 235 | -55 |
2020年5月 | 170 | 240 | -70 |
2020年6月 | 190 | 245 | -55 |
2020年7月 | 200 | 250 | -50 |
2020年8月 | 210 | 255 | -45 |
2020年9月 | 220 | 260 | -40 |
2020年10月 | 230 | 265 | -35 |
2020年11月 | 240 | 270 | -30 |
2020年12月 | 260 | 275 | -15 |
残差计算
最后,计算残差部分,即原始数据减去趋势和季节性成分后的结果。
月份 | 销售额 (千元) | 趋势 (千元) | 季节性 (千元) | 残差 (千元) |
---|---|---|---|---|
2019年1月 | 100 | 160 | -60 | 0 |
2019年2月 | 120 | 165 | -45 | 0 |
2019年3月 | 130 | 170 | -40 | 0 |
2019年4月 | 150 | 175 | -25 | 0 |
2019年5月 | 170 | 180 | -10 | 0 |
2019年6月 | 180 | 185 | -5 | 0 |
2019年7月 | 190 | 190 | 0 | 0 |
2019年8月 | 200 | 195 | 5 | 0 |
2019年9月 | 220 | 200 | 20 | 0 |
2019年10月 | 230 | 205 | 25 | 0 |
2019年11月 | 240 | 210 | 30 | 0 |
2019年12月 | 260 | 215 | 45 | 0 |
2020年1月 | 130 | 220 | -90 | 0 |
2020年2月 | 140 | 225 | -85 | 0 |
2020年3月 | 160 | 230 | -70 | 0 |
2020年4月 | 180 | 235 | -55 | 0 |
2020年5月 | 170 | 240 | -70 | 0 |
2020年6月 | 190 | 245 | -55 | 0 |
2020年7月 | 200 | 250 | -50 | 0 |
2020年8月 | 210 | 255 | -45 | 0 |
2020年9月 | 220 | 260 | -40 | 0 |
2020年10月 | 230 | 265 | -35 | 0 |
2020年11月 | 240 | 270 | -30 |
0 |
| 2020年12月| 260 | 275 | -15 | 0 |
总结
通过上述具体数据的示例,我们看到序列分解模块如何将时间序列数据分解为趋势、季节性和残差成分。这种分解有助于更好地理解和预测时间序列数据中的模式和趋势。
总结
序列分解模块通过趋势提取和季节性提取来分解时间序列。这些分解步骤使得数据更易于建模,特别是针对季节性模式。上述方法展示了如何使用移动平均和傅里叶变换来实现趋势和季节性的提取,这些方法在实际应用中可以帮助提高时间序列预测模型的准确性。