TensorFlow学习--指数移动平均/tf.train.ExponentialMovingAverage
時間序列模型
時間序列是指將同一統計指標的數值按其發生的時間先后順序排列而成的數列.時間序列分析的主要目的是根據已有的歷史數據對未來進行預測.處理與時間相關數據的方法叫做時間序列模型.
當一個平穩序列?X(t)X(t)中混入噪聲?Er(t)Er(t),變成如圖所示:
此時引入Rho系數
?X(t)=Rho×X(t?1)+Er(t)X(t)=Rho×X(t?1)+Er(t)
將?RhoRho的值增加到0.5,將會得到如下圖所示:
將?RhoRho的值增加到0.9,如圖.這樣逐漸得到一個平穩時間序列.
移動平均/MA
移動平均/滑動平均(Moving average,MA)是一種簡單平滑預測技術,當時間序列的數值由于受周期變動和隨機波動的影響,起伏較大,不易顯示出事件的發展趨勢時,使用移動平均法可以消除這些因素的影響,顯示出事件的發展方向與趨勢.
移動平均可分以下幾種:
- 簡單移動平均(SMA):前n個數據的未加權均值.如K線圖中的5天移動平均線即5天內收盤價的均值.
- 累計移動平均(CMA):數據以有序基準流的形式到達,用戶希望獲得所有直到當前基準點數據的平均值.詳細解釋見wikipedia:Cumulative moving average.
- 加權移動平均(WMA):為樣本窗口內不同位置的變量分配不同的權重,各變量乘以對應的權重后求均值.即基準點與固定加權函數的卷積.
- 指數移動平均(EMA):也稱為指數加權移動平均(Exponentially Weighted Moving Average),是一種無限脈沖響應濾波器,采用指數下降的加權因子.每個舊數據的權重都呈指數遞減,且不達到零.
指數移動平均與加權移動平均對比:
WMA權重 N = 15
EMA權重 N = 15
指數移動平均/EMA
指數移動平均/EMA(或指數加權移動平均Exponentially Weighted Moving Average)是一種常用的序列數據處理方式.處理過程為:
α控制衰減速率,Yt表示時間t時的原始值,St表示經過EMA后的時間t的值.指數移動平均就是把一系列的離散數據點轉化為更好的數據點,后面的數據點會記住前面的數據點的一些信息,離得越遠記得越少.
在TensorFlow中提供了tf.train.ExponentialMovingAverage() 來實現移動平均模型,即通過采用指數衰減保持變量的平均值.
在訓練/保存模型時,使用tf.train.ExponentialMovingAverage()取不同迭代次數模型參數的移動平均,可以使模型在測試數據上更加robust.可以移動平均后的模型在性能上通常會比最后一次迭代保存的模型要好一些,在一定上可以提高最終模型在測試數據上的表現.
tf.train.ExponentialMovingAverage()
tf.train.ExponentialMovingAverage()
- decay:衰減率.
- num_updates:變量更新次數計數.
- zero_debias:若為True,則使用張量初始化零移動平均值.
- name:在apply()中添加的操作名稱的前綴名稱.
tf.train.ExponentialMovingAverage()需要提供一個衰減率/decay.該衰減率用于控制模型更新的速度.ExponentialMovingAverage對每一個待更新訓練學習的變量/variable都會維護一個影子變量/shadow variable.影子變量的初始值就是這個變量的初始值,每次更新影子變量的值更新為:
shadow_variable = decay * shadow_variable + (1 - decay) * variableshadow_variable為影子變量,variable為待更新變量,decay為衰減率.
decay決定了模型更新速度,decay越大模型越趨于穩定.實際應用中,decay 一般會設為十分接近 1 的常數(0.99或0.999).為了使模型在訓練初始階段更新更快,ExponentialMovingAverage還提供了 num_updates參數來動態設置 decay 的大小.若ExponentialMovingAverage初始化時提供了num_updates參數,則每次使用的衰減率為:
即在訓練開始時衰減率較低,這使得移動均線移動更快.隨著變量更新次數的增加,衰減率(1 + num_updates) / (10 + num_updates)逐漸變高,當增加到一定次數后最終(1 + num_updates) / (10 + num_updates)大于decay,衰減率變為decay.
apply(var_list=None) 保持變量的平均值.返回更新移動平均線的操作.var_list:變量或張量對象的列表.
average(var) 返回Variable持有的平均值var.
ExponentialMovingAverage使用示例
#!/usr/bin/python # coding:utf-8import tensorflow as tf v1 = tf.Variable([1, 2, 0], dtype=tf.float32) step = tf.Variable(tf.constant(0)) # 通過采用指數衰減保持變量的平均值 ema = tf.train.ExponentialMovingAverage(decay=0.99, num_updates=step) maintain_average = ema.apply([v1])with tf.Session() as sess:# 初始的值都為[1, 2, 0]sess.run(tf.global_variables_initializer())print sess.run([v1, ema.average(v1)])# # 把[1, 2, 0]變為[1, 2, 5]sess.run(tf.assign(v1, [1, 2, 5]))sess.run(maintain_average)# decay=min(0.99, 1/10)=0.1, v1=0.1*0+0.9*5=4.5print sess.run([v1, ema.average(v1)])# steps=10000sess.run(tf.assign(step, 10000))# 把v1變為10sess.run(tf.assign(v1, [1, 3, 10]))sess.run(maintain_average)# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*2+0.01*4=2.01# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*4.5+0.01*10=4.555print sess.run([v1, ema.average(v1)])sess.run(maintain_average)print sess.run([v1, ema.average(v1)])輸出:
[array([ 1., 2., 0.], dtype=float32), array([ 1., 2., 0.], dtype=float32)] [array([ 1., 2., 5.], dtype=float32), array([ 1. , 2. , 4.5], dtype=float32)] [array([ 1., 3., 10.], dtype=float32), array([ 1. , 2.00999999, 4.55499983], dtype=float32)] [array([ 1., 3., 10.], dtype=float32), array([ 1. , 2.01990008, 4.60944986], dtype=float32)]參考:
wikipedia:Moving average
TensorFlow-API-ExponentialMovingAverage
A Complete Tutorial on Time Series Modeling in R
《Tensorflow實戰Google深度學習框架》4.4.3滑動平均模型.
總結
以上是生活随笔為你收集整理的TensorFlow学习--指数移动平均/tf.train.ExponentialMovingAverage的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算入门:FusionAccess桌面
- 下一篇: Python爆破Zip密码