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

时间:2018-01-05 01:21:54

标签: python numpy

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

1 个答案:

答案 0 :(得分:2)

正如Warren Weckesser所说,numpy.cov(X, Y)不适合这项工作,因为它只是将数组连接到一个M乘(N + 1)数组并找到巨大的(N + 1)乘以(N +1)协方差矩阵。但我们总是拥有definition of covariance并且它易于使用:

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)

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

array([[ 2.21895142,  1.53934466,  1.3379221 ,  1.20866607]])

我使用的公式是样本协方差(这也是numpy.cov计算的),因此除以(b.shape [0] -1)。如果除以b.shape[0],则会获得未经调整的population covariance

为了比较,使用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]

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

相关系数

相关系数是通过除以方差的平方根得到的。注意前面提到的-1调整:numpy.var默认情况下不会这样做,以便在需要ddof=1参数时实现。

corr = cov / np.sqrt(np.var(b, ddof=1) * np.var(A, axis=0, ddof=1)) 

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

相同
np.corrcoef(A, b, rowvar=False)[-1, :-1]