`numpy.corrcoef`返回具有意外形状的数组

时间:2018-09-24 21:56:28

标签: python numpy pearson-correlation

我正在执行以下操作:

from numpy import corrcoef
R= corrcoef(X, X, rowvar=False)

其中X的形状为(M,N)。 (有M个观察,每个观察都由一个长度为N的向量组成)。我期望得到一个形状为(N,N)的数组,但是我却得到了形状为(2 * N,2 * N)的数组。任何解释将不胜感激。

2 个答案:

答案 0 :(得分:0)

每个NxN象限都是一个协方差矩阵。

a3 = corrcoeff(a1,a2,rowvar = False)

a1和a2的大小明显相同。

  1. 左上象限是a1的每个变量相对于a1的变化
  2. 右上象限是a1相对于a2的变化
  3. 左下方是a2相对于a1的变化
  4. 右下角是a2相对于a2的变化

如果a1和a2相同,您会发现每个象限的对角线都是一个对角线。

如果您只想查看每个变量的变化方式:

a3 = numpy.cov(a1,a1,rowvar=False)[:N,:N]

答案 1 :(得分:0)

是的,由于某种原因,np.covnp.corrcoef都将输入连接在一起,然后总是对连接的数组进行自动协方差。幸运的是,您不能只给出第二个数组,而是将获得第一个参数的自动协方差(由于默认y = None而已。)

R = corrcoef(X, rowvar = False)

如果您不进行自协方差,那么最好的选择是将scipy.spatial.distance.cdistmetric = 'correlation'一起使用,或者只是长时间进行计算:

X_ = X - X.mean(-1)
Y_ = Y - Y.mean(-1)
X_var = np.einsum('ij, ij -> j', X_, X_)
Y_var = np.einsum('ij, ij -> j', Y_, Y_)
R = (X_.T @ Y_) / (X_var[:, None] * Y_var)