这是我的问题:我有一个村庄列表。对于每个村庄,我计算了它们之间的路径距离并准备了一个距离矩阵。现在我想确定彼此靠近的村庄集群。
我使用 Python 2.7,并且我已经使用了层次聚类(由 scypy 提供)来聚类距离矩阵。通过将其视为人类,我可以识别最近的村庄,但我需要将其自动化。我需要获取属于每个集群的元素。
这是我的问题:我有一个村庄列表。对于每个村庄,我计算了它们之间的路径距离并准备了一个距离矩阵。现在我想确定彼此靠近的村庄集群。
我使用 Python 2.7,并且我已经使用了层次聚类(由 scypy 提供)来聚类距离矩阵。通过将其视为人类,我可以识别最近的村庄,但我需要将其自动化。我需要获取属于每个集群的元素。
我还想知道如何在创建并切割树状图后检索集群。由于这是没有答案的,并且可能会为其他有类似问题的人提出,我将根据我正在寻找的内容进行回答,并做出一些假设,因为这是一个老问题。
第一步是您需要确定在何处切割树状图。您可以通过多种方式执行此操作,但我假设您已经知道如何执行此操作,因为您正在查看树状图并且似乎对您已对数据进行聚类感到满意。如果你不知道在哪里切割,你可以从一些简单的东西开始,比如在最大距离处切割。但实际上,在哪里切割是一个不同的、很长的讨论,我假设你已经弄清楚了如何去做(因为我在搜索的这一点上已经这样做了)。
现在我假设你有一个树状图,并且你知道在哪里切割它,也许你甚至用切割线绘制它。但是你想对集群做更多的事情,所以你需要标记你集群的点。这可以使用fcluster()
scipy 中的 flat cluster ( ) 函数来完成。
from scipy.cluster.hierarchy import fcluster
clusters=fcluster(Z,distance,criterion='distance')
print(clusters)
linkage()
Z 是我假设您已经创建的分层链接矩阵(来自 scipy 的函数)。distance 是您切割树状图的距离(但还有其他方法可以切割树状图,请参阅源代码以了解如何使用 fcluster 执行此操作)。
这将返回一个 numpy 数组,表示哪个观察在哪个集群中。现在,您可以将其作为新列附加到您的数据中,然后带着它去城镇(或村庄)。