2013-04-17 30 views
6

我假定numpy.cov(X)计算出样本的协方差矩阵为:外产品的numpy cov(协方差)函数,它究竟计算了什么?

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

即总和。但是在文档中没有其他地方说过,它只是说“估计协方差矩阵”。

任何人都可以确认这是否是它在内部做什么? (我知道我可以用bias参数改变前面的常数。)

+0

https://github.com/numpy/numpy/blob/master/numpy/ma/extras.py#L1257 – YXD

回答

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 

如果要查看源代码,请使用look here而不是E先生的链接,除非您对掩码阵列感兴趣。正如你所提到的,the documentation不是很好。

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

+0

对,这相当于我的外部产品总和? – Flash

+0

@Andrew是的,我已经试着在我和你以及其他人的回答中更加清楚。 – askewchan

0

是的,那是numpy.cov计算的结果。 FWIW,我比较了numpy.cov的输出以显式迭代样本(就像您提供的伪代码一样)以比较性能,并且得到的输出数组的差异是由于浮点精度而预期的。