我试图在预定义的时间窗口(例如最后5分钟)内找到一种有效的在线算法来计算滚动方差。它需要高效,因为我能够在时间窗口内保持所有数据点,因为它们以每秒10M数据点的频率到达。理想情况下,算法也应该是数值稳定的。我知道Welford's algorithm非窗口滚动方差。
我知道固定大小窗口的其他SO答案。我相信这是一个不同的问题。
答案 0 :(得分:1)
我认为你将完全解决这个问题。
考虑编码为浮点样本对的比特流1 = {0.0,0.0} 0 = {-1.0,1.0}。如果我将窗口大小的任意比特流编码到算法中,然后发送零流,则算法报告的方差将根据刚刚从窗口的远端边缘掉落的样本对而波动是{0.0,0.0}或{-1.0,1.0}。
所以我可以使用你的算法来记忆大约是滑动窗口大小一半的比特流。因此,如果不使用这么多存储空间,就无法实现您的算法。
也许您可以使用某种形式的指数平滑。简单指数平滑等效于权重以指数方式衰减的加权平均值,如果平滑平方值,则将获得指数加权平方和。如果你还有一个指数加权的非平方值之和,你可以将两者结合起来得到一个指数加权的平方偏差和一些中心值的平方和任何所需的中心值。当然,你需要明显地改进这个想法才能获得数值稳定的东西 - 也许这在你引用的维基百科文章末尾的一个加权方差算法的细节中有所涉及。
答案 1 :(得分:1)
这是对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