集群基于距离

时间:2013-08-04 18:18:35

标签: cluster-analysis hierarchical-clustering

这是我的问题:我有一份村庄清单。对于每个村庄,我计算了它们之间的路径距离并准备了距离矩阵。现在我想确定彼此接近的村庄群。

我使用Python 2.7并且我已经使用层次聚类(由scypy提供)来聚类距离矩阵。通过将其视为人类,我可以识别最近的村庄,但我需要自动化它。我需要获取属于每个集群的元素。

1 个答案:

答案 0 :(得分:0)

我还想知道一旦创建并切割了树状图,如何检索群集。由于此问题尚未得到解答,并且可能会向其他人提出类似的问题,因此我将根据自己的需求进行回答,并作一些假设,因为这是一个古老的问题。

第一步是您需要确定在哪里切割树状图。您可以通过多种方式执行此操作,但是我假设您已经知道如何执行此操作,因为您正在查看树状图,并且似乎对自己已对数据进行聚类感到满意。如果您不知道在哪里切割,则可以从简单的操作开始,例如在最大距离处切割。但实际上,在哪里进行裁切是一个不同的,非常漫长的讨论,我认为您已经弄清楚了该怎么做(因为我在搜索时已经这样做了)。

现在,我假设您有一个树状图,并且您知道该在何处切割,甚至您甚至可以使用切割线对其进行绘制。但是您想对聚类做更多的事情,因此您需要标记聚类的点。可以使用scipy中的扁平簇(fcluster())函数来完成。

from scipy.cluster.hierarchy import fcluster

clusters=fcluster(Z,distance,criterion='distance')
print(clusters)

Z是分层链接矩阵(来自scipy的linkage()函数),我假设您已经创建了它。 distance是切割树状图的距离(但是还有其他方法可以切割树状图,有关如何使用fcluster进行切割,请参见source)。

这将返回一个numpy数组,该数组表示哪个观察值位于哪个群集中。现在,您可以将其作为新列添加到数据中,并随即转到城镇(或村庄)。