Python 如何使用sklearn k-means聚类根据彼此的相关性对*特征*进行聚类

Python 如何使用sklearn k-means聚类根据彼此的相关性对*特征*进行聚类,python,machine-learning,scikit-learn,k-means,sklearn-pandas,Python,Machine Learning,Scikit Learn,K Means,Sklearn Pandas,我有一个熊猫数据框,其中行作为记录(患者),105列作为特征。(每个患者的属性) 我想聚类,不是患者,不是按惯例的行,而是列,这样我可以看到哪些特征与哪些其他特征相似或相关。我已经可以使用df.corr()计算每个特征与每个其他特征的相关性。但是我怎样才能把它们聚类成k=2,3,4。。。使用sklearn.cluster.KMeans 我尝试了KMeans(n_clusters=2).fit(df.T),它确实对特征进行了聚类(因为我采用了矩阵的转置),但只使用了欧几里德距离函数,而不是根据它们

我有一个熊猫数据框,其中行作为记录(患者),105列作为特征。(每个患者的属性)

我想聚类,不是患者,不是按惯例的行,而是列,这样我可以看到哪些特征与哪些其他特征相似或相关。我已经可以使用
df.corr()
计算每个特征与每个其他特征的相关性。但是我怎样才能把它们聚类成k=2,3,4。。。使用
sklearn.cluster.KMeans

我尝试了
KMeans(n_clusters=2).fit(df.T)
,它确实对特征进行了聚类(因为我采用了矩阵的转置),但只使用了欧几里德距离函数,而不是根据它们的相关性。我更喜欢根据相关性对特征进行聚类


这应该很容易,但我会感谢您的帮助。

KMeans在这种情况下不是很有用,但您可以使用任何可以与距离矩阵一起使用的聚类方法。例如,凝聚聚类

我将使用scipy,sklearn版本更简单,但没有那么强大(例如,在sklearn中,您不能使用带距离矩阵的WARD方法)

来自scipy.cluster导入层次结构的

将scipy.spatial.distance导入为ssd
df=…#您的数据帧具有许多功能
CORR= DF.CARR())我们可以将其视为亲和矩阵。
距离=1-校正abs()值#成对距离
distArray=ssd.squareform(距离)#scipy将矩阵转换为1d数组
hier=hierarchy.linkage(distArray,method=“ward”)#您可以使用其他方法
阅读文档以了解层次结构

你可以用打印机打印树状图

dend=hierarchy.dengram(hier,truncate_mode=“level”,p=30,color_threshold=1.5)
最后,获取功能的簇标签

threshold=1.5#使用树状图或任何其他方法(例如分位数或所需特征数)选择阈值
cluster_labels=hierarchy.fcluster(层次、阈值、标准=“距离”)

通过获取所有特征的相关性创建一个新矩阵
df.corr()
,现在将此新矩阵用作k-means算法的数据集。
这将为您提供具有相似相关性的特征群集。

如果某个特征A与B相关,而B与C相关,但A与C不相关,会发生什么情况?这种情况很容易发生。如果有两个簇(粗略地说,相关特征组和不相关特征组),则A和C属于同一组(不相关特征),但A和B属于另一组(相关特征)。你会怎么处理?你的团队之间不可能有交集。这可能有点愚蠢,但是PCA呢?如果多重特征相关,则协方差矩阵分解提供的各自特征向量应“接近”,对吗?您可以在使用余弦相似性执行聚类之后?