17

想象一下,我有一组x的测量值,这些测量值由许多进程x 0 ... x N在时间t 0 ... t N进行。假设在时间t我想估计x的当前值,基于我不知道长期趋势的假设,并且x可以通过指数平滑等算法预测。由于我们有很多进程,并且N可以变得非常大,所以我不能存储多个值(例如之前的状态)。

这里的一种方法是采用正态指数平滑算法。如果定期采集样本,我将维持一个估计量y n使得:

y n = αy n-1 + ( 1 - α )。xn _

这种方法在采样不规则的情况下效果不佳,因为许多样本一起会产生不成比例的影响。因此,该公式可适用于:

y n = α ny n-1 + ( 1 - α n )。xn _

在哪里

α n = e -k.(t n - t n-1 )

IE 根据前两个样本之间的间隔动态调整平滑常数。我对这种方法很满意,而且它似乎有效。这是这里给出的第一个答案,埃克纳在 2012 年的这篇论文 ( PDF ) 中对这些技术进行了很好的总结。

现在,我的问题如下。我想调整以上内容来估计发生率。偶尔会发生一个事件。使用类似的指数技术,我想估计事件发生的速率。

两个明显的策略是:

  • 使用第一种或第二种技术,将最后两个事件之间的延迟用作数据系列x n
  • 使用第一种或第二种技术,使用最后两个事件之间的延迟的倒数(即速率)作为数据序列x n

据我所知,这些都不是好的策略。首先,假设每 500 毫秒发生一次事件(一方面),另一方面以 200 毫秒延迟和 800 毫秒延迟发生的事件。显然,这两者每秒发生两次,因此给出的速率估计应该是相同的。忽略最后一个样本的时间似乎很鲁莽,所以我将专注于第二种策略。使用延迟(而不是倒数)并不是一个好的预测指标,因为模拟 200 毫秒/800 毫秒的样本流会产生大约 1.5 的估计值(基于倒数的平均值不是平均值的倒数)。

但是,更重要的是,这两种策略都无法应对实践中实际发生的情况,即所有事件突然停止很长一段时间。因此, y的“最新”值是最后一个事件的值,因此永远不会计算速率的估计值。因此,速率似乎是恒定的。当然,如果我回顾性地分析数据,这不会是一个问题,但我正在实时分析它。

我意识到另一种方法是定期运行一些线程(例如每 10 秒)并计算这 10 秒间隔内出现的次数。由于不经常需要统计信息,因此这对我来说非常耗费资源,而且由于互斥锁问题,我不愿意运行一个轮询所有内容的线程。因此,我想(以某种方式)使用一种算法来调整读取的状态(例如)自上次采样以来的时间。这似乎是一种合理的方法,就好像在独立于样本选择的时间测量性能一样,测量时间平均为样本之间周期的一半,因此对速率的非常粗略的未平滑估计将是倒数的一半自上次采样以来的时间。更复杂的是,我的测量时间不会独立于样本。

我有一种感觉,这有一个简单的答案,但它让我望而却步。我有一种感觉,正确的方法是假设事件是泊松分布的,并根据自上一个样本以来的间隔和某种形式的移动平均值推导出λ的估计值,但是我的统计数据太生疏了,无法完成这项工作。

这里有一个近乎欺骗的问题但答案似乎不太令人满意(我希望我解释了原因)。我要补充一点,考虑到我有一个要估计的变量并且对此一无所知,卡尔曼滤波器似乎是重量级的。还有许多其他的近乎欺骗,其中大多数要么建议保留大量值(从内存的角度来看这是不现实的),要么不解决上述两个问题。

4

2 回答 2

20

首先,如果您假设事件本身的发生率是恒定的(或者您只对它的长期平均值感兴趣),那么您可以简单地将其估计为:

        λ* = N / ( t - t 0 )

其中t是当前时间,t 0是观察的开始,N是自t 0以来观察到的事件数,λ* 是真实频率 λ 的估计值。

此时,需要注意的是,上面给出的估计公式可以重新表述为积分:

        λ* = 积分( δ事件(τ) dτ ) / 积分( 1 dτ )

其中积分变量 τ 的范围从t 0t,并且 δ event (τ) = sum( δ(τ − t i ), i = 1 .. N ) 是 Dirac delta 函数的和N 具有单个 delta -每个事件i的发生时间t i的峰值。

当然,这将是一种完全无用的计算λ* 的方法,但事实证明它是一个概念上有用的公式。基本上,查看这个公式的方式是,函数 δ event (τ) 测量事件数量在时间 τ 处增加的瞬时速率,而第二个被积函数,也就是常数 1,测量时间的速率随着时间的推移而增加(当然,这只是每秒一秒)。


好的,但是如果频率 λ 本身可能会随着时间而变化,并且您想估计它的当前值,或者至少是最近一段时间的平均值,该怎么办?

使用上面给出的积分比公式,我们可以简单地通过一些偏向最近时间的加权函数w (τ) 对两个被积函数进行加权来获得这样的估计:

        λ*最近=积分(δ事件(τ)w(τ)dτ)/积分(w(τ)dτ)

现在,剩下的就是选择一个合理的w (τ),使这些积分简化为易于计算的东西。事实证明,如果我们为某个衰减率k选择w (τ) = exp( k (τ − t )) 形式的指数衰减加权函数,则积分简化为:

        λ*最近= sum( exp( k ( t i - t )), i = 0 .. N ) k / ( 1 - exp( k ( t 0 - t )) )

t 0 → −∞ 的限制下(即,在实践中,当总观察时间 ( tt 0 ) 远大于权重衰减时间尺度 1/ k时),这进一步简化为:

        λ*最近= k sum( exp( k ( t it )), i = 0 .. N )

唉,天真地应用这个公式仍然需要我们记住所有的事件时间t i。但是,我们可以使用与计算通常的指数加权平均值相同的技巧——给定较早时间t'的加权平均事件率 λ*最近( t' ),并假设在t't之间没有发生新事件,我们可以简单地计算当前加权平均事件率λ*最近t):

        λ*最近( t ) = exp( k ( t' - t ) ) λ*最近( t' )

此外,如果我们现在观察到恰好在时间t发生的新事件,则事件之后的加权平均事件发生率变为:

        λ*最近( t ) = k + exp( k ( t' - t ) ) λ*最近( t' )


因此,我们得到一个非常简单的规则:我们需要存储的只是之前观察到的事件的最后时间t ,以及在所述事件之后的估计最近事件率 λ* 。(我们可以将这些例如初始化为t last = t 0和 λ* last = 0;事实上,当 λ* last = 0 时,t last的值没有区别,尽管对于非零的 λ* last它确实如此。)

每当发生新事件时(在时间t new),我们将这些值更新为:

        λ* lastk + exp( k ( t lastt new ) ) λ* last
        t lastt new

并且每当我们想知道当前时间t的最近事件率平均值时,我们只需将其计算为:

        λ*( t ) = exp( k ( t最后- t ) ) λ*最后


附言。为了校正对t last (任意)初始值的初始偏差,我们可以添加回 1 / ( 1 - exp( k ( t 0 - t )) ) 校正项,我们之前假设t时简化了该项。 ≫ t 0。为此,只需在t = t 0时从t last = 0开始,如上所述更新t last ,但计算在时间t的估计最近事件率平均值为:

        λ* corr ( t ) = exp( k ( t最后- t ) ) λ*最后 / ( 1 - exp( k ( t 0 - t )) )

(这里,t 0表示您开始测量事件的时间,而不是第一个事件的发生时间。)

这将以增加早期方差为代价消除初始偏差为零。这是一个显示校正效果的示例图,k = 0.1,真实平均事件率为 2:

λ* 随时间变化的图,有或没有初始偏差校正
红线显示没有初始偏差校正的 λ*( t )(从 λ*( t 0 ) = 0 开始),而绿线显示偏差校正的估计值 λ* corr ( t )。


pps。如上图所示,如上计算的 λ* 将不是时间的连续函数:每当事件发生时它会向上跳跃k,而当事件不发生时它会以指数方式衰减到零。

如果您想要更平滑的估计,您可以计算 λ* 本身的指数衰减平均值:

        λ**( t ) = 积分( λ*(τ) exp( k 2 (τ - t )) dτ ) / 积分( exp( k 2 (τ - t )) dτ )

其中 λ* 是如上计算的指数衰减平均事件率,k 2是第二个平均值的衰减率,并且积分超过 -∞ < τ ≤ t

这个积分也可以通过上面的逐步更新规则来计算:

        λ** lastWt ) λ* last + exp( - k 2 Δ t ) λ** last
        λ* lastk 1 + exp( - k 1 Δ t ) λ* last
        t lastt new

其中k 1k 2是第一个和第二个平均值的衰减率,Δ t = t new - t last是事件之间的经过时间,并且:

        Wt ) = k 2 ( exp( - k 2 Δ t ) - exp( - k 1 Δ t ) ) / ( k 1 - k 2 )

如果k 1k 2,或

        Wt ) = k Δ t exp( - k Δ t )

如果k 1 = k 2 = k (当 ( k 1k 2 ) → 0时,后者由前者作为极限产生)。

要计算任意时间点t的第二个平均值,请使用相同的公式:

        λ**( t ) = Wt ) λ*最后 + exp( - k 2 Δ t ) λ**最后

除了 Δ t = t - t last


如上所述,该估计也可以通过应用合适的时间相关比例因子来校正偏差:

        λ** corr ( t ) = λ**( t ) / (1 - S ( t - t 0 ))

在哪里:

        S ( Δt ) = ( k 1 exp( - k 2 Δ t ) - k 2 exp( - k 1 Δ t ) ) / ( k 1 - k 2 )

如果k 1k 2,或

        S ( Δt ) = (1 + k Δt ) exp( - k Δt )

如果k 1 = k 2 = k

下图显示了这种平滑的效果。红线和绿线显示 λ*( t ) 和 λ* corr ( t ) 如上所述,而黄线和蓝线显示 λ**( t ) 和 λ** corr ( t ),计算公式为k 1 = 0.1 (如上)和k 2 = 0.2:

随时间变化的 λ* 和 λ** 图,有或没有初始偏差校正

于 2014-05-12T19:53:08.993 回答
2

你可以试试这个:

保留一个估计器 zn 以便在每个事件中:

z n = ( z n-1 + κ ).e - κ .( t n -t n-1 )

这将收敛于 s -1中的事件率。然后是一个更好的估计器(因为如果您在事件之前或之后计算估计值,仍然存在相关的错误/噪声):

w n = z n .e -κ/(2.z n )

在您的示例中,它将收敛到 2s -1(500ms 的倒数)

常数 κ 负责平滑并且在 s -1中。较小的值会更平滑。如果您的事件率大约为几秒,则 κ 值为 0.01s-1 是一个好的开始。

这种方法有一个起始偏差,并且 z 0可以设置为更快收敛的值的估计值。较小的 κ 值将使偏差保持更长的时间。

有更强大的分析类泊松分布的方法,但它们通常需要大缓冲区。傅里叶变换等频率分析就是其中之一。

于 2014-05-12T19:50:43.840 回答