浅谈指数移动平均(ema)

经常在各种代码中看到指数移动平均(比如我专注的网络传输领域),但却不曾想到它就是诠释世界的方法,我们每个人都在被这种方式 “平均”…

今天说说指数移动平均(或移动指数平均,Exponential Moving Average)。

能查到的资料都侧重于其数学形式和实现,比如卷积和 python,这一点不再赘述,所以要写点内涵,物理意义和哲学。

指数移动平均在我们遇到的很多时间序采样中应用甚广,比如 tcp 的 srtt,它在形式上如下:

V n = ( 1 − β ) ∗ V n − 1 + β ∗ C V_n=(1-\beta)*V_{n-1}+\beta*C Vn=(1β)Vn1+βC

其中 C 为当前采样值,而 Vn 就是该采样序列的指数移动平均。

ema 的形式极端简洁,它只需要拿当前采用进行增量计算,不需要保存任何历史采样,其形式中,beta 为当下值权重,1 - beta 则留给过往,这非常符合我们的思维习惯。

我们认识的每一件事物,其本质都在采样,我们将当前采用叠加在对该采用的历史记忆之上,一杯敬当下,一杯敬过往,形成对世界的理解,形成我们的观点,我们的整个世界每时每刻对每件事物都在做指数移动平均。

将形式展开,我们将发现我们理解世界的过程:
V n = β ∗ C + ( 1 − β ) ∗ V n − 1 V_n=\beta*C+(1-\beta)*V_{n-1} Vn=βC+(1β)Vn1
V n = β ∗ C n + ( 1 − β ) ∗ ( β ∗ C n − 1 + ( 1 − β ) ∗ V n − 2 ) V_n=\beta*C_n+(1-\beta)*(\beta*C_{n-1}+(1-\beta)*V_{n-2}) Vn=βCn+(1β)(βCn1+(1β)Vn2)

V n = β ∗ ( 1 − β ) 0 ∗ C n + β ∗ ( 1 − β ) 1 ∗ C n − 1 + β ∗ ( 1 − β ) 2 ∗ C n − 2 + β ∗ ( 1 − β ) 3 ∗ C n − 3 + . . . β ∗ ( 1 − β ) n ∗ C 0 = Σ m = 0 n ( 1 − β ) m ∗ β C n − m V_n=\beta*(1-\beta)^0*C_n+\beta*(1-\beta)^1*C_{n-1}+\beta*(1-\beta)^2*C_{n-2}+\beta*(1-\beta)^3*C_{n-3}+...\beta*(1-\beta)^n*C_0=\Sigma_{m=0}^{n}{(1-\beta)^m*\beta C_{n-m}} Vn=β(1β)0Cn+β(1β)1Cn1+β(1β)2Cn2+β(1β)3Cn3+...β(1β)nC0=Σm=0n(1β)mβCnm

这里不讲卷积的形式,只从物理意义上理解 Vn 的每一项都是一个采样值 Cx 和一个 1 - beta 次幂的乘积的原因。下面开始。

假设我们的大脑能无差别均匀等价记忆所有采样值,我们的记忆是:

M = { C n , C n − 1 , C n − 2 , C n − 3 , . . . } M=\{C_{n},C_{n-1},C_{n-2},C_{n-3},...\} M={Cn,Cn1,Cn2,Cn3,...}

然而我们不可能无差别记住所有采样,我们记忆容量有限,我们倾向于逐渐忘掉过往。由于历史记忆存在,当前采样仅能占据一部分记忆空间,这就是 β ∗ C \beta*C βC,那么 1 − β 1-\beta 1β 的份额将留给过往,所有的过往将共享这 1 − β 1-\beta 1β 的份额,这意味着随着新采样的不断进入,每一个历史采样必须衰减,历史越久的样本衰减越厉害,即 “逐渐忘掉过往” 。

M 集合按照历史时间序排序采样值 C,由于它进入记忆时均以 beta 份额压缩,事实上的 M 为:

M = { β ∗ C n , β ∗ C n − 1 , β ∗ C n − 2 , β ∗ C n − 3 , . . . } M=\{\beta*C_{n},\beta*C_{n-1},\beta*C_{n-2},\beta*C_{n-3},...\} M={βCn,βCn1,βCn2,βCn3,...}

它的每一项被一个同样的按历史时间序加速衰减的集合过滤:

F = { ( 1 − β ) 0 , ( 1 − β ) 1 , ( 1 − β ) 2 , ( 1 − β ) 3 , . . . } F=\{(1-\beta)^0,(1-\beta)^1,(1-\beta)^2,(1-\beta)^3,...\} F={(1β)0,(1β)1,(1β)2,(1β)3,...}

把集合 M 往下漏被集合 F 阻隔过滤,就形成了新的集合 V:

V = { β ∗ C n ∗ ( 1 − β ) 0 , β ∗ C n − 1 ∗ ( 1 − β ) 1 , β ∗ C n − 2 ∗ ( 1 − β ) 2 , β ∗ C n − 3 ∗ ( 1 − β ) 3 , . . . } V=\{\beta*C_n*(1-\beta)^0,\beta*C_{n-1}*(1-\beta)^1,\beta*C_{n-2}*(1-\beta)^2,\beta*C_{n-3}*(1-\beta)^3,...\} V={βCn(1β)0,βCn1(1β)1,βCn2(1β)2,βCn3(1β)3,...}

这就是指数移动平均的各项,看这相乘的形式当然可以把它理解成某种加权,但名称不重要。而它恰好可以被规整为一种简洁的递推式:

V n = ( 1 − β ) ∗ V n − 1 + β ∗ C V_n=(1-\beta)*V_{n-1}+\beta*C Vn=(1β)Vn1+βC

这就是历史记忆的运转方式。指数移动平均的本质在于一个样本的影响力以何种程度衰减到微不足道的地步,毕竟我们没人在乎自己 1 万年前的祖先是吃肉还是喝粥。

每个时代都认为自己的时代最特殊,最重要,但很快就被下个时代取而代之,淹没在历史长河。谁都逃不过指数移动被平均,过不了 100 年,人人乐道的改变世界的信息时代也将不过是一场平凡的技术革新罢了。

beta 如何选择取决于你想保存多久的记忆,或者说你容忍多久以前的采样可以忽略不计。

如果你希望的记忆周期为 100,在上述集合 V 中,数到第 100 个元素,它的衰减系数是集合 F 的第 100 项 (1 - beta)^99,只要它足够小,它后面的就相当于被彻底遗忘忽略不计了。

多小算足够小呢?取决于你自己。比如你认为 0.2 就足够小了,那就求解 (1 - beta)^99 > 0.2,选择一个 beta 即可。

前几天我论述的 dctcp,alpha 的系数 g 如何算呢:

α = ( 1 − g ) ∗ α + g ∗ F \alpha=(1-g)*\alpha+g*F α=(1g)α+gF

一个 F 需要延展到整个拥塞周期,在该周期内它均需要表现出影响力,设一个拥塞周期为 T,选定一个足够小到不被在乎的数 Q,只要在满足 ( 1 − g ) T > Q (1-g)^T>Q (1g)T>Q的 g 调得一手好参数即可。

如果既不知道什么是足够小,也不知道采样值的影响力周期,那就选择 1 / e 好了,因为 ( 1 − r ) 1 r (1-r)^{\frac{1}{r}} (1r)r1 的极限就是 1 / e,此时就求 ( 1 − β ) 1 β = 1 e (1-\beta)^{\frac{1}{\beta}}=\dfrac{1}{e} (1β)β1=e1 β 1 1 − β = 1 e \beta^{\frac{1}{1-\beta}}=\dfrac{1}{e} β1β1=e1就好,取决于你偏好当前还是偏好过往。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

且看迥然不同的 diff

文章目录 且看迥然不同的 diff语法默认比较两个文件并排显示方便比较context模式比较unified模式比较对比时忽略空格更多信息且看迥然不同的 diff Linux diff 命令用于比较文件的差异。 当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机…

【Linux Shell】4. 数组

文章目录 【 1. 数组的定义 】【 2. 读取数组 】【 3. 关联数组 】3.1 关联数组的定义3.2 关联数组元素的调用 【 4. 获取数组中的所有元素 】【 5. 获取数组的长度 】 数组中可以存放多个值。 Bash Shell 只支持一维数组(不支持多维数组),初…

算法训练第五十九天|503. 下一个更大元素 II、42. 接雨水

503. 下一个更大元素 II: 题目链接 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之…

AutoCAD 中镜像 操作

在 AutoCAD 中,镜像是一种常用的操作,可以在绘图过程中快速进行镜像对称。以下是 AutoCAD 中进行镜像操作的常用快捷键命令: 1. 镜像命令:MIRROR 或 MI - 输入 MIRROR 或 MI,然后按 Enter 键启动镜像命令。 2. 指定第一点:F 或 F+Enter - 输入 F 或 F+Enter,然后选择…

影响服务器正常使用的有哪些因素

对于网站优化来说,网站服务器的优化绝对是基础。不管是用户还是搜索引擎对于网站的打开速度都是没有太多耐心的, 所以网站优化的就是要保证网站服务器稳定,网站正常且快速的打开 1.用户体验较差 现在越来越强调用户体验,设想一…

imgaug库指南(五):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

游戏化教学在高校平台基础课程中的实践与学习体验提升

在高职计算机学院,无论计算机应用技术、软件技术、大数据应用技术还是人工智能应用等不同专业方向的学生,首先要接触和掌握一系列的基础平台课程。这些课程不仅包括政治、英语、数学等文化基础知识内容,更关键的是涉及网页设计基础、编程基础…

智慧校园全空间三维电子沙盘系统

一、概述 易图讯科技(www.3dgis.top)采用大数据、云计算、虚拟现实、物联网、AI等先进技术,自主可控高性能WebGIS可视化引擎,支持多用户客户端通过网络请求访问服务器地图和专题数据,提供地理信息数据、专题数据的并发…

MW Open - 高效率的API接口管理工具

本文将会详细介绍 MW Open,一个高效率的 API 接口管理工具,并提供相关代码示例。 一、简介 MW Open 是一款开源的 API 接口管理工具,支持管理 API 接口、测试 API 接口、生成 API 文档等功能。MW Open 拥有简洁明了的接口管理界面&#xff…

对象克隆学习

假如说你想复制一个简单变量。很简单: int apples 5; int pears apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象,情况就有些复杂了。 …

vue插件--xterm封装

安装 npm install xterm xterm-addon-fit -D两种模式 log:日志输出shell:终端命令 <template><div :id"id" class"xterm"></div> </template> <script> import { defineComponent, onMounted, onBeforeUnmount, watch, n…

Centos7.9和Debian12部署Minio详细流程

一、安装minio Centos wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230227181045.0.0.x86_64.rpm -O minio.rpm sudo dnf install minio.rpmDebian wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230227181045.0…

axios的七大特性

1、在浏览器中发送 XMLHttpRequests 请求&#xff1b; 2、在 node.js 中发送 http请求&#xff1b; 3、基于 promise 的 HTTP 库&#xff0c;支持promise所有的API 4、拦截请求和响应&#xff1b;&#xff08;修改请求数据&#xff0c;只能用在PUT,POST和PATCH这几个请求方法&…

代理(Proxy)模式

代理&#xff08;Proxy&#xff09;模式介绍 作用&#xff1a;通过代理可以控制访问某个对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。&#xff08;即&#xff1a; AOP的微观实现&#xff01;&#xff09; 核心角色 抽象角色(接口…

C++初级(三)

我们这里还是在C基础上进行对C基础语法的补充学习&#xff01; 一.C数组 C数组大体和C相同&#xff0c;但是C数组还是有一定的区别的。 我们先看看C和C数组共同的易错点知识&#xff1a; 1.数组只能一次初始化。 2.如果对数组只进行一部分初始化&#xff0c;那么其他未初始…

PHP写一个函数能够遍历一个文件夹下的所有文件和子文件夹

社区版本可以用 function myscandir($dir) { $files array(); if ( $handle opendir($dir) ) { while ( ($file readdir($handle)) ! false ) { if ( $file ! ".." && $file ! "." ) { if ( isdir($dir . "/" . $file) ) { $…

[ABC334E] Christmas Color Grid 1

洛谷题目链接 Atcoder题目链接 分析 发现将每个红色连通块涂成绿色连通块后&#xff0c;绿色连通块个数会加一&#xff0c;但是如果这个连通块之前已经跟绿色连通块相邻&#xff0c;则连通块数量减一。 代码 #include <bits/stdc.h> #define int long longusing nam…

11. 线程

11. 线程 1. 线程概述1.1 线程概念1.1.1 什么是线程1.1.2 线程是如何创建起来的1.1.3 线程的特点1.1.4 线程与进程 1.2 并发和并行 2. 线程 ID3. 创建线程4. 终止线程5. 回收线程6. 取消线程6.1 取消一个线程6.2 取消状态以及类型6.3 取消点6.4 线程可取消性的检测 7. 分离线程…

【React系列】Hook(一)基本使用

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识hook 1.1. 为什么需要hook Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下…

OpenFeign相关问题及答案(2024)

1、什么是OpenFeign&#xff0c;它如何简化远程服务调用&#xff1f; OpenFeign是一个声明式的Web服务客户端&#xff0c;它使得编写HTTP客户端变得更加容易。它属于Spring Cloud Netflix项目的一部分&#xff0c;可以与Spring Boot应用轻松集成。通过使用OpenFeign&#xff0…