了解np.corrcoef对两个不同大小的矩阵的输出

时间:2017-10-20 09:29:38

标签: python numpy correlation

我想计算矩阵 A 的每个列向量与矩阵 B的每个列向量之间的相关性

考虑:

vectorsize = 777 
A = np.random.rand(vectorsize, 64)
B = np.random.rand(vectorsize, 36)
corr = np.corrcoef(A, B, rowvar=False)

在这种情况下,np.corrcoef的输出将是100x100矩阵。这是什么意思?

直观地说,我希望获得64x36矩阵。

2 个答案:

答案 0 :(得分:4)

如果方法corrcoef得到两个数组x和y,它会堆叠它们(如果rowVar为True则垂直,如果rowVar为False,则为水平)。 在source

if y is not None:
    y = array(y, copy=False, ndmin=2, dtype=dtype)
    if not rowvar and y.shape[0] != 1:
        y = y.T
    X = np.vstack((X, y))

在统计学上,它认为A有64个变量(在列中,因为rowVar为假),B有36个。堆叠它们会给你100个变量,因此100乘100相关矩阵。

相关矩阵始终是对称的(并且是半正定的)。如果你只想要x和y变量之间的相关性,它们就是一个大小为64乘36的非对角线块:用切片提取它。这是输出的结构:

 corr(x, x), size 64 by 64  |  corr(x, y), size 64 by 36
 ---------------------------+---------------------------
 corr(y, x), size 36 by 64  |  corr(y, y), size 36 by 36

答案 1 :(得分:2)

作为rowvar=False,它计算列之间的相关性。因此,它计算A的每列与其自身以及B的每一列之间的Pearson相关系数。它与连接两个矩阵并计算其列之间的相关性相同,如下图:

C = np.hstack([A, B])   # C.shape[0] == A.shape[0] == B.shape[0] and C.shape[1] = A.shape[1] + B.shape[1]

corr_C = np.corrcoef(C, rowvar=False)

np.allclose(corr_C, corr)   # Returns True