2016-12-12 18 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の直接のコピーです。

共分散行列は常に正の半定理です。しかし、固有値(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] 

を印刷します。なぜこれが起こるのですか?簡単な数値エラー?私は共分散の計算に間違いを犯しましたか?

答えて

関連する問題