滑动平均模型的相关知识:
滑动平均模型
一、移动平均法相关知识
移动平均法又称滑动平均法、滑动平均模型法(Moving average,MA)
什么是移动平均法
移动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。移动平均法适用于即期预测。当产品需求既不快速增长也不快速下降,且不存在季节性因素时,移动平均法能有效地消除预测中的随机波动,是非常有用的。移动平均法根据预测时使用的各元素的权重不同
移动平均法是一种简单平滑预测技术,它的基本思想是:根据时间序列资料、逐项推移,依次计算包含一定项数的序时平均值,以反映长期趋势的方法。因此,当时间序列的数值由于受周期变动和随机波动的影响,起伏较大,不易显示出事件的发展趋势时,使用移动平均法可以消除这些因素的影响,显示出事件的发展方向与趋势(即趋势线),然后依趋势线分析预测序列的长期趋势。
移动平均法的种类
移动平均法可以分为:简单移动平均和加权移动平均。
简单移动平均法
简单移动平均的各元素的权重都相等。简单的移动平均的计算公式如下: Ft=(At-1+At-2+At-3+…+At-n)/n式中
·Ft--对下一期的预测值;
·n--移动平均的时期个数;
·At-1--前期实际值;
·At-2,At-3和At-n分别表示前两期、前三期直至前n期的实际值。
加权移动平均法
加权移动平均给固定跨越期限内的每个变量值以不同的权重。其原理是:历史各期产品需求的数据信息对预测未来期内的需求量的作用是不一样的。除了以n为周期的周期性变化外,远离目标期的变量值的影响力相对较低,故应给予较低的权重。加权移动平均法的计算公式如下:
Ft=w1At-1+w2At-2+w3At-3+…+wnAt-n式中,
·w1--第t-1期实际销售额的权重;
·w2--第t-2期实际销售额的权重;
·wn--第t-n期实际销售额的权
·n--预测的时期数;w1+ w2+…+ wn=1
在运用加权平均法时,权重的选择是一个应该注意的问题。经验法和试算法是选择权重的最简单的方法。一般而言,最近期的数据最能预示未来的情况,因而权重应大些。例如,根据前一个月的利润和生产能力比起根据前几个月能更好的估测下个月的利润和生产能力。但是,如果数据是季节性的,则权重也应是季节性的。
移动平均法的优缺点
使用移动平均法进行预测能平滑掉需求的突然波动对预测结果的影响。但移动平均法运用时也存在着如下问题:
1、加大移动平均法的期数(即加大n值)会使平滑波动效果更好,但会使预测值对数据实际变动更不敏感;
2、移动平均值并不能总是很好地反映出趋势。由于是平均值,预测值总是停留在过去的水平上而无法预计会导致将来更高或更低的波动;
3、移动平均法要由大量的过去数据的记录。
案例
简单移动平均法在房地产中的运用
某类房地产2001年各月的价格如下表中第二列所示。由于各月的价格受某些不确定因素的影响,时高时低,变动较大。如果不予分析,不易显现其发展趋势。如果把每几个月的价格加起来计算其移动平均数,建立一个移动平均数时间序列,就可以从平滑的发展趋势中明显地看出其发展变动的方向和程度,进而可以预测未来的价格。
在计算移动平均数时,每次应采用几个月来计算,需要根据时间序列的序数和变动周期来决定。如果序数多,变动周期长,则可以采用每6个月甚至每12个月来计算;反之,可以采用每2个月或每5个月来计算。对本例房地产2001年的价格,采用每5个月的实际值计算其移动平均数。计算方法是:把1~5月的价格加起来除以5得684元/平方米,把2~6月的价格加起来除以5得694元/平方米,把3~7月的价格加起来除以5得704元/平方米,依此类推,见表中第三列。再根据每5个月的移动平均数计算其逐月的上涨额,见表中第四列。
假如需要预测该类房地产2002年1月的价格,则计算方法如下:由于最后一个移动平均数762与2002年1月相差3个月,所以预测该类房地产2002年1月的价格为:762 + 12 × 3 = 798(元/平方米)
加权移动平均法在计算销售额中的运用
某商场1月份至11月份的实际销售额如表所示。假定跨越期为3个月,权数为l、2、3,试用加权移动平均法预测12月份的销售额。
二、基于TensorFlow的滑动平均模型
设{a1,a2,a3,...,an}{a1,a2,a3,...,an},其衰减率为decaydecay,对应的影子变量为:
{m1,m2,m3,...,mn}{m1,m2,m3,...,mn},则:
mn=decay∗mn−1+(1−decay)∗anmn=decay∗mn−1+(1−decay)∗an
可以展开来分析:
m1=a1
m2=decay∗a1+(1−decay)∗a2
m3=decay∗m2+(1−decay)∗a3=decay^2∗a1+(1−decay)∗decay∗a2+(1−decay)∗a3
m4=decay∗m3+(1−decay)∗a4=decay^3∗a1+(1−decay)∗decay^2∗a2+(1−decay)∗decay∗a3+(1−decay)∗a4
............
以其类推
mn=decay∗mn−1+(1−decay)∗an=decay^n−1∗a1+decay^n−2∗(1−decay)+...+(1−decay)∗an
当decay趋向于1的时候,a1影响比较大,也就是越靠前影响越大,当decay趋向于0的时候,an影响比较大,也就是
越靠后影响越大,因为给出来的是a1,为了使模型收敛,我们去decay趋向于1,所以初始未更新时的decay去趋向于1的
目的是为了模型(关于m的模型)能够收敛。
但是这样也会有个局限性,越到后面更新的值影响越小,那么我们也需要对decay进行更新,后面会写到更新方法。
一般而言,为了使模型趋于收敛,会选择decay为接近1的数,例如:
decay = 0.99;
那么:
m1=a1
m2=0.99∗a1+0.01∗a2
m3=0.99∗m2+0.01∗a3=0.99^2∗a1+0.01∗0.99∗a2+0.01∗a3
我们发现初始值对后面影响非常大,若初始值与真实值偏差较大时,函数收敛速度非常慢(因为模型越趋于稳定,更新慢);为了解决该问题,tensorflow提供了num_updates参数来动态设置decay的大小;
decay=min{DECAY,1+num_updates10+num_updates}
例:
DECAY = 0.99
第一轮,先设num_updates = 0;
那么:
decay=min{0.99,1+010+0}=0.1decay=min{0.99,1+010+0}=0.1
则:
m1=a1
m2=0.1∗a1+0.9∗a2
第二轮,可设num_updates = 100
那么:
decay=min{0.99,1+10110+100}=0.91
则:
m3=0.91∗m2+0.09∗a3
以此类推,从而可以动态调整decay值大小。
相关代码:
以下代码中,step相当于num_update,用来更新和控制decay的值,调整收敛速度。
ema.apply([v1])用来更新滑动平均值。
创建ema累后,里面有一些函数可以直接使用。