1

我正在尝试在 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]]

我已经尝试打印每条语句,以检查它可能出错的地方,但我无法找到错误。

4

1 回答 1

0

这是因为两个复向量的点积z1z2定义为z1 · z2*,其中 * 表示共轭。如果你使用s += np.dot((x[i,j] - mean[i]), np.conj(x[k,j] - mean[i]))你应该得到正确的结果,我们使用了Numpy 的共轭函数

于 2020-11-30T19:14:40.483 回答