我有一个包含数千个地址的集合。如果我可以获得每个地址的经度和纬度,我如何通过接近度将该组分成组?
此外,我可能想根据不同的规则重试'群集':
答案 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)
如果地址均匀分布,则每个组在起始地址周围会有一种圆形形状。当起始地址靠近现有组时,问题出现了。当发生这种情况时,如果您的停止标准仅为组大小,则新组将围绕旧组进行排序,甚至可以完全圈出它。如果使用最大距离约束,则不会发生这种情况(假设没有其他约束)。
我真的不知道这是不是一个很好的方法,但这是我尝试的。我确信需要进行大量优化。特别是边缘地址。