python - 如何使用 sklearn k-means 聚类根据特征之间的相关性对特征进行聚类

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

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

我想对患者进行聚类,而不是按照惯例对行进行聚类,而是对列进行聚类,这样我就可以看到哪些特征与哪些其他特征相似或相关。我已经可以使用 df.corr() 计算每个特征与其他每个特征的相关性。但是如何使用 sklearn.cluster.KMeans 将它们聚类为 k=2,3,4... 组?

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

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

最佳答案

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

阅读文档以了解层次结构。

您可以使用以下方式打印树状图

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")

关于python - 如何使用 sklearn k-means 聚类根据特征之间的相关性对特征进行聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52612841/

相关文章:

python - 解释 scipy.stats.entropy 值

python - 用于网格搜索分类的自定义评分函数

python - 无法调用“列表”对象来检查分数准确性?

python - Scikit-learn SelectFromModel——实际获取底层预测变量的特征重要性分数

python - sklearn 的 LabelBinarizer 的作用可以与 DictVectorizer 类似吗?

python - 如何仅从 Bigquery 客户端中的 insert_rows_from_dataframe 方法获取错误?

python - 尝试创建应作为命令行脚本工作的自定义包时出现 ModuleNotFoundError

python - Scipy 相当于 numpy where 对于稀疏矩阵

c++ - 如何使用 C++ opencv 2.4.10 查找视频的帧率?

python - 迁移学习失败,因为密集层预计具有形状(无,1)