【问题标题】:Efficient algorithm to group points in clusters by distance between every two points按每两点之间的距离对集群中的点进行分组的高效算法
【发布时间】:2015-09-06 21:34:05
【问题描述】:

我正在为以下问题寻找一种有效的算法:

给定二维空间中的一组点,其中每个点由其 X 和 Y 坐标定义。需要将这组点分成一组簇,这样如果两个任意点之间的距离小于某个阈值,这些点必须属于同一个簇:

换句话说,这样的集群是一组彼此“足够接近”的点。

朴素算法可能如下所示:

  1. R 为结果簇列表,初始为空
  2. P 为点列表,最初包含所有点
  3. P 中选择随机点并创建一个仅包含该点的集群 C。从 P 中删除这一点
  4. 对于来自 P 的每个点 Pi 4a。对于 C 的每一点 Pc 4aa。如果 distance(Pi, Pc) 则将 Pi 添加到 C 并将其从 P 中删除
  5. 如果在第 4 步中至少有一个点被添加到集群 C,请转到第 4 步
  6. 将集群 C 添加到列表 R。如果 P 不为空,则转到步骤 3

然而,幼稚的方法是非常低效的。我想知道是否有更好的算法来解决这个问题?

附注我不知道先验的簇数

【问题讨论】:

  • 如果你计算一个矩阵,其中 [x][y] 位置是点 x 和点 y 之间的距离。然后,对其进行迭代,如果距离小于阈值,则将该位置标记为 1,否则标记为 0。现在我们有一个图表,我们可以使用 DFS 或 BFS 来查找所有集群。它可能效率不高,但可以将其简化为更容易的问题
  • 无论您选择哪种方法,请确保将距离平方 (x2 - x1)^2 + (y2 - y1)^2 与阈值平方进行比较,以避免计算平方根。
  • 并考虑将点存储在空间分区树中。
  • 听起来像是 linear discriminant analysis 的工作?

标签: algorithm machine-learning cluster-analysis data-mining


【解决方案1】:

这里有一些经典算法:

  • 分层凝聚聚类
  • DBSCAN

你应该阅读和理解。

【讨论】:

    【解决方案2】:
    1. 将点空间分割成一个网格。该网格的单位长度等于 threshhold / sqrt(8)

    2. 遍历点列表P,将每个点添加到它所在的方格和一个新簇中。如果将一个点添加到已经包含一个点的正方形中,则将其添加到其他点的集群中。我将调用所有已占用方的列表S

    3. 现在从 S 及其簇 c 中取任意正方形。对于每个相邻或对角的正方形,将该正方形的簇与 c 组合并从 S 中删除该正方形。对刚刚添加的所有方块重复此过程。

    4. 一旦找不到更多的相邻方,集群就完成了,可以添加到C。对 S 中剩余的所有方块重复第 3 步。当 S 为空时,您就完成了。

    【讨论】:

    • 这是不对的。网格可以帮助找到某个距离阈值内的点的候选点,但它不能代替显式检查:任何网格大小要么足够小,以至于两个点可以比阈值更近而不在相邻/对角正方形中,或者足够大两个点可以在相邻/对角正方形中而不接近阈值,或两者兼而有之。 (你的有前一个问题。)
    • 另外,对我来说,这比 OP 的策略更快并不明显,因为“组合”两个集群的复杂性并不明显。 BFS 或 DFS 在占用的正方形上可能更有意义。
    • @ruakh 这显然不是最优的,但我认为它会比 OP 的解决方案更快,因为它不需要针对所有非聚集点检查每个点。然而,我确实忽略了第一个问题。感谢 cmets
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2011-04-23
    相关资源
    最近更新 更多