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