Algorithm 时间窗在线方差算法

Algorithm 时间窗在线方差算法,algorithm,statistics,variance,Algorithm,Statistics,Variance,我试图找到一种高效的在线算法,用于计算预定义时间窗口(例如,最后5分钟)内的滚动方差。它需要有效率,因为我不能保持时间窗口内的所有数据点,因为它们达到每秒10M数据点的频率。理想情况下,算法在数值上也应该是稳定的。我知道非窗口滚动差异的原因 我知道固定尺寸窗户的其他SO答案。我相信这是一个不同的问题。我想你会有一个问题,就是按照上面所说的那样解决这个问题 考虑编码为浮点样本对1={0.0,0.0}0={-1.0,1.0}的比特流。如果我将编码窗口大小的任意比特流的结果提供给您的算法,然后发送一个

我试图找到一种高效的在线算法,用于计算预定义时间窗口(例如,最后5分钟)内的滚动方差。它需要有效率,因为我不能保持时间窗口内的所有数据点,因为它们达到每秒10M数据点的频率。理想情况下,算法在数值上也应该是稳定的。我知道非窗口滚动差异的原因


我知道固定尺寸窗户的其他SO答案。我相信这是一个不同的问题。

我想你会有一个问题,就是按照上面所说的那样解决这个问题

考虑编码为浮点样本对1={0.0,0.0}0={-1.0,1.0}的比特流。如果我将编码窗口大小的任意比特流的结果提供给您的算法,然后发送一个零流,那么您的算法报告的方差将根据刚刚从窗口远边缘掉落的样本对是{0.0,0.0}还是{-1.0,1.0}而波动

所以我可以用你的算法来记忆一个大约是滑动窗口一半大小的比特流。因此,如果不使用这么多存储空间,就无法实现您的算法


也许你可以使用某种形式的指数平滑。简单指数平滑相当于加权平均值,其中权重呈指数衰减,如果平滑平方值,则将得到指数加权的平方和。如果您还有一个非平方值的指数加权和,那么您可以将这两个值结合起来,得到任意所需中心值的某个中心值的偏差平方的指数加权和。当然,为了得到数值上的稳定,你需要大大改进这个想法——也许你引用的维基百科文章末尾的加权方差算法详细介绍了这一点。

这是对tibbe关于如何组合均值和方差的评论的回答

换句话说,组合平均值是平均值的平均值,组合方差是方差平均值和平均值方差的总和

更正式地说:假设我们有k个数据子集的计数n、均值m和方差均值;假设子集是不相交的,k个子集并集的计数N、平均值M和方差V可通过以下公式计算:

N = Sum{ n[i] }
M = Sum{ w[i]*m[i] }
V = Sum{ w[i]*v[i] } + Sum{ w[i]*(m[i]-M)*(m[i]-M)}
where
w[i] = n[i]/N

不清楚你所说的窗口滚动差异。真的有必要考虑所有样本吗?如果所需的精度允许,您可以重新缩放值并将其转换为整数。然后可以使用64位累加器精确可逆地累加[平方]值。如果这还不够,就累积128位。如果你的时间窗口总是,比如说,一整秒,那么你可以计算并存储每秒钟数据的计数、平均值、方差,并将它们结合起来,得到窗口的计数、平均值、方差。@dmuir我认为你的建议是有意义的。通过在第二级进行量化,我们回到了标准固定窗口问题(我们知道如何解决),假设使用每秒平均数计算(例如每分钟平均数)在统计上是正确的?@dmuir如何使用计数、平均数和方差(例如60秒窗口)计算一分钟窗口的相同值?从上面的Wikipedia链接看,这一点并不明显。如果算法是近似的(如许多现有的在线近似分位数算法)?如果您随机忽略或汇总某个百分比的观察值,或根据某个时间间隔,您可以将数据减少到可以使用普通窗口方案将所有观测值存储在一个窗口中的程度。总结得到德米尔的建议。