【问题标题】:Spacial clustering algorithm空间聚类算法
【发布时间】:2019-03-07 15:48:56
【问题描述】:

给定 2D 平面上的点集合,我想找到彼此位于 Y 内的 X 点的集合。例如:

8|
7|    a     b
6|
5|       c
4|
3|                    e
2|                  d          
1|
-------------------------
  1 2 3 4 5 6 7 8 9 0 1

abcd 是二维平面上的点。给定点数参数 3 (X) 和距离参数 3 (Y),算法将返回 [[a, b, c]]。一些例子:

algorithm(X = 3, Y = 3) returns [[a, b, c]]
algorithm(X = 2, Y = 3) returns [[a, b, c], [d, e]] -- [a, b, c] contains at least two points
algorithm(X = 4, Y = 3) returns [] -- no group of 4 points close enough
algorithm(X = 5, Y = 15) returns [[a, b, c, d, e]]

约束:

  • x 和 y 轴(上面的数字)都是 10,000 个单位长
  • 图表上有 800 个点(a、b、c、d 等)
  • 我认为这不重要,但我使用的是 JavaScript

我尝试过的事情:

  • 我实际上关心输出接近多个输入点的新点,因此我尝试在网格上迭代并使用毕达哥拉斯“环顾四周”以找到给定距离之外的每个点。考虑到总面积,这太慢了。 See the source here。 您还可以在real data test 中查看数据大小。
  • DBSCAN,这似乎有不同的目的 - 我知道我希望我的集群大小有多大。
  • 我是currently 试图相互比较点并建立紧密的配对,然后关闭三元组等,直到最后,但这似乎也有点低效。我将继续尝试某种散列或字典来避免这些循环。

【问题讨论】:

  • 顺便说一句,这不是家庭作业——我要带着两个孩子搬家,让他们上学是一场噩梦,等候名单是根据直线距离计算的。
  • 你可以把它变成一个图形问题。创建一个完整的图,其中边的权重是距离。现在为每个节点检查所有n - 1 相邻边的权重,并查看其中X 的权重是否小于或等于Y。第一次构建它会是O(N^2),但之后所有查询都只会是O(N)
  • @MitchelPaulin 谢谢。感觉这就是我第二次尝试的方向,但我不确定。你能指点我一个教程或一些搜索词吗?我以前从来没有做过这样的事情。
  • 我想你会想从查看图形数据结构开始tutorialspoint.com/data_structures_algorithms/…
  • "algorithm(X = 2, Y = 3) 返回 [[a, b, c], [d, e]]" 虽然第一个集合有 3 个点,而不是 2 个。

标签: algorithm cluster-analysis


【解决方案1】:

只有 800 个点,您可能只需通过比较每一对来构建图表,然后运行 ​​Bron--Kerbosch 以查找最大派系。这是该算法的看似合法的 Javascript 实现:https://github.com/SeregPie/almete.BronKerbosch

【讨论】:

  • 这很有希望,谢谢。当我看到它在我的约束条件下执行时,我会标记为已接受。
  • @sennett 如果速度不够快,您可以尝试将图形转换为其 k=X-1 核心(迭代删除度数小于 X-1 的顶点;参见 en.wikipedia.org/wiki/Degeneracy_(graph_theory)
  • 足够快。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 2013-11-26
  • 2018-07-24
  • 2011-03-29
  • 2020-02-14
  • 2022-01-03
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多