2013-07-12 25 views
3

所以我使用与SciPy快速群集做凝聚聚类。我可以通过dendrogram来获得聚类的树形图。我可以使用fcluster(Z, sqrt(D.max()), 'distance')为我的数据获得相当好的群集。如果我想手动检查树状图中k = 3(簇)的区域,然后我想检查k = 6(簇),该怎么办?如何在树状图的特定级别获得聚类?随着SciPy我如何获得k =聚类?与做层次聚类

我看到所有这些功能的容差,但我不知道如何从宽容转换为数量的集群。我可以通过链接(Z)并逐步将群集拼合在一起,使用简单的数据集手动构建群集,但这对于大型数据集不适用。

回答

7

如果你想砍倒在特定的水平,然后使用:

fl = fcluster(cl,numclust,criterion='maxclust') 

其中cl是您的联系方法和numclust的输出是你想要得到的簇的数目。

+0

在fcluster的描述中引发我的是“并且不超过t个扁平集群被形成”。那么有没有这样的情况,当你得到少于'numclust',如果是的话,他们会是什么?我知道,我错综复杂的方式不会让我少于我想要的数量。 – demongolem

+0

@demongolem:即使您的算法返回的群集数量少于您的要求,例如您有2个数据点并且要求3个群集,也总是可以的。我已经广泛使用了'fcluster',并且我不知道在正常情况下例程返回的簇较少的情况。 – dkar

+0

确实,没有足够的分数会阻止你的请求被实现,无论如何。我会接受它作为SciPy开展业务的方式 – demongolem

0

好吧,让我提出一种方法。我不认为这是正确或最好的方式,但至少这是一个开始。

  1. 选择k我们感兴趣的是
  2. 注意联动Z有N-1列出了其中N为数据点的数量。第m个列表项将产生N-m个群集。因此,用索引k = N-m-1抓取Z中的列表。
  3. 抓住该列表中第3列的距离值
  4. 拨打fcluster将该特定距离作为容差(或者距离加上一些非常小的三角洲)。

唯一的问题是,有关系,但如果你能检测到配合已经发生,这真的不是问题。

+0

嘿@demongolem是任何方式,你可以帮助这与这种questino有点类似http://stackoverflow.com/questions/36523789/cut-dendrogram-from-hier-clustering-at-distance-height-in -scipy-and-get-cluster –