주어진 데이터의 공분산 값을 계산하려고합니다. 그것은이 작업을 수행하는 가장 효율적인 방법은 아니다공분산이 양수가 아닙니다.
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]
를 출력한다. 왜 이런 일이 생길까요? 간단한 수치 오류? 나는 공분산 계산에 실수를 했습니까?