计算"移动"协方差

时间:2016-02-05 15:48:28

标签: algorithm math covariance

我一直试图弄清楚如何有效地计算移动窗口中的协方差,即从一组值(x [0],y [0])移动..(x [n-1] ],y [n-1])到一组新的值(x [1],y [1])..(x [n],y [n])。换句话说,值(x [0],y [0])被值(x [n],y [n])替换。出于性能原因,我需要逐步计算协方差,即我想表达新的协方差Cov(x [1] .. x [n],y [1] .. y [n])in先前协方差Cov的项(x [0] .. x [n-1],y [0] .. y [n-1])。

从这里描述的协方差的天真公式开始:

[https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Covariance][1]

我能想到的只有:

Cov(x[1]..x[n], y[1]..y[n]) =
Cov(x[0]..x[n-1], y[0]..y[n-1]) +
(x[n]*y[n] - x[0]*y[0]) / n -
AVG(x[1]..x[n]) * AVG(y[1]..y[n]) +
AVG(x[0]..x[n-1]) * AVG(y[0]..y[n-1])

我很抱歉这个符号,我希望它或多或少地清楚我想要表达的内容。

但是,我不确定这是否足够稳定。处理大值我可能遇到算术溢出或其他(例如取消)问题。

有更好的方法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

看起来你正在尝试某种形式的"添加新值并减去旧值"。你是正确的担心:这种方法在数值上并不稳定。以这种方式保持总和会受到漂移的影响,但真正的杀手就是这样一个事实:在每一步你从另一个大数字中减去一个大数字以获得可能非常小的数字。

一项改进是独立维持您的总和(x_iy_ix_i*y_i),并在每一步重新计算它们的天真公式。你的运行总和仍会漂移,而天真的公式仍然在数值上不稳定,但至少你只有一步的数值不稳定。

解决此问题的一种稳定方法是实现(稳定)合并统计集的公式,并使用合并树评估整体协方差。移动窗口会更新您的一个叶子,需要更新从该叶子到根的每个节点。对于大小为n的窗口,此方法每次更新将花费O(log n)时间而不是O(1)天真计算,但结果将是稳定且准确的。此外,如果您不需要每个增量步骤的统计信息,则可以按每个输出样本更新一次树,而不是每个输入样本更新一次。如果每个输出样本有k个输入样本,则会将每个输入样本的成本降低到O(1 +(log n)/ k)。

来自评论:您参考的维基百科页面包含一个关于Knuth在线算法的部分,其中 相对稳定,但仍然容易漂移。你应该能够做一些类似于协方差的事情;每次K * n样本重置计算应以最小的成本限制漂移。

答案 1 :(得分:0)

不确定为什么没有人提到这一点,但是您可以使用the Welford online algorithm,它依赖于运行平均值:

等式应为:enter image description here

以下给出的在线均值: enter image description here