矩阵的每一列和向量之间的 numpy 协方差

Sha*_*nam 4 python numpy

基于这篇文章,我可以使用np.cov((x,y), rowvar=0). 我有一个矩阵 MxN 和一个向量 Mx1。我想找到矩阵的每一列和给定向量之间的协方差。我知道我可以使用for循环来编写。我想知道我是否可以以某种方式np.cov()直接获得结果。

小智 5

正如 Warren Weckesser 所说,numpy.cov(X, Y)它不适合这项工作,因为它会简单地将数组连接到一个 M × (N+1) 数组中,并找到巨大的 (N+1) × (N+1) 协方差矩阵。但是我们总会有协方差定义,而且它很容易使用:

A = np.sqrt(np.arange(12).reshape(3, 4))   # some 3 by 4 array 
b = np.array([[2], [4], [5]])              # some 3 by 1 vector
cov = np.dot(b.T - b.mean(), A - A.mean(axis=0)) / (b.shape[0]-1)
Run Code Online (Sandbox Code Playgroud)

这将返回 A 的每一列与 b 的协方差。

array([[ 2.21895142,  1.53934466,  1.3379221 ,  1.20866607]])
Run Code Online (Sandbox Code Playgroud)

我使用的公式用于样本协方差(这也是 numpy.cov 计算的),因此除以 (b.shape[0] - 1)。如果你除以b.shape[0]你得到未调整的总体协方差

为了比较,相同的计算使用np.cov

import numpy as np
A = np.sqrt(np.arange(12).reshape(3, 4))
b = np.array([[2], [4], [5]])
np.cov(A, b, rowvar=False)[-1, :-1]
Run Code Online (Sandbox Code Playgroud)

相同的输出,但需要大约两倍的时间(对于大型矩阵,差异会更大)。最后的切片是因为np.cov计算 5 x 5 矩阵,其中只有最后一行的前 4 个条目是您想要的。其余的是 A 与自身或 b 与自身的协方差。

相关系数

通过除以方差的平方根获得相关系数。注意前面提到的 -1 调整:numpy.var默认情况下不会进行调整,要使其发生,您需要ddof=1参数。

corr = cov / np.sqrt(np.var(b, ddof=1) * np.var(A, axis=0, ddof=1)) 
Run Code Online (Sandbox Code Playgroud)

检查输出是否与效率较低的版本相同

np.corrcoef(A, b, rowvar=False)[-1, :-1]
Run Code Online (Sandbox Code Playgroud)