我假定numpy.cov(X)
計算出樣本的協方差矩陣爲:外產品的numpy cov(協方差)函數,它究竟計算了什麼?
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)
即總和。但是在文檔中沒有其他地方說過,它只是說「估計協方差矩陣」。
任何人都可以確認這是否是它在內部做什麼? (我知道我可以用bias
參數改變前面的常數。)
我假定numpy.cov(X)
計算出樣本的協方差矩陣爲:外產品的numpy cov(協方差)函數,它究竟計算了什麼?
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)
即總和。但是在文檔中沒有其他地方說過,它只是說「估計協方差矩陣」。
任何人都可以確認這是否是它在內部做什麼? (我知道我可以用bias
參數改變前面的常數。)
正如你可以看到在看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)
具有長度M
的N
列向量,因此(x-m).T
是儘可能多的行向量。最終結果是所有外部產品的總和。如果順序顛倒,同樣的*
將給出內部(標量)產品。但是,從技術上講,這些都只是標準矩陣乘法,而真正的外積只是列矢量與行矢量的乘積。
是的,那是numpy.cov
計算的結果。 FWIW,我比較了numpy.cov
的輸出以顯式迭代樣本(就像您提供的僞代碼一樣)以比較性能,並且得到的輸出數組的差異是由於浮點精度而預期的。
https://github.com/numpy/numpy/blob/master/numpy/ma/extras.py#L1257 – YXD