2016-12-12 7 views
1

주어진 데이터의 공분산 값을 계산하려고합니다. 그것은이 작업을 수행하는 가장 효율적인 방법은 아니다공분산이 양수가 아닙니다.

def calcCov(x): 
    m, n = x.shape 

    mean = np.mean(x, axis=0) 
    cov = np.zeros((n, n)) 
    for j in range(0, n): 
     for k in range(0, n): 
      sum = 0 
      for i in range(0, m): 
       sum += (x[i, j] - mean[j])*(x[i, k] - mean[k]) 
      cov[j, k] = sum/(m - 1.0) 

    return cov 

, 그러나 그것은 간단하고 내 지식의 최선을 https://en.wikipedia.org/wiki/Sample_mean_and_covariance#Sample_covariance의 직접 복사입니다 :

내가 쓴 코드입니다.

공분산 행렬은 항상 양의 semidefinite입니다. 그러나 (np.eig로) 고유 값을 계산할 때 때때로 부정적인 고유치가 나타납니다. 예

코드

data = np.random.rand(2, 2) 
print data 
cov = calcCov(data) 
eigvals, eigvec = np.linalg.eig(cov) 
print cov 
print eigvals 

매우 불안정하다 수학자로서 출력

[[ 0.12873309 0.92079275] 
[ 0.90018866 0.73197021]] 
[[ 0.29757185 -0.0728341 ] 
[-0.0728341 0.01782698]] 
[ 3.15398823e-01 -3.46944695e-18] 

를 출력한다. 왜 이런 일이 생길까요? 간단한 수치 오류? 나는 공분산 계산에 실수를 했습니까?

답변