python - 寻找一种简化的方法来计算数组之间的成对相关性
问题描述
我有 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
解决方案
假设您有 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 的每一列将表示与包括其自身在内的其他数组的相关系数(它将是一个)。
#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
推荐阅读
- ios - 后台 CBPeripheral 无法保持可读性
- vue.js - 如何侦听作为 vuejs 中对象的道具的更改
- mapping - Pentaho Data Integration Field 到 Field 数据转换
- javascript - 如何解决 TypeError: Cannot read property 'filter' of undefined error after replace lodash find function with native JS filter function?
- google-cloud-dataflow - 获取 PCollection 中的所有元素,而不考虑标记
- android - 使用 dagger 将 ViewModelProvider.Factory 注入到不同的 Activity
- ruby - 如此破碎的 Ruby 循环
- json - 在golang中将JSON文件转换为csv
- event-handling - 如何编写自定义事件处理程序,以便发送的消息包含事件对象?
- vue.js - Vue 可拖动限制列表到 1 个元素