当提供两个矩阵时,numpy.corrcoeff是否计算矩阵内的相关性(内部相关性)



这里我正在计算Pearson相关性,以便对每个比较进行说明。

x = pd.DataFrame({'a':[3,6,4,7,9],'b':[6,2,4,1,5],'c':[7,9,1,2,9]},index=['aa','bb','cc','dd','ee']).T
y = pd.DataFrame({'A':[9,4,1,3,5],'B':[9,8,9,5,7],'C':[1,1,3,1,2]},index=['aa','bb','cc','dd','ee']).T
table = pd.DataFrame(columns=['Correlation Coeff'])
for i in range(0, len(x)):
for j in range(0, len(y)):
xf = list(x.iloc[i])
yf = list(y.iloc[j])
n = np.corrcoef(xf,yf)[0,1]
name = x.index[i]+'|'+y.index[j]
table.at[name, 'Correlation Coeff'] = n
table  

这就是结果:

Correlation Coeff
a|A   -0.232973
a|B   -0.713392
a|C   -0.046829
b|A    0.601487
b|B    0.662849
b|C    0.29654
c|A    0.608993
c|B    0.16311
c|C   -0.421398

现在,当我将这些表直接应用于numpy的函数,删除重复的值和"ones"时,它看起来是这样的。

x = pd.DataFrame({'a':[3,6,4,7,9],'b':[6,2,4,1,5],'c':[7,9,1,2,9]},index=['aa','bb','cc','dd','ee']).T.to_numpy()
y = pd.DataFrame({'A':[9,4,1,3,5],'B':[9,8,9,5,7],'C':[1,1,3,1,2]},index=['aa','bb','cc','dd','ee']).T.to_numpy()
n = np.corrcoef(x,y)
n = n.tolist()
n = [element for sub in n for element in sub]
# Rounding to ensure no duplicates are being picked up.
rnd = [round(num, 13) for num in n] 
X = [i for i in rnd if i != 1]
X =  list(dict.fromkeys(X))
X

[-0.32318286529870.3157400783243,-0.232972779074,-0.7133922984085,-0.0468292905791,0.3196502842345,0.6014868821052,0.6628489803599,0.2965401263095,0.60899348446,0.1631095635753,-0.4213976094463,0.2417468892076-0.58417823011940.3674842076296]

有6个额外值(粗体(未计入。我假设它们是在单个矩阵中计算的相关值,如果是,为什么?有没有一种方法可以在不生成这些附加值的情况下使用此函数?

假设这些是x和y中变量的相关性是正确的,据我所知,没有办法关闭这种行为。

通过查看numpy.corrcoeff的实现,你可以看到这是真的。正如预期的那样,大部分繁重的工作都是由一个计算协方差的单独函数完成的-如果你查看numpycov的实现,特别是第2639行,你会发现,如果你提供了一个额外的y参数,在计算协方差矩阵之前,它只是简单地连接到x上。

如果必要的话,实现自己版本的corrcove并不是太难,它可以按照你的意愿工作。请注意,您可以在纯numpy中执行此操作,在大多数情况下,这将比上面示例代码中的迭代方法更快。

最新更新