我正在尝试计算存储在 2D numpy 数组中的变量之间的一些相关性(整数值,维度:
n_variables * n_observations
)。
例如:
data = np.array([
[1,3,7,5,6],
[2,3,4,5,2],
[3,3,9,5,10],
[4,3,4,8,6],])
因此,我有一个“掩码数组”(布尔值,维度:
n_variable * n_variables
),指示我感兴趣的变量对,它没有先验模式。每个变量也可以有不同的出现次数。
例如:V1 & V2、V1 & V3、V3 & V4。
potential_corr = np.array([
[0,1,1,0],
[1,0,0,0],
[1,0,0,1],
[0,0,1,0],])
有没有办法只计算这些特定索引组合的相关性(或应用其他函数)?
我正在查看的矩阵有超过 100K 个变量和相同的观察顺序,因此我真的尝试在相关性计算之前使用此过滤器来实现一些计算时间和内存优化。
我不太习惯非主流的 numpy 使用,也没有找到实现这种“稀疏”计算的函数。 我以为我可以使用 take_along_axis 但如果我没有弄错的话,每个变量都会被存储与它存在的组合数量一样多的次数。从内存角度来看,这对我来说看起来不是一个好主意。
我当然正在寻找与我的问题相关的任何解决方案,如果其他数据格式合适,我绝对不想使用 numpy 数组。
非常感谢您的帮助!
雷米
如果您只想计算“掩码数组”指示的特定变量组合的相关性,则可以使用 numpy.corrcoef 函数和掩码数组来实现此目的。以下是如何做到这一点的示例:
import numpy as np
data = np.array([
[1, 3, 7, 5, 6],
[2, 3, 4, 5, 2],
[3, 3, 9, 5, 10],
[4, 3, 4, 8, 6],
])
mask = np.array([
[0, 1, 1, 0],
[1, 0, 0, 0],
[1, 0, 0, 1],
[0, 0, 1, 0],
], dtype=bool)
correlations = np.corrcoef(data, rowvar=True) * mask
print(correlations)
注意:如果数据中存在缺失值,您可能需要在计算相关性之前对其进行适当处理。 Numpy 的 np.corrcoef 函数将缺失值视为与 NaN(非数字)相关值对。
一个可能的解决方案:
idx = np.nonzero(np.triu(potential_corr))
[np.corrcoef(data[i,:], data[j,:])[0,1] for i,j in zip(idx[0], idx[1])]