2013-09-27 145 views
3

我有一個1043 * 261矩陣,其中0和1之間的數字非常小,我使用numpy.cov()函數計算了1043 * 1043協方差矩陣。我嘗試了幾次運行代碼,得到了類似(不完全相同)的協方差矩陣,但協方差矩陣中的元素與e-7的規模略有不同。這有時會造成協方差矩陣非PSD,這會對我造成嚴重問題。由Python Numpy計算的協方差矩陣每次都改變

有誰知道爲什麼會存在差異以及如何解決?

附加兩個協方差矩陣,我通過運行相同的代碼兩次得到。如果您按元素比較它們,您會看到稍微的差異:

No. 1 
[[ 5.05639177e-06 2.44041401e-06 3.30187175e-06 ..., 1.66634014e-06 
4.03972183e-06 1.18433575e-06] 
[ 2.44041401e-06 9.67277658e-06 9.04356309e-06 ..., 2.50668884e-06 
5.43371939e-06 4.74297546e-06] 
[ 3.30187175e-06 9.04356309e-06 2.09334309e-05 ..., 3.13977728e-06 
8.69946165e-06 6.15981652e-06] 
..., 
[ 1.66634014e-06 2.50668884e-06 3.13977728e-06 ..., 4.20175297e-06 
4.16076781e-06 1.59827406e-06] 
[ 4.03972183e-06 5.43371939e-06 8.69946165e-06 ..., 4.16076781e-06 
2.58010941e-05 3.02797946e-06] 
[ 1.18433575e-06 4.74297546e-06 6.15981652e-06 ..., 1.59827406e-06 
3.02797946e-06 6.60805238e-06]] 

No.2 
[[ 5.05997030e-06 2.42187179e-06 3.30788097e-06 ..., 1.66495376e-06 
4.03676937e-06 1.17413702e-06] 
[ 2.42187179e-06 9.60677140e-06 9.05219266e-06 ..., 2.50338648e-06 
5.42679569e-06 4.75547515e-06] 
[ 3.30788097e-06 9.05219266e-06 2.04172017e-05 ..., 3.13058624e-06 
8.67976701e-06 6.28137859e-06] 
..., 
[ 1.66495376e-06 2.50338648e-06 3.13058624e-06 ..., 4.20175297e-06 
4.16076781e-06 1.59827884e-06] 
[ 4.03676937e-06 5.42679569e-06 8.67976701e-06 ..., 4.16076781e-06 
2.58010941e-05 3.02810307e-06] 
[ 1.17413702e-06 4.75547515e-06 6.28137859e-06 ..., 1.59827884e-06 
3.02810307e-06 6.63834973e-06]] 

非常感謝!

+2

任何代碼來顯示持有?任何重現該例子的事情都很好。 – Veedrac

回答

6

numpy.cov似乎是確定的:

import numpy 

randoms = numpy.random.random((1043, 261)) 

covs = [numpy.cov(randoms) for _ in range(10)] 
all((c==covs[0]).all() for c in covs) 
#>>> True 

我想像的問題是其他地方。

另外請注意,這個結果與數字1000 大小

+0

+1 - 一個很好的答案。做得好。 – duffymo