【发布时间】:2010-10-03 13:53:39
【问题描述】:
我有一个包含数千个地址的集合。如果我能得到每个地址的经度和纬度,我如何按距离将集合分组?
此外,我可能想根据不同的规则重试“聚类”:
- N 组
- 每组 M 个地址
- 组中任意地址之间的最大距离
【问题讨论】:
标签: algorithm cluster-analysis machine-learning
我有一个包含数千个地址的集合。如果我能得到每个地址的经度和纬度,我如何按距离将集合分组?
此外,我可能想根据不同的规则重试“聚类”:
【问题讨论】:
标签: algorithm cluster-analysis machine-learning
你想要矢量量化:
http://en.wikipedia.org/wiki/Vector_quantization
"它的工作原理是将一大组点(向量)划分为具有大致相同数量的最接近它们的点的组。每个组由其质心点表示,如 k-means 和其他一些聚类算法。"
这里的向量是每个地址的地理坐标,您可以根据您的限制(接近度、组大小、组数...)为您的算法提供其他参数。
您可以从 k-means 开始,但根据我的经验,基于 Voronoi 的算法更灵活。很好的介绍here。
【讨论】:
这在一定程度上取决于您要集群的数据规模。蛮力方法是将所有点组合之间的距离计算成一个距离数组。结果数组为 N^2,由于 A 到 B 的距离与 B 到 A 的距离相同,因此您只需要其中一半,因此结果集为 N^2/2。
对于相对接近的 lat lon 坐标,您有时可以使用 lat long 作为 x,y 网格并计算笛卡尔距离。由于现实世界不是平坦的,笛卡尔距离会有误差。如果您的地址位于全国各地,则应使用更精确的计算方法,请参阅this link from Mathforum.com。
如果您没有规模来处理整个距离矩阵,则需要进行一些算法编程以提高效率。
【讨论】:
如果地址分布均匀,每个组的起始地址周围都会有一种圆形。当起始地址靠近现有组时,问题就出现了。发生这种情况时,如果您的停止标准只是组大小,新组将围绕旧组,甚至可以完全环绕它。如果您使用最大距离约束,则不会发生这种情况(假设没有其他约束)。
我真的不知道这是否是一个好方法,但这是我会尝试的。我确信需要进行大量优化。特别是对于边缘的地址。
【讨论】:
你可以试试k-means clustering算法。
【讨论】:
“N 个组”和“每组 M 个地址”约束是互斥的。一个暗示另一个。
【讨论】: