EMA 基本概念見 Wikipedia,本文不贅述。
基本公式
S[0] = Y[0]
S[i] = Y[i] * alpha + S[i-1] * (1 - alpha)
其中 alpha 為平滑因子,數值越小曲線越平滑
要點
- 初始值 S1 會引入誤差,為了消除誤差有幾種常見政策:
- 取前 N 個值的均值作為 S1
- 疊代的前 N 次使用動态平滑因子 alpha,從 1 逐漸變為設定值。
- 系統空轉 N 次( ‘spin-up’ interval)之後再對外提供服務
- 如何選擇 alpha?
- 這是應用決定的,并沒有固定的規則。
- 一種選擇alpha 的思路是使得均方差最小,資料最平滑。
- 你也可以有自己的政策(思考:你真的需要特别平滑嗎?)
一種自适應的計算 alpha 的方法
S[i] 可以寫作:
S[n] = w[n] * Y[n] + w[n-1] * Y[n-1] + w[n-2] * Y[n-2] + … w[1] * Y[1] + w[0] * Y[0]
Y 值是随機序列,我們無法預知。每個 Y 的權重 w 和 alpha 相關,是可以預先計算出來的。什麼意思呢?分述如下:
我們沒有辦法控制 Y[i] 在 S[n] 中的占比,因為 Y[i] 是一個輸入序列,我們無法預先知道它的值。舉個例子
設
Y[0] = Y[1] = … = Y[n - k - 1] = 1;
Y[n - k] = Y[n - k + 1] = … = Y [n - 1] = Y[n] = 0
有:
S[n] = w[n - k - 1] * Y[n - k - 1] + … w[1] * Y[1] + w[0] * Y[0]
可知無論 w (w > 0 )為多少,Y[0], Y[1], … , Y[n - k - 1] 在 S[n] 中占比 100%。
但是,我們可以控制 最後 k 個值的權重在總權重裡的占比。>>參考文檔<<
最後k個權重之外的權重和 / 總權重
= (w[n-k] + w[n-k-1] + w[n-k-2] + …. ) / 1
= a * ( 1 - a)^k + a * (1 - a)^(k+1) + ….
= a * (1-a) ^k * [ 1 + (1-a) + (1-a)^2 + …..]
= (1-a)^k
第四步到第五步,數學不太好的同學注意:當 1 > a > 0, n->無窮時,
a * [ 1 + (1-a) + (1-a)^2 + …..] = 1
如果我們希望最近 k 步之前的權重占比為 10%,最近 k 步權重占比 90%,根據上面的公式有:
0.1 = (1 - a) ^k
則有: a = 1 - e^(ln0.1 / k)
再看一個最近 k 步之前的權重值為一個特殊值的例子: e^-1。
我們希望最近 k 步之前的權重占比為 e^-1 = 0.3678,最近 k 步權重占比 1- e ^ -1 = 0.6321,根據上面的公式有:
e ^ -1 = (1 - a) ^k
則有: a = 1 - e^(-1 / k)
k-alpha 對照表:
k | a |
---|---|
1 | 0.6321 |
2 | 0.3934 |
3 | 0.2834 |
4 | 0.2212 |
5 | 0.1813 |
10 | 0.095 |
20 | 0.049 |
30 | 0.033 |
40 | 0.025 |
50 | 0.020 |
100 | 0.010 |
200 | 0.005 |
設采樣周期為 interval,采樣視窗為 window,那麼視窗内共采樣 window / interval 次。
設 k = window / interval。
則有 a = 1 - e ^ ( -1 / (window / interval)) = 1 - e ^ (- interval / window)
在這種情況下,最近 2k 步權重占比為多少呢?
1 - 忽略的權重 / 總權重 = 1 - (1-a)^2k = 1 - e ^ -2 = 1 - 0.1353 = 0.8647
對照表:
step | weight |
---|---|
k | 0.6321 |
2k | 0.8647 |
3k | 0.9502 |
4k | 0.9816 |
從應用的角度看,這意味着什麼呢?
假設我們的 window 是 1 天,那麼最近一天的權重占比 63%,最近 2 天的權重占比 86%,三天 95%,四天 98%,等等。這意味着四天之外的權重影響力隻占到 2%。還啰嗦一句,這裡是“權重影響力”,并不是”資料影響力“,w 和 Y 是兩碼事。如果 四天之外的資料特别大或者特别小,對目前計算出來的值影響還是會很大的。
最後附幾個例子。
圖中,每個格子是 100 * 100, 紅色部分為 EMA曲線。
資料特征永久變化,interval = 100,window = 100,alpha = 0.2834
連續數日資料特征變化,後恢複,interval = 100,window = 100,alpha = 0.2834
某日資料突變,後恢複,interval = 100,window = 100,alpha = 0.2834
EMA 幾乎跟随資料變化,interval = 1,window = 1,alpha = 0.033
線上感受一下EMA曲線和參數之間的關系吧:http://reactshare.cn/ema