我一直在尝试找出如何在移动窗口中高效地计算协方差,即从一组值(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[0]..x[n-1],y[0]..y[n-1])来表示新的协方差Cov(x[1]..x[n],y[1]..y[n])。
从这里描述的协方差的朴素公式开始:
从这里描述的协方差的朴素公式开始:
[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])
对于这个符号表示法,我很抱歉,希望我的表达大致清晰。
但是,我不确定这是否足够数值稳定。当处理大量的数据时,可能会遇到算术溢出或其他问题(例如抵消等)。
有没有更好的方法来解决这个问题?
感谢任何帮助。