【问题标题】:How do I group objects in a set by proximity?如何按邻近度对集合中的对象进行分组?
【发布时间】:2010-10-03 13:53:39
【问题描述】:

我有一个包含数千个地址的集合。如果我能得到每个地址的经度和纬度,我如何按距离将集合分组?

此外,我可能想根据不同的规则重试“聚类”:

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

【问题讨论】:

    标签: algorithm cluster-analysis machine-learning


    【解决方案1】:

    你想要矢量量化:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这在一定程度上取决于您要集群的数据规模。蛮力方法是将所有点组合之间的距离计算成一个距离数组。结果数组为 N^2,由于 A 到 B 的距离与 B 到 A 的距离相同,因此您只需要其中一半,因此结果集为 N^2/2。

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

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

      【讨论】:

      • 格里夫斯先生以同样的答案击败了我。这就是我在开始回答之后去锻炼然后在我回来时完成答案的结果!
      • 您描述了将所有相对距离计算为 N^2/2 半矩阵的第一个技术阶段。但考虑到这一点 - 你如何组成小组?
      【解决方案3】:
      1. 构建所有地址之间的距离矩阵。
      2. 从一个随机地址开始,按到该地址的距离升序对矩阵进行排序
      3. 边走边从矩阵中删除地址,将最接近起始地址的地址放入一个新组中,直到达到您的标准(组大小或最大距离)。
      4. 一旦组已满,请选择另一个随机地址,并根据与该地址的距离来使用矩阵
      5. 这样继续,直到所有地址都从矩阵中取出。

      如果地址分布均匀,每个组的起始地址周围都会有一种圆形。当起始地址靠近现有组时,问题就出现了。发生这种情况时,如果您的停止标准只是组大小,新组将围绕旧组,甚至可以完全环绕它。如果您使用最大距离约束,则不会发生这种情况(假设没有其他约束)。

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

      【讨论】:

        【解决方案4】:

        你可以试试k-means clustering算法。

        【讨论】:

          【解决方案5】:

          “N 个组”和“每组 M 个地址”约束是互斥的。一个暗示另一个。

          【讨论】:

          • 你不能有N个组,每个组中的地址数量不同吗?
          • 但这不是一个约束。这将是算法的结果。
          • 哪个不是约束?无论如何,如果我说每个组必须有 M 个地址,那么我最终可能会得到已知的 N 个组。但是,如果我指定必须有 N 个组,则每个组的 M 个地址可能会或可能不会是结果。
          猜你喜欢
          • 2014-03-15
          • 2018-09-17
          • 2021-11-25
          • 2023-02-05
          • 1970-01-01
          • 2011-03-14
          • 2014-01-22
          • 2018-05-01
          • 1970-01-01
          相关资源
          最近更新 更多