Tensorflow滑动平均模型tf.train.ExponentialMovingAverage解析
觉得有用的话,欢迎一起讨论相互学习~
移动平均法相关知识
移动平均法又称滑动平均法、滑动平均模型法(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
在运用加权平均法时,权重的选择是一个应该注意的问题。经验法和试算法是选择权重的最简单的方法。一般而言,最近期的数据最能预示未来的情况,因而权重应大些。例如,根据前一个月的利润和生产能力比起根据前几个月能更好的估测下个月的利润和生产能力。但是,如果数据是季节性的,则权重也应是季节性的。
移动平均法的优缺点
-
使用移动平均法进行预测能平滑掉需求的突然波动对预测结果的影响。但移动平均法运用时也存在着如下问题:
加大移动平均法的期数(即加大n值)会使平滑波动效果更好,但会使预测值对数据实际变动更不敏感;
移动平均值并不能总是很好地反映出趋势。由于是平均值,预测值总是停留在过去的水平上而无法预计会导致将来更高或更低的波动;
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月份的销售额。
tf.train.ExponentialMovingAverage
函数定义
tensorflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,他使用指数衰减来计算变量的移动平均值。
tf.train.ExponentialMovingAverage.init(self, decay, num_updates=None, zero_debias=False, name="ExponentialMovingAverage"):
decay是衰减率在创建ExponentialMovingAverage对象时,需指定衰减率(decay),用于控制模型的更新速度。影子变量的初始值与训练变量的初始值相同。当运行变量更新时,每个影子变量都会更新为:
\]
- num_updates是ExponentialMovingAverage提供用来动态设置decay的参数,当初始化时提供了参数,即不为none时,每次的衰减率是:
\]
apply()方法添加了训练变量的影子副本,并保持了其影子副本中训练变量的移动平均值操作。在每次训练之后调用此操作,更新移动平均值。
average()和average_name()方法可以获取影子变量及其名称。
decay设置为接近1的值比较合理,通常为:0.999,0.9999等
示例代码
import tensorflow as tf
v1 = tf.Variable(0, dtype=tf.float32) # 定义一个变量,初始值为0
step = tf.Variable(0, trainable=False) # step为迭代轮数变量,控制衰减率
ema = tf.train.ExponentialMovingAverage(0.99, step) # 初始设定衰减率为0.99
maintain_averages_op = ema.apply([v1]) # 更新列表中的变量
with tf.Session() as sess:
init_op = tf.global_variables_initializer() # 初始化所有变量
sess.run(init_op)
print(sess.run([v1, ema.average(v1)])) # 输出初始化后变量v1的值和v1的滑动平均值
sess.run(tf.assign(v1, 5)) # 更新v1的值
sess.run(maintain_averages_op) # 更新v1的滑动平均值
print(sess.run([v1, ema.average(v1)]))
sess.run(tf.assign(step, 10000)) # 更新迭代轮转数step
sess.run(tf.assign(v1, 10))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 再次更新滑动平均值,
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 更新v1的值为15
sess.run(tf.assign(v1, 15))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
#
# [0.0, 0.0]
# [5.0, 4.5]
# [10.0, 4.5549998]
# [10.0, 4.6094499]
# [15.0, 4.7133551]
参考博文:
http://blog.csdn.net/zSean/article/details/75201834
http://blog.csdn.net/tz_zs/article/details/75581315