如何在相关矩阵中找到高值?

问题描述

如何在correlation matrix中返回高度相似性(或最高相关性值或高于阈值的值)?例如,在下面的示例中,A1和A3具有高度相关性。

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO('''Sentence,A1,A2,A3
                        text,0.23,0.54,39
                        text,0.33,0.7,36
                        text,0.8,0.41,29'''),sep=',')
print(df.corr())

结果:

           A1        A2        A3
 A1  1.000000 -0.732859 -0.991352
 A2 -0.732859  1.000000  0.637235
 A3 -0.991352  0.637235  1.000000

解决方法

继续示例并使用numpy:

c = df.corr()
import numpy as np

threshold = .99
np.abs(c.values) > threshold

这给出了:

array([[ True,False,True],[False,True,False],[ True,True]])

您可以通过以下方法获取非对角线有效值的索引:

[(i,j) for i,j in zip(*np.where(np.abs(c.values) > threshold)) if i!=j]

这给出了:

[(0,2),(2,0)]

更新

利用相关矩阵的对称性,可以获得具有列名的可读字符串列表:

[f"{c.columns[i]} and {c.columns[j]}" for i,j in zip(*np.where(np.abs(c.values) > threshold)) if i < j]

->

[' A1 and  A3']
,

如果您需要具有最高相关性的对,则需要堆叠,然后通过堆叠找到具有最高关联的对。

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO('''Sentence,A1,A2,A3
                        text,0.23,0.54,39
                        text,0.33,0.7,36
                        text,0.8,0.41,29'''),sep=',')

df.drop(['Sentence'],1,inplace=True)
print(df.corr())


def get_red_pair(df):
    pairs_to_drop = set()
    cols = df.columns
    for i in range(0,df.shape[1]):
        for j in range(0,i+1):
            pairs_to_drop.add((cols[i],cols[j]))
    return pairs_to_drop

def get_largest_correlations(df,n=5):
    au_corr = df.corr().abs().unstack()
    labels_to_drop = get_red_pair(df)
    au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False)
    return au_corr[0:n]

corr = get_largest_correlations(df)
print(corr)

仅获取第一个,然后向该函数确保您将n传递为1,因为默认情况下它期望为5

如果这不是您要查找的内容,则很好地提出问题可能会有所帮助

这给

           A1        A2        A3
 A1  1.000000 -0.732859 -0.991352
 A2 -0.732859  1.000000  0.637235
 A3 -0.991352  0.637235  1.000000

 A1   A3    0.991352
      A2    0.732859
 A2   A3    0.637235