首页 > 解决方案 > 寻找一种简化的方法来计算数组之间的成对相关性

问题描述

我有 n 个长度为 m 的数组,我想在数组之间取成对的 Pearson 相关性,并对它们取平均值。

数组保存为形状为 numpy 的数组(n, m)

一种方法是编写“两个 for 循环操作”。但是,我想知道这可以用python以更简化的方式编写吗?

我当前的代码如下所示:

sum_dd = 0
counter_dd = 0
for i in range(len(stc_data_roi)):
    for j in range(i+1, len(stc_data_roi)):
        sum_dd += np.corrcoef(stc_data_roi[i], stc_data_roi[j])
        counter += 1

标签: pythonarraysnumpypearson-correlation

解决方案


假设您有 n=4 个长度为 m=5 的数组

n = 4
m = 5
X = np.random.rand(n, m)
print(X)

array([[0.49017121, 0.58751099, 0.87868983, 0.75328938, 0.16491984],
   [0.81175397, 0.26486309, 0.42424784, 0.37485824, 0.66667452],
   [0.80901099, 0.84121723, 0.36623767, 0.59928036, 0.22773295],
   [0.59606777, 0.63301654, 0.30963807, 0.82884099, 0.95136045]])

现在转置数组并转换为数据帧。数据框的每一列代表一个数组,然后使用 pandas corr函数。

df = pd.DataFrame(X.T)
corr_coef = df.corr(method="pearson")
print(corr_coef)

corr_coef 的每一列将表示与包括其自身在内的其他数组的相关系数(它将是一个)。

1.000000 -0.582567 0.226621 -0.709900 -0.582567 1.000000 -0.142663 0.182677 0.226621 -0.142663 1.000000 -0.173838 -0.70990001003 0.18281678

#sum of relevant coefficients as per your code
#Subtract by 4 because we don't want self correlation
#Divide by 2 becasue we are adding twice
corr_coef_sum = (corr_coef.sum().sum() - n) / 2
corr_coef_avg = corr_coef_sum / 6 #Total 6 combination in our example case

推荐阅读