bugfix> python > 投稿

Pythonで単純な共分散行列関数を作成しようとしています。

import numpy as np
def manual_covariance(x):
    mean = x.mean(axis=1)
    print(x.shape[1])
    cov = np.zeros((len(x), len(x)), dtype='complex64')
    for i in range(len(mean)):
        for k in range(len(mean)):
            s = 0
            for j in range(len(x[1])):  # 5 Col
                s += np.dot((x[i][j] - mean[i]), (x[k][j] - mean[i]))
            cov[i, k] = s / ((x.shape[1]) - 1)
    return cov

この関数を使用して、次の共分散を計算すると、次のようになります。

A = np.array([[1, 2], [1, 5]])
man_cov = manual_covariance(A)
num_cov = np.cov(A)

私の答えはnp.cov()と一致し、問題はありません。しかし、代わりに複素数を使用すると、私の答えはnp.cov()と一致しません。

A = np.array([[1+1j, 1+2j], [1+4j, 5+5j]])
man_cov = manual_covariance(A)
num_cov = cov(A)
Manual result:
[[-0.5+0.j -0.5+2.j]
 [-0.5+2.j  7.5+4.j]]
Numpy cov result:
[[0.5+0.j 0.5+2.j]
 [0.5-2.j 8.5+0.j]]

すべてのステートメントを印刷して、どこで問題が発生する可能性があるかを確認しようとしましたが、障害を見つけることができません。

回答 1 件
  • これは、2つの複素ベクトルの内積が原因です。 z1 そして z2 と定義されている z1 · z2* 、ここで*は活用を意味します。使用する場合 s += np.dot((x[i,j] - mean[i]), np.conj(x[k,j] - mean[i])) Numpyの共役関数を使用した場合、正しい結果が得られるはずです。

あなたの答え