python - 如何使用 sklearn k-means 聚类根据彼此之间的相关性对 * 特征 * 进行聚类
问题描述
我有一个熊猫数据框,其中行作为记录(患者)和 105 列作为特征。(每个患者的属性)
我想对患者进行聚类,而不是按照惯例对行进行聚类,而是对列进行聚类,以便我可以看到哪些特征与哪些其他特征相似或相关。我已经可以使用df.corr()
. 但是我怎样才能将它们聚集到 k=2,3,4... 组中sklearn.cluster.KMeans
呢?
我尝试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
阅读文档以了解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")
推荐阅读
- java - MapStruct 没有符合条件的 bean
- html - 如何使中间的蓝色条纹比其他4条细?
- sql - 选择正确的记录
- python - 将 JSON 响应中的多个条目打印到 e GET 请求
- php - Codeigniter 使用 or_like 搜索具有文本值的列
- flutter - 无法在初始化程序中访问实例成员“params”
- python - 如何在 Kivy 中与标签发生碰撞
- outlook - 如何在 MediaWiki 上跳过 .OFT 文件扩展名的 MIME 类型检查
- c++ - 使用 'const CString &' 而不是 LPCTSTR 时的成员变量问题
- reactjs - 未将用户访问发送到我的 Analytics 帐户