如何使用sklearn k-means聚类基于特征彼此关联*

时间:2018-10-02 16:45:47

标签: python machine-learning scikit-learn k-means sklearn-pandas

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

我想聚类,而不是聚类,而不是习惯上的行,而是列,因此我可以看到哪些特征与哪些其他特征相似或相关。我已经可以使用df.corr()计算每个功能与其他功能的相关性。但是如何使用sklearn.cluster.KMeans将它们聚类为k = 2,3,4 ...组?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

from scipy.cluster import hierarchy
import scipy.spatial.distance as ssd

df = ...  # your dataframe with many features
corr = df.corr()  # we can consider this as affinity matrix
distances = 1 - corr.abs().values  # pairwise distnces

distArray = ssd.squareform(distances)  # scipy converts matrix to 1d array
hier = hierarchy.linkage(distArray, method="ward")  # you can use other methods

阅读文档以了解 hier 结构。

您可以使用

打印树状图
dend = hierarchy.dendrogram(hier, truncate_mode="level", p=30, color_threshold=1.5)

最后,获取特征的聚类标签

threshold = 1.5  # choose threshold using dendrogram or any other method (e.g. quantile or desired number of features)

cluster_labels = hierarchy.fcluster(hier, threshold, criterion="distance")

答案 1 :(得分:1)

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