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

How to find high values in the correlation matrix?

如何在 correlation matrix 中 return 高度相似(或最高相关值,或高于阈值的值)?例如,在下面的示例中,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, False,  True]])

您可以通过以下方式获取 off-diagonal 重要值的索引:

[(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