如何在限制点之间的最大距离和每个集群的最大点数的情况下对 lat/lng 数据进行聚类

Posted

技术标签:

【中文标题】如何在限制点之间的最大距离和每个集群的最大点数的情况下对 lat/lng 数据进行聚类【英文标题】:How to cluster lat/lng data with restrictions on max distance between points and max number of points per cluster 【发布时间】:2020-03-22 06:37:00 【问题描述】:

我有一组分布在整个城市(大约 1000 个)的纬度/经度坐标。我想按照一些严格的规则用这些数据创建集群:

    任何集群中的数据点不得超过 X 个(可能有 8 个,但这可能会改变) 任何集群都不能包含两个数据点,它们之间的距离超过 Xkm(可能是 1km,但这也可以改变) 可以有一个单点的集群 无需创建特定数量的集群

我已经尝试使用来自 sklearn 的 AgglomerativeClustering 执行此操作,使用以下代码:

from sklearn.cluster import AgglomerativeClustering

cluster = AgglomerativeClustering(n_clusters=None, affinity='euclidean', linkage='complete', distance_threshold=0.01)
cluster.fit_predict(arr)

这里的问题是我没有满足上面的第 1,2 或 3 项,只有第 4 项。

我想要一个聚类算法,我可以在其中设置这些参数并让它运行最有效的聚类(即:尊重所有项目 1、2、3 和 4 的最少聚类数) .

有什么方法可以使用 sklearn 或任何其他导入的聚类算法来完成,还是必须手动构建?

谢谢!

【问题讨论】:

【参考方案1】:

自己写。

一种简单的方法是使用凝聚聚类(真正的聚类,例如,来自 scipy;sklearn 版本太有限)来获取 完整的合并历史以实现完整的链接时间>。如果满足您的两个要求,则开始自下而上处理合并:链接是最大距离,如果集群变得太大,则停止合并。

但请注意,结果会非常不平衡。我的猜测是,您希望尽可能少的集群以最大半径和占用率覆盖您的数据。那么你的问题可能更接近于set cover。在此类问题上找到最佳结果通常是 NP 困难的,因此您必须接受使用近似值。我会采用贪婪策略,然后通过本地搜索进行迭代细化。

【讨论】:

以上是关于如何在限制点之间的最大距离和每个集群的最大点数的情况下对 lat/lng 数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

具有最大集群大小的集群

最强解析面试题:二叉树两节点最大距离

基于度量/密度的聚类/分组

二叉树上节点间的最大距离

二分图最大匹配

CF516D