指数移动平均EMA

2023-10-11 20:20
文章标签 平均 移动 指数 ema

本文主要是介绍指数移动平均EMA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

指数移动平均EMA

  • 介绍
    • 示例代码
  • 补充:torch.lerp

介绍

指数移动平均(Exponential Moving Average,简称 EMA)是一种常用的平滑方法,通常用于时间序列数据的平滑处理。EMA 可以减小噪声的影响,使得数据更加平滑,并且能够自适应地调整权重,更好地反映时间序列的趋势。

EMA 的计算公式如下:

E M A t = { x 0 , t = 0 α x t + ( 1 − α ) E M A t − 1 , t > 0 EMA_t = \begin{cases} x_0, & t=0 \\ \alpha x_t + (1-\alpha)EMA_{t-1}, & t>0 \end{cases} EMAt={x0,αxt+(1α)EMAt1,t=0t>0

其中, x t x_t xt 表示时间 t t t 的观测值, E M A t EMA_t EMAt 表示时间 t t t 的指数移动平均值, α \alpha α 是平均因子,通常取值范围为 ( 0 , 1 ) (0,1) (0,1)。当 α \alpha α 较小时,EMA 更加平滑;当 α \alpha α 较大时,EMA 更加灵敏,能够更快地反映最近的变化。

在实际应用中,为了保持数据的平滑和稳定,通常需要对 EMA 进行偏差校正。偏差校正的目的是将 EMA 的初始值设置为第一个观测值 x 0 x_0 x0,并调整权重,使得 EMA 能够更加准确地反映时间序列的趋势。EMA 的偏差校正公式如下:

E M A t ′ = E M A t 1 − α t EMA'_t = \frac{EMA_t}{1-\alpha^t} EMAt=1αtEMAt

其中, E M A t ′ EMA'_t EMAt 表示经过偏差校正后的 EMA 值。

在机器学习中,EMA 通常用于优化算法的参数更新。例如,在使用 Adam 优化算法时,每次迭代时会计算参数的一阶矩估计和二阶矩估计,并使用 EMA 对其进行平滑处理,以获得更加稳定和有效的参数更新。具体来说,Adam 优化算法中的 EMA 公式如下:

m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t θ t = θ t − 1 − η v ^ t + ϵ m ^ t \begin{aligned} m_t &= \beta_1 m_{t-1} + (1-\beta_1)g_t \\ v_t &= \beta_2 v_{t-1} + (1-\beta_2)g^2_t \\ \hat{m}_t &= \frac{m_t}{1-\beta_1^t} \\ \hat{v}_t &= \frac{v_t}{1-\beta_2^t} \\ \theta_t &= \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}\hat{m}_t \end{aligned} mtvtm^tv^tθt=β1mt1+(1β1)gt=β2vt1+(1β2)gt2=1β1tmt=1β2tvt=θt1v^t +ϵηm^t

其中, m t m_t mt v t v_t vt 分别表示参数的一阶矩估计和二阶矩估计, g t g_t gt 表示参数的梯度, β 1 \beta_1 β1 β 2 \beta_2 β2 分别是一阶矩和二阶矩的衰减因子, m ^ t \hat{m}_t m^t v ^ t \hat{v}_t v^t 分别是经过偏差校正后的一阶矩估计和二阶矩估计, η \eta η 是学习率, ϵ \epsilon ϵ 是一个很小的数,用于防止除数为零。在这个公式中,EMA 对一阶矩估计 m t m_t mt 和二阶矩估计 v t v_t vt 进行了平滑处理,并且使用了偏差校正,以获得更加稳定和有效的参数更新。

示例代码

使用torch.lerp函数实现EMA:

def moving_average(model, model_test, beta=0.999):for param, param_test in zip(model.parameters(), model_test.parameters()):param_test.data = torch.lerp(param.data, param_test.data, beta)

补充:torch.lerp

torch.lerp 是 PyTorch 中的一个函数,用于执行线性插值。它的函数原型如下:

torch.lerp(start, end, weight, out=None)

其中,各参数的含义如下:

  • start:起始值的张量。
  • end:结束值的张量。
  • weight:插值系数的张量,取值范围为 [0, 1]。
  • out:输出张量(可选)。

torch.lerp 的返回值是一个张量,表示线性插值的结果。

以下是一个使用 torch.lerp 函数的示例代码:

import torch# 创建起始值和结束值张量
start = torch.tensor([1.0, 2.0, 3.0])
end = torch.tensor([4.0, 5.0, 6.0])# 创建插值系数张量
weight = torch.tensor([0.25, 0.5, 0.75])# 执行线性插值
result = torch.lerp(start, end, weight)# 输出结果
print(result)

在这个例子中,我们创建了两个形状为 3 3 3 的张量 startend,分别表示起始值和结束值。然后,我们创建了一个形状为 3 3 3 的张量 weight,它表示插值系数。最后,我们使用 torch.lerp 函数对 startend 进行线性插值,并将结果保存在 result 变量中。最终,我们输出了插值的结果。

需要注意的是,torch.lerp 函数要求起始值、结束值和插值系数的张量形状必须相同,且插值系数的取值范围必须在 [0, 1] 之间。如果插值系数的取值范围不在 [0, 1] 之间,可以使用 torch.clamp 函数对其进行截断。如果指定了输出张量 out,则插值结果会写入到 out 中,并返回 out 张量。

这篇关于指数移动平均EMA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/190603

相关文章

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的通信中,多播可大大节约网络资源。假设视频服务器向 90 台主机传送同样的视频节目,单播与多播的比较如下图所示。 下图(a)是视频服务器用单播方式向 90 台主机传

【uva】11536-Smallest Sub-Array(区间移动问题)

一个区间移动的问题,1A了,感觉没什么好说的。。 13975926 11536 Smallest Sub-Array Accepted C++ 0.809 2014-08-01 11:00:20 #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define INF 1 << 30