python - numpy协方差和协方差矩阵通过公式产生不同的结果

标签 python numpy matrix matrix-multiplication covariance

我生成一个矩阵,我想获取其协方差:

test=np.array([4,2,.6,4.2,2.1,.59,3.9,2,.58,4.3,2.1,.62,4.1,2.2,.63]).reshape(5,3)
test 
array([[ 4.  ,  2.  ,  0.6 ],
       [ 4.2 ,  2.1 ,  0.59],
       [ 3.9 ,  2.  ,  0.58],
       [ 4.3 ,  2.1 ,  0.62],
       [ 4.1 ,  2.2 ,  0.63]])

我用 numpy 函数计算协方差:

np.cov(test)
array([[ 2.92      ,  3.098     ,  2.846     ,  3.164     ,  2.966     ],
       [ 3.098     ,  3.28703333,  3.0199    ,  3.3566    ,  3.1479    ],
       [ 2.846     ,  3.0199    ,  2.7748    ,  3.0832    ,  2.8933    ],
       [ 3.164     ,  3.3566    ,  3.0832    ,  3.4288    ,  3.2122    ],
       [ 2.966     ,  3.1479    ,  2.8933    ,  3.2122    ,  3.0193    ]])

但这与遵循协方差公式不同:

enter image description here

mean=np.mean(test,0)
np.dot(test-mean,(test-mean).T)/(5-1)
array([[ 0.004104, -0.002886,  0.006624, -0.005416, -0.002426],
       [-0.002886,  0.002649, -0.005316,  0.005044,  0.000509],
       [ 0.006624, -0.005316,  0.011744, -0.010496, -0.002556],
       [-0.005416,  0.005044, -0.010496,  0.010164,  0.000704],
       [-0.002426,  0.000509, -0.002556,  0.000704,  0.003769]])

这与 numpy 计算不匹配。 事实上,我看了一下source code方程是 (x-m) * (x-m).T.conj()/(N - 1) 我相信我正在实现。

最佳答案

差异在于 np.cov 计算行向量之间的协方差,这就是为什么结果是 5*5 而不是 3 *3,但是 np.mean 计算列向量的平均值,当您执行 test -mean 时,计算也会沿列广播,这与 code>np.cov 正在做,修复将分两步:

首先,确保计算每行的平均值,这可以通过简单地转置 test 矩阵来完成:

mean = np.mean(test.T, 0)

然后,在计算 x - x_bar 时,重新调整均值向量,使负值也沿着行,而且由于测试的向量是行向量,因此维度将是 3而不是5。经过这些修复后,它将提供与 np.cov 相同的结果:

np.dot(test-mean[:, None],(test-mean[:, None]).T)/(3-1) 

# array([[ 2.92      ,  3.098     ,  2.846     ,  3.164     ,  2.966     ],
#        [ 3.098     ,  3.28703333,  3.0199    ,  3.3566    ,  3.1479    ],
#        [ 2.846     ,  3.0199    ,  2.7748    ,  3.0832    ,  2.8933    ],
#        [ 3.164     ,  3.3566    ,  3.0832    ,  3.4288    ,  3.2122    ],
#        [ 2.966     ,  3.1479    ,  2.8933    ,  3.2122    ,  3.0193    ]])

关于python - numpy协方差和协方差矩阵通过公式产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38177799/

相关文章:

mysql - 如何在mysql中创建成对数据透视表的矩阵

Python/Yagmail - 如何将本地镜像嵌入到电子邮件中?

python - 如何同时使用窗口大小裁剪 numpy 数组的每个元素而不循环遍历每个像素?

python - 使用 python 在列表中查找唯一的最大值

python - python 中“numpy.ndarray”对象不可调用错误

matrix - 如何在 TensorFlow 中更改变量的形状?

python - 将图以邻接列表的形式写入文件[提及每行中每个节点的所有邻居]

python - 从 numpy 数组中获取第 n 个元素

python - 如何将这个嵌套的 for 循环写成列表理解?

python - 循环遍历 numpy 矩阵