【深度学习】指数加权滑动平均

加权平均:
我们常用的算术平均属于加权平均的特殊形式,只不过算术平均各项权重都相等。
加权滑动平均:
原理与加权平均类似,但重点在“滑动”一词,即该平均过程就好似从第一个值依次向后滑动,直到滑动到最后一个值,言外之意就是,第n个值取决于第n-1个值。

滑动平均递推公式:
在这里插入图片描述
一般设 v 0 v_0 v0=0,由上述公式可知:

在这里插入图片描述
通过数学归纳法可知:
在这里插入图片描述
最终所要求得的加权滑动平均值即为 v t v_t vt。但是问题又随之出现了,前几个 v t v_t vt(通过递推公式得到的)与它们各自的原始值偏差很大,由于 v 0 v_0 v0=0,而 β \beta β(又称为衰减率)的值在区间[0,1)内,所以通过递推公式得到的 v 1 v_1 v1的值会远远小于原始值 θ 1 \theta_1 θ1 v 2 v_2 v2 v 3 v_3 v3的值也会较 θ 2 \theta_2 θ2 θ 3 \theta_3 θ3有所偏差。为此在上述公式的基础之上做了改进,即
在这里插入图片描述
该式即为指数加权滑动平均的公式。
当t=1时,对应 v t v_t vt= v 1 v_1 v1,1- β t \beta^t βt=1- β \beta β,通过递推公式我们发现此时 v 1 v_1 v1= θ 1 \theta_1 θ1,很好地解决了偏差较大的问题。而且由于 β \beta β在区间[0,1)内,所以随着t的增大,指数加权滑动平均公式的分母越来越趋近于1,对于偏差很小的数又减弱了该指数项的影响。

import numpy as np
import matplotlib.pyplot as plt
import math

theta = [0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0, 10, 20,
         30, 5, 0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0,
         10, 20, 30, 5]

def moving_ave(theta, beta):
    theta = np.array(theta).reshape((-1, 1))
    m, n = theta.shape
    v = np.zeros((m, 1))
    for i in range(1, m):
        v[i, :] = beta * v[i-1, :] + (1 - beta) * theta[i, :]
    return v

def exp_moving_ave(theta, beta):
    theta = np.array(theta).reshape((-1, 1))
    m, n = theta.shape
    v = np.zeros((m, 1))
    for i in range(1, m):
        v[i, :] = (beta * v[i-1, :] + (1 - beta) * theta[i, :])
    for i in range(1, m):
        v[i, :] /= (1 - beta**i)
    return v

v = moving_ave(theta, 0.9)
v_exp = exp_moving_ave(theta, 0.9)

plt.plot(theta, lw=2, marker='*', label=r'$v_t$=$\theta_t$')
plt.plot(v[:, 0], lw=2, color='darkorange', marker='*', label=r'$v_t$=$\beta$$v_{t-1}$+(1-$\beta$)$\theta_t$')
plt.plot(v_exp[:, 0], lw=2, color='green', marker='*', label=r'$v_t$=$v_t$/(1-$\beta^t$)')
plt.legend()
plt.show()

在这里插入图片描述
通过上图可以明显地看出加权滑动平均和指数加权滑动平均之间的差别。
kerasBatchNormalization函数(批次归一化)中的momentum参数即为加权滑动平均的 β \beta β(初始值为0.99)。 β \beta β的值越接近1,前几个数值的权重越高,滑动平均的结果越取决于前t个值。若 β \beta β的值越接近0,前几个数值权重越低,滑动平均的结果越取决于距离 v t v_t vt最近的几个数值。

tf.keras.layers.BatchNormalization(
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer="zeros",
    gamma_initializer="ones",
    moving_mean_initializer="zeros",
    moving_variance_initializer="ones",
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    renorm=False,
    renorm_clipping=None,
    renorm_momentum=0.99,
    fused=None,
    trainable=True,
    virtual_batch_size=None,
    adjustment=None,
    name=None,
    **kwargs
)

使用指数加权滑动平均可以有效避免数据抖动,使得数据更加平稳、平滑,使得测试过程更加鲁棒。

<think>好的,我现在需要回答用户关于滑动平均的问题。用户之前提到了卡尔曼滤波在相位噪声补偿中的应用,现在转向滑动平均,可能需要结合数据处理和机器学习中的相关应用。 首先,滑动平均的定义是什么?滑动平均(Moving Average)是一种用来分析数据点的技术,通过创建一系列平均值来平滑短期波动,突出长期趋势。常见的类型有简单滑动平均(SMA)、加权滑动平均(WMA)和指数加权滑动平均(EMA)。 接下来,用户想知道滑动平均在数据处理和机器学习中的应用。数据处理方面,滑动平均常用于时间序列分析,比如去除噪声,平滑数据,识别趋势。在股票价格分析中常用。机器学习中,可能用于数据预处理,比如平滑特征,或者在模型训练中作为优化技巧,比如EMA用于梯度下降,稳定训练过程。 用户提供的引用中,引用[3]提到了数据标准化,但滑动平均更多是平滑处理,可能和标准化不同。不过,可以提到数据预处理的不同方法。引用[2]涉及模型评估指标,可能可以联系到使用滑动平均来平滑评估指标,比如计算训练损失的平均值以便观察趋势。引用[1]关于数据增强,虽然滑动平均本身不是数据增强,但可能在生成平滑数据时辅助增强。 需要注意用户之前的讨论涉及卡尔曼滤波,滑动平均和卡尔曼滤波都是滤波技术,可以简要比较两者的区别,比如滑动平均是无状态或简单加权,而卡尔曼滤波是动态系统状态估计,更复杂。 还要考虑应用场景的具体例子,比如在深度学习中,EMA用于模型权重的平均,提升测试性能。在实时数据处理中,滑动平均用于实时平滑数据流。 可能需要检查是否有遗漏的应用点,比如在卷积神经网络中的滤波器是否类似滑动平均,但可能属于不同概念。需要准确区分。 最后,确保回答结构清晰,定义、应用分点,结合用户之前的兴趣点(如卡尔曼滤波),并生成相关问题。</think>### 滑动平均的定义及其应用详解 #### 1. **滑动平均的基本定义** **滑动平均(Moving Average)** 是一种通过计算数据序列中连续窗口内数据的平均值来平滑短期波动、突出长期趋势或周期性的统计方法。其核心思想是**用局部数据的均值代替原始值**,从而降低噪声干扰。根据权重分配方式不同,主要分为以下类型: - **简单滑动平均(SMA)**: 对窗口内所有数据赋予相同权重,计算公式为: $$ \text{SMA}_k = \frac{1}{n} \sum_{i=k-n+1}^{k} x_i $$ 其中$n$为窗口长度,$x_i$为第$i$个数据点。 - **加权滑动平均(WMA)**: 为窗口内不同位置的数据分配递减权重(如线性递减),公式为: $$ \text{WMA}_k = \frac{\sum_{i=1}^{n} w_i x_{k-n+i}}{\sum_{i=1}^{n} w_i} $$ 例如,窗口长度为3时,权重可设为$[0.5, 0.3, 0.2]$。 - **指数加权滑动平均(EMA)**: 为历史数据赋予指数衰减权重,越新的数据权重越高,公式为: $$ \text{EMA}_k = \alpha x_k + (1-\alpha) \text{EMA}_{k-1} $$ 其中$\alpha \in (0,1)$为平滑因子,控制权重衰减速度(常用$\alpha=2/(n+1)$与窗口长度$n$关联)[^1]。 --- #### 2. **在数据处理中的应用场景** ##### **2.1 时间序列去噪与趋势分析** - **股票价格分析**:通过SMA或EMA平滑每日股价波动,识别长期趋势(如20日均线、60日均线)[^1]。 - **传感器数据处理**:对温度、加速度等传感器采集的噪声数据做平滑处理,提高信号可读性。 - **示例代码(Python)**: ```python import pandas as pd # 计算简单滑动平均(窗口长度=5) data = pd.Series([2, 4, 6, 8, 10, 12, 14, 16]) sma = data.rolling(window=5).mean() ``` ##### **2.2 实时数据流处理** - **实时监控系统**:对实时产生的时序数据(如服务器CPU使用率)计算滑动平均,避免瞬时峰值引发误报警。 - **动态阈值调整**:结合滑动均值和标准差,动态设定异常检测阈值(如$ \mu_{\text{MA}} \pm 3\sigma_{\text{MA}} $)。 --- #### 3. **在机器学习中的核心应用** ##### **3.1 数据预处理** - **特征平滑**:对输入特征(如时序特征)进行滑动平均处理,减少噪声对模型训练的影响。例如,在销量预测中,对历史销量数据平滑后再作为模型输入[^3]。 - **标签平滑**:对分类任务中的标签做滑动平均处理,缓解类别不平衡问题(需谨慎使用)。 ##### **3.2 模型训练优化** - **梯度平滑**:在随机梯度下降(SGD)中,对梯度计算滑动平均,稳定优化过程。公式为: $$ g_{\text{EMA},t} = \beta g_{\text{EMA},t-1} + (1-\beta) g_t $$ 其中$g_t$为第$t$步的梯度,$\beta$通常取0.9或0.99。 - **模型权重EMA**: 在训练末期对模型权重计算指数滑动平均,提升测试性能(如TensorFlow的`ExponentialMovingAverage`)。最终测试时使用EMA权重而非原始权重,可减少权重震荡影响[^2]。 ##### **3.3 评估指标平滑** - **训练曲线可视化**:对训练损失、准确率等指标计算滑动平均,更清晰地观察收敛趋势。例如,在PyTorch中: ```python loss_ema = 0.9 * loss_ema + 0.1 * current_loss ``` --- #### 4. **滑动平均与卡尔曼滤波的对比** | **特性** | **滑动平均** | **卡尔曼滤波** | |------------------|--------------------------------------|--------------------------------| | **计算复杂度** | $O(1)$(EMA)或$O(n)$(SMA) | $O(m^3)$($m$为状态维度) | | **动态适应性** | 固定窗口或衰减因子,无状态更新机制 | 动态调整增益,显式建模过程噪声 | | **适用场景** | 静态或缓慢变化的数据流 | 非平稳动态系统状态估计 | | **噪声抑制** | 依赖窗口长度或平滑因子经验选择 | 基于$Q/R$参数理论优化 | --- #### 5. **参数选择与调优建议** - **窗口长度$n$**: - 过小:平滑效果弱,残留高频噪声。 - 过大:滞后严重,丢失细节特征。 - **经验公式**:$n \approx \text{数据周期长度}/2$(若存在周期性)。 - **EMA平滑因子$\alpha$**: - $\alpha$越大,对新数据响应越快,但平滑效果越弱。 - **自动调整策略**:根据数据方差动态调整$\alpha$(如$\alpha = 1/\sigma_t$)。 --- ### 相关问题 1. 如何通过滑动平均处理非平稳时间序列数据? 2. 指数加权滑动平均(EMA)在深度学习优化器中如何具体实现? 3. 滑动平均与低通滤波在信号处理中的区别与联系是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值