使用 scikit 选择层次凝聚聚类中的聚类数
Posted
技术标签:
【中文标题】使用 scikit 选择层次凝聚聚类中的聚类数【英文标题】:Choosing the number of clusters in heirarchical agglomerative clustering with scikit 【发布时间】:2015-11-20 06:08:49 【问题描述】:determining the number of clusters in a dataset 上的***文章指出,我在使用层次聚类时不需要担心这样的问题。但是,当我尝试使用 scikit-learn 的 agglomerative clustering 时,我发现我必须将集群的数量作为参数“n_clusters”提供给它——没有它我会得到两个集群的硬编码默认值。在这种情况下,我该如何为数据集选择正确数量的集群?维基文章有错吗?
【问题讨论】:
好问题。当我遇到类似问题时,我最终使用 scipy 例程进行层次聚类,可视化树,然后“手动”(在查看树之后)设置切割阈值。 似乎与github.com/scikit-learn/scikit-learn/issues/3796有关 【参考方案1】:***只是做了一个与现实生活无关的极端简化。层次聚类并不能避免聚类数量的问题。简单地说 - 它构建了跨越 所有样本 的树,它显示了哪些样本(稍后 - 集群)合并在一起以创建更大的集群。这会递归地发生,直到您只有两个集群(这就是默认集群数为 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_]
【讨论】:
【参考方案2】:ELKI(不是 scikit-learn,而是 Java)有许多从层次聚类中提取聚类的高级方法。它们比仅仅在特定高度切割树更聪明,但它们可以生成最小大小的集群层次结构。
您可以检查这些方法是否适合您。
【讨论】:
以上是关于使用 scikit 选择层次凝聚聚类中的聚类数的主要内容,如果未能解决你的问题,请参考以下文章