如何在相关矩阵中找到高值?
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
如何在 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