numpy 在python中,我们如何找到两个矩阵之间的相关系数?

q9rjltbz  于 2023-02-04  发布在  Python
关注(0)|答案(3)|浏览(248)

我有两个矩阵,比如T1和T2,大小都是mxn,我想求出两个矩阵之间的相关系数
到目前为止,我还没有使用任何内置库函数。我正在为它做以下步骤:
首先,我计算两个矩阵的平均值:

M1 = T1.mean()
M2 = T2.mean()

然后我从相应的矩阵中减去平均值:

A = np.subtract(T1, M1)
B = np.subtract(T2, M2)

其中np是numpy库,A和B是减法后得到的矩阵。
现在,我计算相关系数如下:

alpha = np.sum(A*B) / (np.sqrt((np.sum(A))*np.sum(B)))

然而,我得到的值远远大于1,而且没有任何意义。它应该在0和1之间才有意义。
我也试过使用矩阵A和B的绝对值,但那也不起作用。
我还尝试使用:

np.sum(np.dot(A,B.T)) instead of np.sum(A*B)

在分子中,但那也不起作用
编辑1:
这是我打算计算的公式:

在这个图像中,C是其中一个矩阵,T是另一个矩阵。
"u"是一个平均符号。
有人能告诉我我到底在哪里犯了错吗?

kx5bkwkv

kx5bkwkv1#

你能试试这个吗:

import numpy as np
x = np.array([[0.1, .32, .2, 0.4, 0.8], [.23, .18, .56, .61, .12]])
y = np.array([[2,4,0.1, .32, .2],[1,3,.23, .18, .56]])
pearson = np.corrcoef(x,y)
print(pearson)
jvlzgdj9

jvlzgdj92#

我认为这个函数正在做我想要做的事情:

def correlation_coefficient(T1, T2):
    numerator = np.mean((T1 - T1.mean()) * (T2 - T2.mean()))
    denominator = T1.std() * T2.std()
    if denominator == 0:
        return 0
    else:
        result = numerator / denominator
        return result

分子的计算似乎是棘手的,这并不完全反映了上面的图像和分母中显示的公式只是两个图像的标准差的乘积。
然而,结果现在确实有意义,因为结果仅位于0和1之间。

m3eecexj

m3eecexj3#

从OP中描述问题的方式来看,矩阵被视为数组,因此可以简单地将其扁平化:

x = T1.flatten()
y = T2.flatten()

然后可以使用@AakashMakwana提出的builtin numpy function

import numy as np
r = np.corrcoef(x, y)[0,1]

***备注:*请注意,如果不展平,此解将生成成对相关性矩阵。

或者,可以使用equivalent scipy function

from scipy.stats import pearsonr
r = pearsonr(x,y)[0]

Scipy还提供了计算斯皮尔曼相关系数(spearmanr(x,y)[0])或肯德尔τ(kendalltau(x,y)[0])的可能性。

相关问题