EMA 基本概念见 Wikipedia,本文不赘述。

基本公式

S[0] = Y[0]
S[i] = Y[i] * alpha + S[i-1] * (1 - alpha)

其中 alpha 为平滑因子,数值越小曲线越平滑

要点

  1. 初始值 S1 会引入误差,为了消除误差有几种常见策略:

    • 取前 N 个值的均值作为 S1
    • 迭代的前 N 次使用动态平滑因子 alpha,从 1 逐渐变为设定值。
    • 系统空转 N 次( ‘spin-up’ interval)之后再对外提供服务
  2. 如何选择 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

EMA - 指数移动平均相关推荐

  1. EMA(指数移动平均)及其深度学习应用

    在深度学习中,经常会使用EMA(指数移动平均)这个方法对模型的参数做平均,以提高测试指标并增加模型鲁棒. 1.基于数学的介绍 1.1 公式例子 我们有关于"温度-天数"的数据 :在 ...

  2. Python 计算EMA(指数移动平均线)

    总结 使用递归和循环两种方法来完成 python环境下循环相比于递归更快,更适应极端样本情况 递归 def _ema(arr,i=None):N = len(arr) α = 2/(N+1) #平滑指 ...

  3. python 移动平均线_Python 计算EMA(指数移动平均线)

    总结 使用递归和循环两种方法来完成 python环境下循环相比于递归更快,更适应极端样本情况 递归 def _ema(arr,i=None): N = len(arr) α = 2/(N+1) #平滑 ...

  4. 【深度学习】关于EMA:指数移动平均

    什么是EMA 指数移动平均(exponential moving average),也叫做权重移动平均(weighted moving average),可以用来估计变量的局部均值,使得变量的更新与一 ...

  5. 【提分trick】SWA(随机权重平均)和EMA(指数移动平均)

    1. SWA随机权重平均 1.1步骤 1.2代码 2.EMA指数移动平均 2.1步骤 2.2代码 3.总结 在kaggle比赛中,不管是目标检测任务.语义分割任务中,经常能看到SWA(Stochast ...

  6. PyTorch指数移动平均(EMA)手册

    文章目录 PyTorch指数移动平均(EMA)手册 EMA的数学模型 EMA的意义 EMA的偏差修正 EMA在测试阶段的优越性能 PyTorch实现 Reference PyTorch指数移动平均(E ...

  7. TensorFlow学习--指数移动平均/tf.train.ExponentialMovingAverage

    时间序列模型 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.处理与时间相关数据的方法叫做时间序列模型. 当一个平稳序列 ...

  8. 【炼丹技巧】指数移动平均(EMA)【在一定程度上提高最终模型在测试数据上的表现(例如accuracy、FID、泛化能力...)】

    本文中心: 1.指数移动平均(Exponential Moving Average)EMA作用: ema不参与实际的训练过程,是用在测试过程的,相比对变量直接赋值而言,移动平均得到的值在图像上更加平缓 ...

  9. python 移动平均函数_「EMA系列之I」如何理解EMA指数移动平均值以及Python实现

    「EMA系列」打算写三篇,从最基本的到比较深入的都会涉及,谈谈对EMA及其使用的理解. 这篇文章是第一篇Part 1,主要讲讲如何用比较直接的方式去理解经典EMA. EMA的加权平均值定义 EMA是E ...

最新文章

  1. rtsp有没有好使_轻量级RTSP服务和内置RTSP网关有什么不同?
  2. java 8 什么软件_Java 8你了解多少呢?Java之被人遗忘的Java 8的八个功能
  3. flutter ios打包_Flutter项目之iOS应用的打包发布流程
  4. mysql jdbc dbcp_连接数据库 JDBC、DBCP、JNDI
  5. 最全面的_Redis_基本操作总结
  6. JTStackController
  7. Linux安装ipvsadm工具查看ipvs
  8. 本田da屏怎么进wince系统_东风本田LIFE“来福酱”上市
  9. 怎么增加android模拟器内存卡,增加android模拟器的内存大小
  10. P4827 [国家集训队] Crash 的文明世界
  11. Java获取系统时间
  12. boot spring 跨域注解_每日一问学技术:@SpringBootApplication注解干了个啥?
  13. SVN记录转excel文件的小程序
  14. mysql循环遍历获取_mysql存储过程之循环遍历查询结果集
  15. 【Arcpy】Python in ArcGIS
  16. 数据挖掘——统计学分析(一:数据的整理与图示表示)
  17. java 恒等于_JavaScript中 ==(等于) 与 === (恒等于) 的区别
  18. CentOS6 的yum源配置
  19. 韩昊 20190919-2 功能测试
  20. 墨画子卿第一章第1节

热门文章

  1. Dockerfile 参考文档中文版
  2. Java架构师:概述
  3. 山理工-知到-大学生国家安全教育-第六章答案
  4. 煤炭行业智能SRM系统:实现供应商可视化管理,提高企业采购效益
  5. Android apk下载
  6. EndNote(参考文献管理软件)官方正式版V20.1.0 | 含endnote安装教程
  7. CAS单点登入登出原理
  8. PAT : 基础编程题目集_函数题答案(6-1 ~ 6-13)(纯C编写)
  9. java/php/net/python作业批改系统的设计
  10. python中yield,send及next的使用