时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要: 所有移动平均法都存在很多问题。它们都太难计算了。每个点的计算都
让你绞尽脑汁。而且也不能通过之前的计算结果推算出加权移动平均值。移动
平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是有
限 ...
所有移动平均法都存在很多问题。
它们都太难计算了。每个点的计算都让你绞尽脑汁。而且也不能通过之前的计算结果推算出加权移动平均值。
移动平均值永远不可能应用于现有的数据集边缘的数据,因为它们的窗口宽度是有限的。这是一个大问题,因为数据集边缘的变动形态一般都是我们最感兴趣的部分。
类似地,移动平均法也不能应用于现有数据集的范围之外。其结果是,它们对预测毫无用处。
幸运的是,有一种很简单的计算方案能够避免所有这些问题。它叫指数平滑法(exponential smoothing)或Holt-Winters法。指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但没有季节性的序列。术语“Holt-Winters法”有时特指三次指数平滑法。
所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。它们通过“混合”新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的拌和参数来控制。各种方法的不同之处在于它们跟踪的量的个数和对应的拌和参数的个数。
一次指数平滑法的递推关系特别简单:
其中,是时间步长i上经过平滑后的值,是这个时间步长上的实际(未平滑的)数据。你可以看到是怎么由原始数据和上一时间步长的平滑值混合而成的。拌和参数可以是0和1之间的任意值,它控制着新旧信息之间的平衡:当接近1时,我们就只保留当前数据点(即完全没有对序列进行平滑);当接近0时,我们就只保留前面的平滑值(也就是说整个曲线都是平的)。
为何这个方法被称为“指数”平滑法?要找出答案,展开它的递推关系式即可知道:
从这里可以看出,在指数平滑法中,所有先前的观测值都对当前平滑值产生了影响,但它们所起的作用随着参数的幂的增大而逐渐减小。那些相对较早的观测值所起的作用相对较小,这也就是指数变动形态所表现出来的特性。从某种程度上来说,指数平滑法就像是拥有无限记忆且权值呈指数级递减的移动平均法。(同时也要注意到所有权值的和,等于1,因为当q<1 时,几何序列。参见附录B的几何序列方面的信息。)
一次指数平滑所得的计算结果可以在数据集范围之外进行扩展,因此也就可以用来进行预测。预测也非常简单:
其中,是最后一个已经算出来的值。也就是说,一次指数平滑法得出的预测在任何时
候都是一条直线。
刚刚描述的一次指数平滑法适用于没有总体趋势的时间序列。如果用来处理有总体趋势的序列,平滑值将往往滞后于原始数据,除非的值接近1,但这样一来就会造成不够平滑。
二次指数平滑法保留了趋势的详细信息,从而改正了这个缺点。换句话说,我们保留并更新两个量的状态:平滑后的信号和平滑后的趋势。它有两个等式和两个拌合参数:
我们先看看第二个等式。这个等式描述了平滑后的趋势。当前趋势的未平滑“值”是当前平滑值和上一个平滑值的差;也就是说,当前趋势告诉我们在上一个时间步长里平滑信号改变了多少。要想使趋势平滑,我们用一次指数平滑法对趋势进行处理,并使用拌合参数。为获得平滑信号,我们像上次那样进行一次混合,但要同时考虑到上一个平滑信号及趋势。第一个等式的最后那个项可以对当前平滑信号进行估计——假设
在单个时间步长里我们保持着上一个趋势。
若要利用该计算结果进行预测,我们就取最后那个平滑值,然后每增加一个时间步长,就在该平滑值上增加一次最后那个平滑趋势:
最后,我们给三次指数平滑法添加第三个量,用来描述季节性。我们有必要区分一下累加式和累乘式季节性,累加式对应的等式:
累乘式的等式:
其中,pi 是指“周期性”部分,是这个周期的长度。前面的等式中也包含预测的等
式。
所有的指数平滑方法都是基于递推关系的,这表明我们要先设定初始值才能使用它们。选择什么样的初始值并不特别重要:指数式衰减规律说明所有的指数平滑方法的“记忆”能力都是很短的,只需经过几个时间步长,初始值的影响就会变得微乎其微。一些
合理的初始值:
且
对三次指数平滑法而言,我们必须初始化一个完整的“季节”的值,不过我们可以简单地设置为全1(针对累乘式)或全0(针对累加式)。只有当序列的长度较短时,我们才
需要慎重考虑初始值的选取。
最后一个问题是如何选择拌合参数。我的建议是反复试验。先试试0.2和0.4之间的几个值(非常粗略地),然后看看会得到什么结果。或者也可以为(实际数据和平滑算法的结果之间的)误差定义一个标准,再使用一个数值优化过程来将误差最小
化。就我的经验而言,一般没有必要弄得这么麻烦,原因至少有两个:数值优化是一个不能保证收敛的迭代过程,最终你可能还需要花非常多时间将算法设计成收敛的。此外,任何这样的数值优化都受限于你选对误差进行最小化的表达式。问题是使误差最小化的参数值可能并不能满足在解决方案中你想要看到的其他特性(也就是近似值的精确性和结果曲线的平滑程度之间的平衡),那么,到最后你才会发现,手动的计算方法往往更好。不过,如果你要预测很多序列,花些精力构建一个能自动决定最优参数值的系统也是值得的,但要实现这个系统恐怕也并不容易。
最后,我想用一个例子来展示我们想从指数平滑法得到的结果。下图是一个经典的数据集,它显示的是每个月国际航班的旅客数量(单位:千人) 。该图显示了实际数据和三次指数近似值。1949—1957年用来“训练”生成它的算法,而1958—1960年都是预测数值。注意,这里的预测值与实际数据相当接近——特别是它强烈的季节形态——持续了一段如此长的预测时段(整整三年!)。对于像这样简单的方法来说,是很不错的。
时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)
在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在之后的走势,三次指数平滑(Triple/Three Order Exponential Smoothing,Holt-Winters)算法可以很好的进行时间序列的预测。
时间序列数据一般有以下几种特点:1.趋势(Trend) 2. 季节性(Seasonality)。
趋势描述的是时间序列的整体走势,比如总体上升或者总体下降。下图所示的时间序列是总体上升的:
季节性描述的是数据的周期性波动,比如以年或者周为周期,如下图:
三次指数平滑算法可以对同时含有趋势和季节性的时间序列进行预测,该算法是基于一次指数平滑和二次指数平滑算法的。