54

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

  • S n = αY + (1-α)S n-1

其中 S n是新的平均值,α 是 alpha,Y 是样本,S n-1是之前的平均值。

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

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

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

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

4

8 回答 8

55

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

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

Y n = αX + (1-α)Y n-1 → Y n = Y n-1 + α(X - Y n-1 )

哪些代码:

 Y += alpha * (X-Y);

其次,这里的 α 值“等于” 1-e -Δt/τ其中 Δt 是采样之间的时间,τ 是低通滤波器的时间常数。我在引号中说“相等”,因为当 Δt/τ 与 1 相比较小并且 α = 1-e -Δt/τ ≈ Δt/τ 时,这很有效。(但不能太小:您会遇到量化问题,除非您采用一些奇特的技术,否则您通常需要在状态变量 S 中额外增加 N 位分辨率,其中 N = -log 2 (α)。) Δ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 = (XY)/τ

ΔY = (XY)(Δt/τ) = α(XY)

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

于 2009-06-22T15:21:44.417 回答
8

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

看第二个链接:《不均匀时间序列的算法:移动平均线和其他滚动算子》

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

于 2013-08-08T08:22:33.873 回答
2

这不是一个完整的答案,但可能是一个开始。这是我在一个小时左右的比赛中得到的。我将其发布为我正在寻找的示例,也许是对解决该问题的其他人的启发。

我从 S 0开始,它是由先前的平均值 S -1和在 t 0处采集的样本 Y 0得出的平均值。(t 1 - t 0 ) 是我的采样间隔,α 设置为适合该采样间隔和我希望平均的时间段的任何值。

我考虑过如果我错过了 t 1的样本,而不得不处理在 t 2采集的样本 Y 2会发生什么?好吧,我们可以从扩展方程开始,看看如果我们有 Y 1会发生什么:

  • S 2 = αY 2 + (1-α)S 1,其中 S 1 = αY 1 + (1-α)S 0

替代:

  • S 2 = αY 2 + (1-α)(αY 1 + (1-α)S 0 )
  • S 2 = αY 2 + (1-α)αY 1 + (1-α)(1-α)S 0
  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 S 0

我注意到该系列似乎以这种方式无限扩展,因为我们可以无限期地替换右侧的 S n :

  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 (αY 0 + (1-α)S -1 )
  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1
  • 等等

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

  • S 2 = (1-α) 0 αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

嗯:这是一个指数级数。奎尔惊喜!想象一下,从等式中得出指数移动平均线!

所以无论如何,我有这个 x 0 + x 1 + x 2 + x 3 + ... 事情发生了,我确定我闻e到了,或者这里有一个自然对数,但我不记得我在哪里在我没时间之前前往下一个。

于 2009-06-21T14:21:53.727 回答
1

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

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

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

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

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

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

于 2009-06-21T15:08:33.400 回答
1

假设我们想在一个连续函数上做一个指数衰减平均值。但是,我们没有该函数的所有值,只有几个样本。这个公式将对我们确实拥有的样本和它们在连续平均值中的权重进行加权平均。

乘数n = Alpha时间n -时间n-1

总和n =值n + 总和n-1 *乘数n

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

平均n = 总和n /计数n

于 2009-06-21T15:53:28.203 回答
1

通过使用一个稍微不同的 α,它等于(问题中的1-α ),将新值 Y 添加到 S 0的现有平均值的基本公式如下所示:

S(Y,S 0 ) =

(1-α)Y + αS 0 =

Y - αY + αS 0 =

Y + α(S 0 -Y)

如果我们现在添加时间间隔 t 的长度并假设只有 α 取决于 t,那么该公式如下所示:

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

现在假设 t = t 1 + t 2。如果通过将时间间隔 t 1和 t 2的两个 Y 值相加来创建平均值,则生成的平均值如下所示:

S(Y,t 2 , S(Y,t 1 ,S 0 )) =

Y + α t 2 (S(Y,t 1 ,S 0 ) - Y) =

Y + α t 2 ((Y + α t 1 (S 0 -Y)) - Y) =

Y + α t 2 α t 1 (S 0 -Y)

如果该平均值应该与一次添加整个 t 区间相同,则得出 α t = α t 1 α t 2。满足此要求的 α 定义为:

α x := A x     (对于某个常数 A)

因为:

α T = A T = A T 1 + T 2 = A T 1 A T 2 = A T 1 A T 2

这导致以下平均函数:

S(Y,t,S 0 ) = Y + A t (S 0 -Y)

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

于 2009-06-21T22:08:12.550 回答
0

我将不理会该alpha值,并填写缺失的数据。

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

我想要得到的是你有一个x[n]有洞的输入。没有办法解决您丢失数据的事实。x[n]因此,您可以使用零阶保持,或将其设置为零,或在和之间进行某种插值x[n+M],其中M是缺失样本的数量,而 n 是间隙的开始。甚至可能使用之前的值n

于 2009-06-21T13:35:06.177 回答
0

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

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

第一步。

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

第二步。

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

这种平滑近似会遗漏什么?

  • 在上面的例子中它已经错过了 7 个样本
  • 这是在第 1 步中近似的,将当前值扁平化重新应用了 7 次
  • 如果我们定义一个将与alpha一起应用的近似因子beta(作为 alpha*beta 而不仅仅是 alpha),我们将假设 7 个丢失的样本在先前样本值和当前样本值之间平滑变化。
于 2009-06-21T13:35:40.950 回答