我有一个连续值,我想计算exponential moving average。通常我只是使用标准公式:
其中S n 是新的平均值,α是α,Y是样本,S n-1 是先前的平均值。
不幸的是,由于各种问题,我没有一致的采样时间。我可能知道我最多可以采样,比如每毫秒一次,但由于我无法控制的因素,我可能无法一次采样几毫秒。然而,一个更常见的情况是我简单地提前或延迟采样:而不是在0,1和2毫秒采样。我在0,0.9和2.1毫秒采样。我确实预计,无论延迟如何,我的采样频率都会远远超过奈奎斯特极限,因此我不必担心混叠。
我认为我可以通过根据自上次样本以来的时间长度适当地改变alpha来以一种或多或少的合理方式处理这个问题。
我的部分原因是,这将起作用,EMA在前一个数据点和当前数据点之间“线性插值”。如果我们考虑以间隔t计算以下样本列表的EMA:[0,1,2,3,4]。如果我们使用区间2t,我们应该得到相同的结果,其中输入变为[0,2,4],对吧?如果EMA假设,在t 2 时,自t 0 以来该值为2,那将与[0,2上计算的区间t计算相同2,4,4],它没有做。或者这有意义吗?
有人可以告诉我如何适当地改变alpha吗? “请展示你的作品。”即,向我展示数学,证明你的方法确实做得对。
答案 0 :(得分:46)
这个答案基于我对低通滤波器的理解(“指数移动平均”实际上只是一个单极点低通滤波器),但我对你正在寻找的东西有朦胧的理解。我认为以下是你想要的:
首先,您可以稍微简化您的等式(看起来更复杂但代码更容易)。我将使用“Y”作为输出,使用“X”作为输入(而不是S表示输出,Y表示输入,正如您所做的那样)。
Y n =αX+(1-α)Y n-1 →Y n = Y n-1 < / sub> +α(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值(Δt的变化不是很重要,只要alpha很小,否则你会遇到一些相当奇怪的奈奎斯特问题/混叠/等),如果你正在工作在乘法比分割便宜的处理器上,或定点问题很重要,预先计算ω= 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/τ的“外推”来自于试图将该行为与单位阶跃函数情形匹配。
答案 1 :(得分:6)
答案 2 :(得分:2)
这不是一个完整的答案,但可能是一个问题的开始。在一个小时左右的时间里,这就是我所能得到的;我发布它作为我正在寻找的一个例子,也许是对解决这个问题的其他人的启发。
我从S 0 开始,这是前一个平均S -1 得到的平均值,而样本Y 0 取自t <子> 0 子>。 (t 1 - t 0 )是我的采样间隔,α设置为适合该采样间隔的任何值和我希望平均的周期。
我考虑过如果我错过t 1 处的样本会发生什么,而是必须处理在t 2 2 >?那么,我们可以从扩展等式开始,看看如果我们有Y 1 会发生什么:
代:
我注意到这个系列似乎以这种方式无限扩展,因为我们可以无限期地替换右侧的S n :
好吧,所以它不是真正的多项式(愚蠢的我),但如果我们将初始项乘以1,我们就会看到一种模式:
嗯:这是一个指数系列。 Quelle惊喜!想象一下,以指数移动平均线出现的等式!
所以无论如何,我有x 0 + x 1 + x 2 + x 3 +。 ......事情进展了,我确定我闻到了e
或者在这里踢了一个自然的对数,但是在我没时间用完之前我不记得我要去哪里了。
答案 3 :(得分: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是maxmial,使得t n 这种选择有一个简单的结果:无论时差是多少,都可以单独留下α。 另一方面,如果可以插值,那么这将为您提供可用的恒定间隔样本。最后,如果甚至可以插入平均值本身,那将使问题变得毫无意义。
答案 4 :(得分:1)
假设我们想在连续函数上进行指数衰减平均。但是我们没有该函数的所有值,只有少数样本。该公式将对我们确实具有的连续平均值的权重进行加权平均。
乘数 n = Alpha 时间 n -Time n-1
Sum n = Val n + Sum n-1 * Multiplier n
计数 n = 1 + Count n-1 *乘数 n
平均 n = Sum n / Count n
答案 5 :(得分: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 < / sub> -Y)) - Y)=
Y +α t 2 α t 1 (S 0 - Y)
如果这个平均值应该与一次加入整个t区间相同,那么α t =α t 1 < /子>α<子>吨<子> 2 子> 子>。满足此要求的α的定义是:
α x := A x (对于某些常数A)
由于:
α t = A t = t 1 + t 2 = t 1 A t 2 = α<子>吨<子> 1 子> 子>α<子>吨<子> 2 子> 子>
这导致以下平均功能:
S(Y,t,S 0 )= Y + A t (S 0 -Y)
我还没有真正测试过这个,但是如果我做出的假设符合您的情况,那么这看起来像一个平均函数,可以很好地处理采样间隔的变化。
答案 6 :(得分:0)
我会单独留下alpha
值,并填写缺失的数据。
由于您不知道在无法采样期间发生的情况,您可以使用0填充这些样本,或保持先前的值稳定并将这些值用于EMA。或者,如果您有新样本,请进行一些向后插值,填写缺失值,然后重新计算EMA。
我想要的是你有一个输入x[n]
,它有漏洞。没有办法解决您丢失数据的事实。因此,您可以使用零阶保持,或将其设置为零,或在x[n]
和x[n+M]
之间进行某种插值,其中M
是缺失样本的数量,n是开始的差距。甚至可能在n
之前使用值。
答案 7 :(得分:0)
这类似于我的待办事项清单上的一个未解决的问题。我有一个计划在某种程度上解决了,但还没有数学工作来支持这个建议。
更新&amp;摘要:希望保持平滑因子(alpha)与补偿因子无关(我在此称为beta)。杰森在这里已经接受的优秀答案对我来说非常有用。
第一步。
第二步。
这种平滑近似会错过什么?