如何按近距离对一组中的对象进行分组?

时间:2009-01-26 16:10:24

标签: algorithm cluster-analysis machine-learning

我有一个包含数千个地址的集合。如果我可以获得每个地址的经度和纬度,我如何通过接近度将该组分成组?

此外,我可能想根据不同的规则重试'群集':

  • N组
  • 每组M个地址
  • 组中任何地址之间的最大距离

5 个答案:

答案 0 :(得分:10)

您可以尝试k-means clustering算法。

答案 1 :(得分:5)

你想要矢量量化:

http://en.wikipedia.org/wiki/Vector_quantization

它的工作原理是将一大组点(向量)划分为最接近它们的点数大致相同的组。每个组由其质心点表示,如k-means和其他一些聚类算法。

这里的向量是每个地址的地理坐标,您可以根据您的约束(邻近度,组大小,组数......)为您的算法提供其他参数。

你可以从k-means开始,但根据我的经验,基于Voronoi的算法更灵活。一个很好的介绍here

答案 2 :(得分:2)

这取决于您想要聚类的数据的规模。蛮力方法是计算所有点组合之间的距离到距离阵列。得到的数组是N ^ 2,因为从A到B的距离与B到A相同,所以只需要一半,所以得到的集合是N ^ 2/2。

对于相对较近的纬度坐标,有时可以使用lat long作为x,y网格并计算笛卡尔距离。由于现实世界不平坦,笛卡尔距离将有误差。如果您的地址位于全国各地,则应使用更精确的计算方法,请参阅this link from Mathforum.com

如果您没有处理整个距离矩阵的比例,则需要进行一些算法编程以提高效率。

答案 3 :(得分:1)

“N组”和“每组M个地址”约束是互斥的。一个意味着另一个。

答案 4 :(得分:1)

  1. 建立所有地址之间的距离矩阵。
  2. 从随机地址开始,按照到该地址的距离递增对矩阵进行排序
  3. 随着时间的推移从矩阵中删除地址,将最接近起始地址的地址放入新的组中,直到达到您的条件(组大小或最大距离)。
  4. 一旦群组已满,请选择另一个随机地址,并按矩阵距该地址求助
  5. 继续这样,直到从矩阵中取出所有地址。
  6. 如果地址均匀分布,则每个组在起始地址周围会有一种圆形形状。当起始地址靠近现有组时,问题出现了。当发生这种情况时,如果您的停止标准仅为组大小,则新组将围绕旧组进行排序,甚至可以完全圈出它。如果使用最大距离约束,则不会发生这种情况(假设没有其他约束)。

    我真的不知道这是不是一个很好的方法,但这是我尝试的。我确信需要进行大量优化。特别是边缘地址。