我在python数据帧中有一个n * n相关矩阵。我想基于这个矩阵分配簇值,比如说(相关性> 0.08)进入一个簇,依此类推:
import pandas as pd
import numpy as np
# data
# ==============================
np.random.seed(0)
df = pd.DataFrame(np.random.randn(100,5), columns=list('ABCDE'))
df1=df.corr()
A B C D E
A 1 -0.052234579 -0.098678285 0.063338014 -0.097187103
B -0.052234579 1 -0.015077115 0.058672786 0.140833111
C -0.098678285 -0.105077115 1 0.008695575 0.048329744
D 0.063338014 0.058672786 0.008695575 1 0.120529455
E -0.097187103 0.140833111 0.048329744 0.120529455 1
d={}
i=1
while df1.shape[0]>0:
x=(abs(df1.head(1))>0.08).T
x1=list(x[x[x.columns[0]]==True].index)
d[i]=x1
df1=df1[~df1.index.isin(x1)][list(df1.columns-x1)]
i+=1
d>>
{1: ['A', 'C', 'E'], 2: ['B'], 3: ['D']}
现在我的挑战是,一个变量的相关值> 0.08,但与另一个不在当前集群中的变量具有更强的相关性,理想情况下它应该在不同的集群中。
e.g。 'E'与A的相关性为-0.09,因此它在群集1中,但它与B具有更强的相关性(0.14),因此理想情况下,它应该在群集2中。 所以理想的集群分配应该是:
{1: ['A', 'C'], 2: ['B','D','E']}
我如何解决这个迭代问题?
答案 0 :(得分:0)
使用绝对关联,然后使用分层凝聚聚类。
每一点都是它自己的集群。然后,将这两者与最佳相关性合并。如果相关性太弱,则停止合并。