numpy的cov(协方差)函数,具体计算什么?

7
我假设numpy.cov(X)计算的是样本协方差矩阵,公式如下:
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)

即外积和。但是文档中并没有明确说明这一点,只说了“估计协方差矩阵”。请问有人能确认它是否在内部执行此操作吗?(我知道可以使用“bias”参数更改常数。)

https://github.com/numpy/numpy/blob/master/numpy/ma/extras.py#L1257 - YXD
2个回答

3

源代码可以看出,在没有掩码的最简单情况下,有N个变量和每个变量有M个样本,它返回计算为(N, N)协方差矩阵:

(x-m) * (x-m).T.conj() / (N - 1)

其中*代表矩阵乘积[1]

大致实现方法如下:

X -= X.mean(axis=0)
N = X.shape[1]

fact = float(N - 1)

return dot(X, X.T.conj()) / fact

如果您想查看源代码,请在这里查看,而不是使用来自 Mr E 的链接,除非您对掩码数组感兴趣。正如您所提到的,文档并不好。

[1] 在这种情况下,它实际上(但不完全)等价于外积,因为(x-m)具有长度为MN个列向量,因此(x-m).T就是同样多的行向量。最终结果是所有外积的总和。如果顺序颠倒,相同的*将给出内部(标量)积。但从技术上讲,这两者都只是标准矩阵乘法,真正的外积只是将列向量乘以行向量的积。


对的,这和我的外积之和等价吗? - Flash
@Andrew 是的,我已经尝试在我的回答中为您和其他人更清晰地表达了。 - askewchan

0

是的,这就是 numpy.cov 计算的内容。顺便说一下,我已经比较了 numpy.cov 的输出和显式迭代样本(就像您提供的伪代码中那样)的性能,并且由于浮点精度,结果输出数组的差异是可以预期的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接