序
- 如果我们希望基于时间序列对用当前已有的数据来预测其之后的走势,我们来比较多种算法优劣,并着重说说三次指数平滑算法。
- 时间序列一般有以下两个特性:
- 趋势:指的是时间序列的整体走势,比如总体上升或者总体下降。
- 季节性:指的是数据的周期性波动,比如以年或周为周期。
- 三次指数平滑算法可以对同时含有趋势和季节性的时间序列进行预测,该算法是基于一次指数平滑和二次指数平滑算法的。
移动平均(Simple moving Average(SMA))
-
我们先来看些简单的算法,我们定义一个窗口,其大小为k,那么这个移动指的就是窗口在时间轴上移动。
-
我们假设窗口函数为f,要预测第t秒的数据,且已知t秒前k个数据,那么第t秒的预测公式为:
s t = 1 k ∑ i = 0 k − 1 f t − i = f t + f t − 1 + . . . + f t − k + 1 k = s t − 1 + f t − f t − k k s_t=\frac{1}{k}\sum_{i=0}^{k-1}f_{t-i}=\frac{f_{t}+f_{t-1}+...+f_{t-k+1}}{k}=s_{t-1}+\frac{f_{t}-f_{t-k}}{k} st=k1∑i=0k−1ft−i=kft+ft−1+...+ft−k+1=st−1+kft−ft−k
-
这样做有几个明显的缺陷:
- 计算复杂耗时
- 移动平均值永远不可能运用于现有的数据集边缘的数据,因为它们的窗口是有限的。然而数据集边缘的变化通常都是我们最感兴趣的部分。
- 不能运用于现有数据集的范围之外,因此它们对预测毫无用处。
加权移动平均
-
在计算移动平均的基础上加上一组权重因子来计算:
( w 0 , w 1 , , , , w k − 1 ) s u c h t h a t ∑ i = 0 k − 1 w i (w_0,w_1,,,,w_{k-1})\ such\ that \sum_{i=0}^{k-1} w_i (w0,w1,,,,wk−1) such that∑i=0k−1wi
并赋予相应的窗口函数权值来计算:
s t = ∑ i = 0 k − 1 w i f t − i s_t=\sum_{i=0}^{k-1}w_if_{t-i} st=∑i=0k−1wift−i
-
显然,该时间临近的窗口函数以更大的权值往往会取得较好的预测效果,但是这个方法也需要最少k个值,并且计算复杂度退化到 O ( k ) O(k) O(k)
一次平滑算法
-
我们可以用指数平滑算法来避免移动平均的问题,最简单的指数平滑算法就是一次平滑算法。
-
递推关系: s i = α x i + ( 1 − α ) s i − 1 s_i=\alpha x_i+(1-\alpha)s_{i-1} si=αxi+(1−α)si−1
-
该公式中 α \alpha α是平滑参数, s i s_i si是之前i个数据的平滑值,取值为[0,1], α \alpha α越接近1,平滑后的值越接近当前数据点,当 α \alpha α接近0时,就只保留前面的平滑值(整个曲线都是平的)。这个递推关系式很眼熟,Cpu_Load 就是这样计算的!我们展开它的递推关系式:
s i s_i si = α x i + ( 1 − α ) s i − 1 \alpha x_i + (1-\alpha)s_{i-1} αxi+(1−α)si−1
= α x i + ( 1 − α ) [ α x i − 1 + ( 1 − α ) s i − 2 ] \alpha x_i+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)s_{i-2}] αxi+(1−α)[αxi−1+(1−α)si−2]
= α x i + ( 1 − α ) [ α x i − 1 + ( a − α ) [ α x i − 2 + ( 1 − α ) s i − 3 ] ] \alpha x_i + (1-\alpha)[\alpha x_{i-1}+(a-\alpha)[\alpha x_{i-2}+(1-\alpha)s_{i-3}]] αxi+(1−α)[αxi−1+(a−α)[αxi−2+(1−α)si−3]]
= α [ x i + ( 1 − α ) x i − 1 + ( 1 − α ) 2 x i − 2 + ( 1 − α ) 3 x i − 3 . . . . . . ] \alpha[x_i+(1-\alpha)x_{i-1}+(1-\alpha)^{2}x_{i-2}+(1-\alpha)^{3}x_{i-3}......] α[xi+(1−α)xi−1+(1−α)2xi−2+(1−α)3xi−3......]
= α ∑ j = 0 i ( 1 − α ) x i − j \alpha \sum_{j=0}^{i}(1-\alpha)x_{i-j} α∑j=0i(1−α)xi−j -
可以看出在指数平滑法中,所有先前的观测值都对当前的平滑值产生了影响,但它们所起的作用随着参数 α \alpha α的幂的增大而逐渐减小。那些相对较早的观测值所起的作用相对较小。与之前的移动平均对比,指数平滑算法就像是拥有无限大小窗口值且权值呈指数级递减的移动平均法。并且可以在数据集及范围外进行扩展,因此也就可以用来进行预测。预测方式为:
x i + h = s i x_{i+h}=s_i xi+h=si
-
简单指数平滑法适用于没有总体趋势的时间序列,如果用来处理有趋势的序列,平滑值将往往滞后于原始数据,除非 α \alpha α的值接近与1,但这样一来就会造成不够平滑
二次指数平滑
-
为了解决一次平滑算法的不足,引出二次指数平滑,每次多计算一个时间趋势统计量 t i t_i ti,能够保留总体趋势信息。因为将平滑应用了两次,所以被称为二次指数平滑。公式如下:
s i = α x i + ( 1 − α ) ( s i − 1 + t i − 1 ) s_i=\alpha x_i+(1-\alpha)(s_{i-1}+t_{i-1}) si=αxi+(1−α)(si−1+ti−1)
t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 t_i=\beta(s_i-s_{i-1})+(1-\beta)t_{i-1} ti=β(si−si−1)+(1−β)ti−1
-
第二个等式描述了平滑后的趋势。当前趋势的未平滑值是当前平滑值和上一个平滑值的差;也就是说,当前趋势告诉我们在上一个时间步长里平滑信号改变了多少。要想使趋势平滑,我们用一次指数平滑法对趋势进行处理,并使用参数 β \beta β。为获得平滑信号,我们像上次那样进行一次混合,但要同时考虑到上一个平滑信号及趋势。假设单个步长时间内保持着上一个趋势,那么第一个等式的最后那项就可以对当前平滑信号进行估计。
-
若要利用该计算结果进行预测,就取最后那个平滑值,然后每增加一个时间步长就在该平滑值上增加一次最后那个平滑趋势:
x i + h = s i + h t i x_{i+h}=s_i+ht_i xi+h=si+hti
三次指数平滑法
-
二次指数平滑能够处理时间序列的趋势,但是为了描述季节性,我们需再加一个量,公式如下
s i = α ( x i − p i − k ) + ( 1 − α ) ( s i − 1 + t i − 1 ) s_i=\alpha(x_i-p_{i-k})+(1-\alpha)(s_{i-1}+t_{i-1}) si=α(xi−pi−k)+(1−α)(si−1+ti−1)
t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 t_i=\beta(s_i-s_{i-1})+(1-\beta)t_{i-1} ti=β(si−si−1)+(1−β)ti−1
p i = γ ( x i − s i ) + ( 1 − γ ) p i − k p_i=\gamma(x_i-s_i)+(1-\gamma)p_{i-k} pi=γ(xi−si)+(1−γ)pi−k
-
其中, p i p_i pi是指“周期性”部分, k k k是这个周期的长度。预测公式如下:
x i + h = s i + h t i + p i − k + h x_{i+h}=s_i+ht_i+p_{i-k+h} xi+h=si+hti+pi−k+h
-
对于三次指数平滑法,我们必须初始化一个完整的“季节”值。对于如何确定参数,一个比较笨拙但是可以先的方法是反复试验,定义误差,并找到误差最小的那组参数值。