我有一个连续值,我想计算它 指数移动平均线. 。通常我会使用标准公式:

  • Sn = αY + (1-α)Sn-1

哪里n 是新平均值,α 是 alpha,Y 是样本,Sn-1 是之前的平均值。

不幸的是,由于各种问题,我没有一致的采样时间。我可能知道我最多可以采样一次,例如每毫秒一次,但由于我无法控制的因素,我可能无法一次采样几毫秒。然而,一个可能更常见的情况是我提前或晚一点进行简单采样:而不是在 0、1 和 2 ms 采样。我在 0、0.9 和 2.1 毫秒采样。我确实预计,无论延迟如何,我的采样频率将远远高于奈奎斯特极限,因此我不必担心混叠。

我认为我可以通过根据自上次采样以来的时间长度适当改变 alpha 来以或多或少合理的方式处理这个问题。

我认为这会起作用的部分原因是 EMA 在前一个数据点和当前数据点之间“线性插值”。如果我们考虑以时间间隔 t 计算以下样本列表的 EMA:[0,1,2,3,4]。如果我们使用间隔 2t,输入变为 [0,2,4],我们应该得到相同的结果,对吧?如果 EMA 假设,在 t2 自 t 以来该值一直是 20, ,这与在 [0,2,2,4,4] 上计算的间隔 t 计算相同,但它没有这样做。或者说这有什么意义吗?

有人能告诉我如何适当地改变阿尔法吗?“请展示你的工作。”即,向我展示数学,证明您的方法确实在做正确的事情。

有帮助吗?

解决方案

这个答案基于我对低通滤波器的良好理解(“指数移动平均线”实际上只是一个单极低通滤波器),但我对你正在寻找的东西的理解很模糊。我认为以下是您想要的:

首先,您可以稍微简化一下您的方程(看起来更复杂,但在代码中更容易)。我将使用“Y”作为输出,“X”作为输入(而不是像您所做的那样,使用 S 表示输出,Y 表示输入)。

n = αX + (1-α)Yn-1 → 是n = 是n-1 + α(X - Yn-1)

哪些代码:

 Y += alpha * (X-Y);

其次,这里α的值“等于”1-e-Δt/τ 其中 Δt 是样本之间的时间,τ 是低通滤波器的时间常数。我在引号中说“等于”,因为当 Δt/τ 小于 1 并且 α = 1-e 时,这种方法效果很好-Δt/τ ≈ Δt/τ。(但不能太小:你会遇到量化问题,除非你采用一些奇特的技术,否则你通常需要在状态变量 S 中额外的 N 位分辨率,其中 N = -log2(α)。)对于较大的 Δt/τ 值,过滤效果开始消失,直到达到 α 接近 1 的点,并且基本上只是将输入分配给输出。

这应该可以在不同的 Δt 值下正常工作(只要 alpha 很小,Δt 的变化就不是很重要,否则您将遇到一些相当奇怪的奈奎斯特问题/混叠/等),并且如果您正在使用处理器如果乘法比除法便宜,或者定点问题很重要,则预先计算 ω = 1/τ,并考虑尝试近似 α 的公式。

如果你真的想知道如何推导公式

α = 1-e-Δt/τ

然后考虑其微分方程源:

Y + τ dY/dt = X

当 X 是单位阶跃函数时,有解 Y = 1 - e-t/τ. 。对于较小的 Δt 值,导数可以近似为 ΔY/Δt,得出

Y + τ ΔY/Δt = X

ΔY/Δt = (X-Y)/τ

ΔY = (X-Y)(Δt/τ) = α(X-Y)

以及 α = 1-e 的“外推法”-Δt/τ 来自尝试将行为与单位阶跃函数情况相匹配。

其他提示

看看这里: http://www.eckner.com/research.html

看第二个链接:”“不均匀间隔时间序列的算法:移动平均线和其他滚动运算符”

我认为该文档准确地描述了您需要的编程算法。

这不是一个完整的答案,但可能是答案的开始。这是我在玩了大约一个小时后所得到的结果;我将其发布为我正在寻找的内容的示例,也许对其他解决该问题的人有所启发。

我从S开始0, ,这是先前平均值 S 得出的平均值-1 和样本 Y0 拍摄于 t0. 。(t1 -t0) 是我的采样间隔,α 设置为适合该采样间隔和我希望求平均值的时间段的值。

我考虑过如果我在 t 错过了样本会发生什么1 而不得不凑合使用样本 Y2 拍摄于 t2?好吧,我们可以从展开方程开始,看看如果我们有 Y 会发生什么1:

  • S2 = αY2 + (1-α)S1, , 哪里1 = αY1 + (1-α)S0

替换:

  • S2 = αY2 + (1-α)(αY1 + (1-α)S0)
  • S2 = αY2 + (1-α)αY1 + (1-α)(1-α)S0
  • S2 = αY2 + (1-α)αY1 + (1-α)2S0

我注意到这个系列似乎以这种方式无限延伸,因为我们可以用 S 代替n 无限期地在右侧:

  • S2 = αY2 + (1-α)αY1 + (1-α)2(αY0 + (1-α)S-1)
  • S2 = αY2 + (1-α)αY1 + (1-α)2αY0 + (1-α)3S-1
  • ETC。

好吧,所以它并不是真正的多项式(愚蠢的我),但如果我们将初始项乘以一,我们就会看到一个模式:

  • S2 = (1-α)0αY2 + (1-α)αY1 + (1-α)2αY0 + (1-α)3S-1

嗯:这是一个指数级数。 惊喜! 想象一下从指数移动平均线方程中得出的结果!

所以无论如何,我有这个x0 + x1 + x2 + x3 + ...事情进展顺利,我确信我闻到了 e 或者这里有一个自然对数,但我不记得在时间用完之前我下一步要去哪里。

这个问题的任何答案,或者此类答案正确性的任何证明,很大程度上取决于您正在测量的数据。

如果您的样本是在 t 采集的0=0毫秒,t1=0.9ms 和 t2=2.1ms ,但您选择的 α 是基于 1 毫秒间隔,因此您需要局部调整的 αn ,选择正确性的证明意味着知道 t=1ms 和 t=2ms 时的样本值。

这就引出了一个问题:您能否合理地对数据进行插值,以便对中间值可能是什么进行合理的猜测?或者你甚至可以对平均值本身进行插值吗?

如果这两者都不可能,那么据我所知,中间值 Y(t) 的逻辑选择是 最近计算的平均值, , IE。Y(t) ≈ Sn 其中 n 是 maxmial,使得 tn<t。

这个选择有一个简单的结果:不管时间差是多少,不要管α。

另一方面,如果可以对您的值进行插值,那么这将为您提供平均的恒定间隔样本。最后,如果甚至可以对平均值本身进行插值,那就会使这个问题变得毫无意义。

通过使用稍微不同的 α,它等于 (1-α问题中的那个),将新值 Y 添加到 S 的现有平均值的基本公式0 看起来像这样:

S(Y,S0) =

(1-α)Y + αS0 =

Y - αY + αS0 =

Y + α(S0-Y)

如果我们现在加上时间间隔 t 的长度并假设仅 α 取决于该 t,则该公式如下所示:

S(Y,t,S0) = Y + αt(S0-Y)

现在假设 t = t1 + t2. 。如果平均值是通过将时间间隔 t 内的两个 Y 值相加来创建的1 和T2, ,所得平均值如下所示:

S(Y,t2,S(Y,t1,S0)) =

Y+αt2(S(Y,t1,S0) - Y) =

Y+αt2((Y + αt1(S0-Y)) - Y) =

Y+αt2αt1(S0-Y)

如果这个平均值应该与一次性添加整个 t 间隔相同,则可以得出 αt = αt1αt2. 。满足此要求的 α 的定义为:

αX := 一个X (对于一些常数A)

因为:

αt =At = at1 + t2 = at1 At2 = αt1αt2

这会产生以下平均函数:

S(Y,t,S0) = Y + At(S0-Y)

我还没有真正测试过这一点,但如果我所做的假设适合您的场景,这看起来像一个平均函数,可以很好地处理采样间隔的变化。

假设我们想对连续函数进行指数衰减平均值。然而,我们没有该函数的所有值,只有几个样本。该公式将对我们拥有的样本及其在连续平均值中的权重进行加权平均值。

乘数n = 阿尔法时间n-时间n-1

n = 瓦尔n + 总和n-1*乘数n

数数n = 1 + 计数n-1*乘数n

平均n = 总和n/数数n

我会离开 alpha 值,并填写缺失的数据。

由于您不知道无法采样期间会发生什么,因此您可以用 0 填充这些样本,或者保持先前的值稳定并将这些值用于 EMA。或者在获得新样本后进行一些向后插值,填充缺失值,然后重新计算 EMA。

我想表达的是你有一个意见 x[n] 其中有孔。没有办法回避丢失数据的事实。因此,您可以使用零阶保持,或将其设置为零,或在两者之间进行某种插值 x[n]x[n+M], , 在哪里 M 是缺失样本的数量,n 是间隙的开始。甚至可能使用之前的值 n.

这类似于我的待办事项列表中的一个未决问题。我在某种程度上制定了一个方案,但还没有数学工作来支持这一建议。

更新及总结:希望保持平滑因子(alpha)独立于补偿因子(我在这里称为 beta)。杰森的出色答案已经在这里被接受,对我来说非常有用。

第一步。

  • 如果您还可以测量自上次采样以来的时间(以恒定采样时间的四舍五入倍数表示 - 因此自上次采样以来 7.8 毫秒将是 8 个单位),则可以用于多次应用平滑。在本例中应用该公式 8 次。您已有效地使平滑更偏向于当前值。

第二步。

  • 为了获得更好的平滑效果,我们需要调整 alpha,同时在前一种情况下应用公式 8 次。

这种平滑近似会错过什么?

  • 上例中已经丢失了 7 个样本
  • 这在步骤 1 中近似为 压扁的 再重新应用当前值 7 次
  • 如果我们定义一个近似因子 贝塔 这将与一起应用 α (作为 alpha*beta 而不仅仅是 alpha),我们将假设 7 个丢失的样本在先前和当前样本值之间平滑变化。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top