8

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

4

2 回答 2

6

维基百科只是做了一个与现实生活无关的极端简化。层次聚类并不能避免聚类数量的问题。简单地说——它构建了跨越所有样本的树,它显示了哪些样本(后来的集群)合并在一起以创建一个更大的集群。这会递归地发生,直到您只有两个集群(这就是默认集群数为 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_]
于 2015-08-26T10:11:22.720 回答
0

ELKI(不是 scikit-learn,而是 Java)有许多从层次聚类中提取聚类的高级方法。它们比仅仅在特定高度切割树更聪明,但它们可以生成最小大小的集群层次结构,例如。

您可以检查这些方法是否适合您。

于 2015-08-26T13:15:01.133 回答