如何解决如何在相关矩阵中找到高值?
如何在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。