2014-02-13 114 views
1

我有兩個向量X0和X1(mx0和mx1是每個向量的平均值),我試圖找到它們之間的協方差矩陣。我設法通過做找矩陣中的每個元素:Python:手工協方差矩陣

b1=numpy.zeros(N*1).reshape((N,1)) 
b2=numpy.zeros(N*1).reshape((N,1)) 

for i in range(0,N): 
    b1[i]=X0[i]-mX0 
for j in range(0,N): 
    b2[j]=X1[j]-mX1 

bii=sum(p*q for p,q in zip(b1,b1))/(N-1) 
bij=sum(p*q for p,q in zip(b1,b2))/(N-1) 
bji=sum(p*q for p,q in zip(b2,b1))/(N-1) 
bjj=sum(p*q for p,q in zip(b2,b2))/(N-1) 

,但我想通過一個循環做這個,而不是單獨做的每一個元素的更好的方式。

回答

3

如果您想手動計算協方差矩陣,請研究/ mimick how numpy.cov does it,或者如果您只是想要結果,請直接使用np.cov(b1, b2)

import numpy as np 
np.random.seed(1) 
N = 10 
b1 = np.random.rand(N) 
b2 = np.random.rand(N) 
X = np.column_stack([b1, b2]) 
X -= X.mean(axis=0) 
fact = N - 1 
by_hand = np.dot(X.T, X.conj())/fact 
print(by_hand) 
# [[ 0.04735338 0.01242557] 
# [ 0.01242557 0.07669083]] 

using_cov = np.cov(b1, b2) 

assert np.allclose(by_hand, using_cov)