7

我假设numpy.cov(X)将样本协方差矩阵计算为:

1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)

即外部产品的总和。但在文档中没有任何地方真正这么说,它只是说“估计协方差矩阵”。

谁能确认这是否是它在内部所做的?(我知道我可以用参数改变前面的常数bias。)

4

2 回答 2

3

正如您所看到的source,在最简单的情况下,没有掩码,并且每个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

如果您想查看源代码,请查看此处而不是 E 先生的链接,除非您对屏蔽数组感兴趣。正如您所提到的,文档不是很好。

[1]在这种情况下是有效的(但不完全是)外积,因为(x-m)具有N长度的列向量,M因此(x-m).T是尽可能多的行向量。最终结果是所有外部产品的总和。如果顺序颠倒,同样*会给出内部(标量)产品。但是,从技术上讲,这些都只是标准矩阵乘法,真正的外积只是列向量与行向量的乘积。

于 2013-04-17T15:47:25.097 回答
0

是的,这就是numpy.cov计算。FWIW,我已经将输出numpy.cov与显式迭代样本(如您提供的伪代码)进行了比较,以比较性能,并且结果输出数组的差异是由于浮点精度所期望的。

于 2013-04-17T15:44:54.523 回答