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