指数加权移动平均(EWMA):给你的数据“温柔”的平滑滤镜

张开发
2026/4/15 14:47:26 15 分钟阅读

分享文章

指数加权移动平均(EWMA):给你的数据“温柔”的平滑滤镜
指数加权移动平均EWMA给你的数据“温柔”的平滑滤镜 你是否曾经对着上下乱跳的股票K线图发愁或者被传感器里忽高忽低的噪音数据折磨别急今天我们要聊的指数加权移动平均Exponentially Weighted Moving Average简称 EWMA就是专门用来把锯齿状数据“熨平”的神器。它像一位聪明的老管家既记得昨天的事又不忘今天的新闻帮你从混沌中看清趋势。一、从一个生活中的例子说起 ️想象你在记录每天的气温。第一天 20°C第二天 18°C第三天 22°C……单纯看每天的数字你可能会觉得天气忽冷忽热。但如果你想知道“最近一段时间的气温总体感觉怎么样”就会不自觉地用最近几天的温度取个平均。比如感觉温度 ≈ (今天 昨天 前天 ...) / 天数这就是简单移动平均SMA它给过去每一天同样的“投票权”。但它有个小毛病它分不清三天前和三十天前哪个更重要而且必须存储过去 N 天的所有数据。这时候EWMA 跳出来说“过去的每一天都有用但越近的日子应该说话声越大越远的日子就让它悄悄淡出记忆吧。”二、EWMA 的魔法公式 ✨EWMA 的核心公式长得极其简单甚至有点可爱[v_t \beta \cdot v_{t-1} (1 - \beta) \cdot \theta_t]( v_t )当前时刻 t 的 EWMA 值平滑后的结果。( v_{t-1} )上一时刻的 EWMA 值。( \theta_t )当前时刻的真实观测值原始数据点。( \beta )一个介于 0 到 1 之间的系数通常称为衰减率或平滑因子。 形象理解记忆的“半衰期”可以把 ( \beta ) 想象成你的记忆力强度。当 ( \beta 0.9 )你非常重视昨天的记忆占 90%今天的新鲜事只占 10% 的更新。这样历史信息会保留较久曲线非常平滑但对新变化反应迟钝。当 ( \beta 0.5 )昨天和今天一半一半你是个“善变”的人曲线紧跟数据但滤掉噪声的效果弱一些。专业小贴士在很多深度学习优化器如 RMSProp、Adam中这个 (\beta) 常常取 0.9、0.99 或 0.999。在金融分析中则常用跨度span或半衰期来描述比如“20 日 EWMA”。三、为什么叫“指数”加权——扒开公式的外衣 让我们把递归公式一层层展开看看它到底对过去数据赋予了怎样的权重。假设我们从 (v_0 0) 开始v1 β·0 (1-β)·θ1 (1-β) θ1 v2 β·v1 (1-β)·θ2 (1-β) θ2 β(1-β) θ1 v3 β·v2 (1-β)·θ3 (1-β) θ3 β(1-β) θ2 β²(1-β) θ1 ... vt (1-β) θt β(1-β) θ_{t-1} β²(1-β) θ_{t-2} ... β^{t-1}(1-β) θ1看到了吗每一个历史观测值 (\theta_{t-k}) 前面的系数是(\beta^k \cdot (1-\beta))。因为 (\beta 1)所以 (k) 越大越古老的数据(\beta^k) 就越小权重呈指数衰减 可视化权重衰减曲线假设 (\beta 0.9)过去第 1 天的权重是 (0.1)第 2 天是 (0.09)第 3 天是 (0.081)第 10 天只有约 (0.035)第 30 天已经小到几乎看不见了。这种**“慢慢忘记”**的机制完美模拟了我们对时间序列的直观认知——距离现在越远影响力越小。四、一个小 bug 与巧妙的偏差修正 如果我们按上面的公式从 (v_00) 开始迭代你会发现最初的几个值严重偏低因为初始几步只累积了很少的权重和所有历史权重之和应该接近 1但初期加和远远小于 1。例如 (v_1 (1-\beta)\theta_1)如果 (\beta0.98)那 (v_1) 只有真实值的2%简直没法用。解决办法偏差修正Bias Correction我们用一个小小的除法纠正它[v_t^{\text{corrected}} \frac{v_t}{1 - \beta^t}]为什么除以 (1 - \beta^t)因为初始几步所有历史权重的总和正好是 (1 - \beta^t)。随着 (t) 增大(\beta^t) 趋近于 0分母趋近于 1修正自然消失。Adam 优化器的老用户一定会心一笑没错Adam 里那两个 (m_t) 和 (v_t) 都用了这个偏差修正技巧就是为了让训练初期步子别迈太小。五、代码实战用 Python 手搓 EWMA 我们来实现三个版本朴素版、偏差修正版、以及用 Pandas 偷懒版。1. 手动实现理解原理用importnumpyasnpimportmatplotlib.pyplotaspltdefewma_manual(data,beta0.9,bias_correctionFalse):vnp.zeros_like(data)v[0](1-beta)*data[0]# 初始值处理方式之一fortinrange(1,len(data)):v[t]beta*v[t-1](1-beta)*data[t]ifbias_correction:tnp.arange(1,len(data)1)correction1-beta**t vv/correctionreturnv2. 对比实验噪声正弦波# 生成带噪声的数据tnp.linspace(0,10,200)true_signalnp.sin(t)noisy_datatrue_signalnp.random.normal(0,0.3,sizet.shape)# 计算 EWMAv_beta9ewma_manual(noisy_data,beta0.9,bias_correctionTrue)v_beta98ewma_manual(noisy_data,beta0.98,bias_correctionTrue)plt.figure(figsize(10,4))plt.plot(t,noisy_data,alpha0.5,labelNoisy Data)plt.plot(t,true_signal,k--,labelTrue Signal)plt.plot(t,v_beta9,labelEWMA β0.9)plt.plot(t,v_beta98,labelEWMA β0.98)plt.legend()plt.title(EWMA Smoothing with Different β)plt.show()你会发现β0.9 的线更紧贴数据波动但仍有毛刺。β0.98 的线非常光滑但稍微滞后于真实信号。3. 工业级偷懒法Pandasewm()importpandasaspd seriespd.Series(noisy_data)# span 表示平均跨越的周期数与 β 的关系β 1 - 2/(span1)ewma_pdseries.ewm(span20,adjustTrue).mean()# adjustTrue 自动启用偏差修正六、EWMA 在现实世界的高光时刻 1. 深度学习优化器Momentum AdamSGD 加上动量本质上就是在梯度更新时用了 EWMAv β * v (1-β) * dw w w - lr * v这里的 (v) 就是梯度的指数加权平均让参数更新更平滑不容易被小 batch 里的噪声带偏。2. 金融技术指标MACD、布林带MACD 中的DIF 线就是短期 EMA 与长期 EMA 的差值。交易员用它来判断买卖信号因为 EMA 比简单均线对最新价格变化更敏感。3. 信号处理与传感器滤波当你用加速度计测手机倾角时原始数据抖得像帕金森EWMA 一上立刻岁月静好。七、EWMA vs. SMA一张表格看懂区别 特性简单移动平均 (SMA)指数加权移动平均 (EWMA)权重分配所有数据点权重相等越近权重越大指数衰减内存占用需存储过去 N 个值只需存储上一次结果仅一个值对新数据的反应滞后明显且存在“断崖”旧数据突然被移出窗口反应灵敏但仍有滞后取决于 β计算速度每次需加 N 个数再除 N只需一次乘法和加法适用场景离线分析、固定周期趋势在线实时流数据、嵌入式系统、深度学习八、注意事项与常见疑问 ❓Q1β 到底怎么选0.9适用于相对平稳但有点噪声的序列等效窗口约 19 天(1/(1-\beta))。0.98适用于强趋势、低频信号等效窗口约 50 天。0.5你其实只是想轻微平滑一下。一个经验法则你想让过去多少天的数据产生主要影响等效窗口大小 ≈ (\frac{1}{1-\beta})。Q2为什么我看到的公式有时是 (v_t \alpha \theta_t (1-\alpha) v_{t-1})只是换了个符号通常令 (\alpha 1-\beta)此时 (\alpha) 被称为平滑系数。本质完全相同。Q3偏差修正什么时候必须做序列很短比如前 10 个点时必须做序列很长比如已经跑了几万个点可以不做影响不大。在线流式处理时通常前几十步手动修正一下后面就省了。九、总结EWMA 是一位“懂轻重”的记忆大师 ‍♂️指数加权移动平均用一条极其优雅的递推公式解决了平滑与灵敏的永恒矛盾。它像一块魔力海绵吸走了噪声的毛刺却留住了趋势的脉络。无论是优化神经网络的参数更新还是过滤物联网传感器的杂波EWMA 都在幕后默默贡献着那份“恰到好处”的平滑。下次当你面对一条张牙舞爪的曲线时不妨轻声对它说“来试试 EWMA让数据温柔地流淌。”参考资料与延伸阅读Adam: A Method for Stochastic Optimization(Kingma Ba, 2015)Pandas Documentation:pandas.DataFrame.ewm“Understanding Exponentially Weighted Averages” by Andrew Ng (DeepLearning.AI)希望这篇博客能帮你真正理解并爱上 EWMA如果觉得有用欢迎分享给也在数据海洋里挣扎的小伙伴

更多文章