时间序列分析之指数平滑法(holt-winters及代码)

在做时序预测时,一个显然的思路是:认为离着预测点越近的点,作用越大。比如我这个月体重100斤,去年某个月120斤,显然对于预测下个月体重而言,这个月的数据影响力更大些。假设随着时间变化权重以指数方式下降——最近为0.8,然后0.8**2,0.8**3…,最终年代久远的数据权重将接近于0。将权重按照指数级进行衰减,这就是指数平滑法的基本思想。

指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但没有季节性的序列,三次指数平滑法针对有趋势也有季节性的序列。“Holt-Winters”有时特指三次指数平滑法。

所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。它们通过”混合“新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的参数来控制。


1 一次指数平滑法

一次指数平滑法的递推关系如下:

s_{i}=\alpha x_{i}+(1-\alpha)s_{i-1},其中 0 \leq \alpha \leq 1

其中, s_{i} 是时间步长i(理解为第i个时间点)上经过平滑后的值, x_{i} 是这个时间步长上的实际数据。 \alpha 可以是0和1之间的任意值,它控制着新旧信息之间的平衡:当 \alpha 接近1,就只保留当前数据点;当 \alpha 接近0时,就只保留前面的平滑值(整个曲线都是平的)。我们展开它的递推关系式:

\begin{split} s_{i}&=\alpha x_{i}+(1-\alpha)s_{i-1} \\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)s_{i-2}]\\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)[\alpha x_{i-2}+(1-\alpha)s_{i-3}]]\\ &=\alpha[x_{i}+(1-\alpha)x_{i-1}+(1-\alpha)^{2}x_{i-2}+(1-\alpha)^{3}s_{i-3}]\\ &=... \\ &=\alpha\sum_{j=0}^{i}(1-\alpha)^{j}x_{i-j} \end{split}

可以看出,在指数平滑法中,所有先前的观测值都对当前的平滑值产生了影响,但它们所起的作用随着参数 \alpha 的幂的增大而逐渐减小。那些相对较早的观测值所起的作用相对较小。同时,称α为记忆衰减因子可能更合适——因为α的值越大,模型对历史数据“遗忘”的就越快。从某种程度来说,指数平滑法就像是拥有无限记忆(平滑窗口足够大)且权值呈指数级递减的移动平均法。一次指数平滑所得的计算结果可以在数据集及范围之外进行扩展,因此也就可以用来进行预测。预测方式为:

x_{i+h}=s_{i}

s_{i} 是最后一个已经算出来的值。h等于1代表预测的下一个值。


2 二次指数平滑法

在介绍二次指数平滑前介绍一下趋势的概念。

趋势,或者说斜率的定义很简单:b=Δy/Δx,其中Δx为两点在x坐标轴的变化值,所以对于一个序列而言,相邻两个点的Δx=1,因此b=Δy=y(x)-y(x-1)。 除了用点的增长量表示,也可以用二者的比值表示趋势。比如可以说一个物品比另一个贵20块钱,等价地也可以说贵了5%,前者称为可加的(addtive),后者称为可乘的(multiplicative)。在实际应用中,可乘的模型预测稳定性更佳,但是为了便于理解,我们在这以可加的模型为例进行推导。 
指数平滑考虑的是数据的baseline,二次指数平滑在此基础上将趋势作为一个额外考量,保留了趋势的详细信息。即我们保留并更新两个量的状态:平滑后的信号平滑后的趋势。公式如下:

\begin{split} s_{i}&=\alpha x_{i}+(1-\alpha)(s_{i-1}+t_{i-1})\\ t_{i}&=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1} \end{split}

第二个等式描述了平滑后的趋势。当前趋势的未平滑“值”( t_{i} )是当前平滑值( s_{i} )和上一个平滑值( s_{i-1} )的差;也就是说,当前趋势告诉我们在上一个时间步长里平滑信号改变了多少。要想使趋势平滑,我们用一次指数平滑法对趋势进行处理,并使用参数 \beta (理解:对 t_{i} 的处理类似于一次平滑指数法中的 s_{i} ,即对趋势也需要做一个平滑,临近的趋势权重大)。

为获得平滑信号,我们像上次那样进行一次混合,但要同时考虑到上一个平滑信号及趋势。假设单个步长时间内保持着上一个趋势,那么第一个等式的最后那项就可以对当前平滑信号进行估计。

若要利用该计算结果进行预测,就取最后那个平滑值,然后每增加一个时间步长就在该平滑值上增加一次最后那个平滑趋势:

x_{i+h}=s_{i}+ht_{i}


3 三次指数平滑法(holt-winters)

三次指数平滑就是Holt-Winters方法,不用说,它的提出肯定是和两个叫Holt和Winters的人有关了。

当一个序列在每个固定的时间间隔中都出现某种重复的模式,就称之具有季节性特征,而这样的一个时间间隔称为一个季节(理解:比如说在一个周内,销量呈现出重复的模式)。一个季节的长度k为它所包含的序列点个数。

二次指数平滑考虑了序列的baseline和趋势,三次就是在此基础上增加了一个季节分量。类似于趋势分量,对季节分量也要做指数平滑。比如预测下一个季节第3个点的季节分量时,需要指数平滑地考虑当前季节第3个点的季节分量、上个季节第3个点的季节分量...等等。详细的有下述公式(累加法):

\begin{split} s_{i}&=\alpha (x_{i}-p_{i-k})+(1-\alpha)(s_{i-1}+t_{i-1}) \\ t_{i}&=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1}\\ p_{i}&=\gamma (x_{i}-s_{i})+(1-\gamma)p_{i-k} \end{split}

其中, p_{i} 是指“周期性”部分。预测公式如下:

x_{i+h}=s_{i}+ht_{i}+p_{i-k+h}

k 是这个周期的长度。


4 参数选择

\alpha,\beta,\gamma 的值都位于[0,1]之间,可以多试验几次以达到最佳效果。当然,一些寻优方法,比如贝叶斯调参,网格调参可用于调整参数。

s,t,p ​初始值的选取对于算法整体的影响不是特别大,通常的取值为 s_{0}=x_{0},t_{0}=x_{1}-x_{0}, 累加时 p=0,累乘时 p=1 。


5 python代码

这里实现了累加和累乘,绝对值得参考。


6 参考文献

【1】Holt-Winters’ additive method

【2】时间序列分析之holtwinters和ARIMA

【3】Holt-Winters -- Kibana5.4时间序列分析(一)

猜你喜欢

转载自blog.csdn.net/anshuai_aw1/article/details/82499095
今日推荐