2013-04-17 33 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的輸出以顯式迭代樣本(就像您提供的僞代碼一樣)以比較性能,並且得到的輸出數組的差異是由於浮點精度而預期的。