用scikit选择层次凝聚聚类中的聚类数

DaT*_*omB 6 artificial-intelligence cluster-analysis machine-learning unsupervised-learning scikit-learn

关于确定数据集中群集数量的维基百科文章表明,在使用层次聚类时,我不需要担心这样的问题.然而,当我尝试使用scikit-learn的 凝聚聚类时,我发现我必须将聚类的数量作为参数"n_clusters"提供 - 没有它我得到两个聚类的硬编码默认值.在这种情况下,如何为数据集选择正确数量的聚类?维基文章错了吗?

lej*_*lot 5

维基百科只是在进行极端简化,与现实生活无关。分层聚类无法避免聚类数量的问题。简单地-它构建了覆盖所有样本的树,该树显示了哪些样本(后来的群集)合并在一起以创建更大的群集。递归地进行,直到只有两个聚类(这就是为什么聚类的默认数量为2)被合并到整个数据集的原因。您会被“砍掉”整个树,以得到实际的聚类。一旦适合了AgglomerativeClustering,您就可以遍历整棵树并分析要保留的集群

import numpy as np
from sklearn.cluster import AgglomerativeClustering
import itertools

X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100])
clustering = AgglomerativeClustering()
clustering.fit(X)

[{'node_id': next(itertools.count(X.shape[0])), 'left': x[0], 'right':x[1]} for x in clustering.children_]
Run Code Online (Sandbox Code Playgroud)