我在6000x6000平面上有大量的2D坐标集(2116套),可在此处找到:http://pastebin.com/kiMQi7yu(上下文并不重要,所以我只是粘贴了原始数据)。 / p>
我需要编写一个算法,将一些阈值相互接近的坐标组合在一起。我列表中的坐标已经在该平面上的组中,但顺序非常分散。
尽管这个任务起初对我来说相当困难,但我并没有立即承认失败;这就是我的尝试:
首先按Y值对列表进行排序,然后按X值对其进行排序。运行列表检查当前集与前一集之间的距离。如果它们足够接近(100个单位),则将它们添加到同一组中。
这种方法并没有真正解决(正如我预期的那样)。还有一些非常接近的对象存在于不同的组中,因为我只比较列表中的下一个集合,而列表按X位置排序。
我没有想法!我使用的语言是C,但我认为这并不是真正相关的,因为我所需要的只是算法应该如何工作的想法。谢谢!
答案 0 :(得分:2)
虽然我没有看过数据集,但似乎你已经知道有多少组。你考虑过使用k的意思吗? http://en.m.wikipedia.org/wiki/K-means_clustering
答案 1 :(得分:2)
我在写作的时候就是这么想的。
稍后添加:关于3.,通过查看包围该段的矩形,可以粗略但快速地(!)确定要为一个邻居调查的点集。 [加完]
这只是一个想法 - 我不能声称我曾做过这样的远程事情。
答案 2 :(得分:1)
一种简单的常用于空间分组点的方法是计算每对唯一点之间的距离。如果距离未超过某个预定义的限制,则这些点属于同一组。
考虑这种算法的一种方法是将每个点视为极限直径球(由软泡沫制成,以便球可以相互交叉)。所有接触的球都属于同一组。
实际上,你计算平方距离,(x 2 - x 1 ) 2 +(y 2 - y 1 ) 2 ,以避免相对较慢的平方根操作。 (请记住也要限制极限。)
要跟踪每个点所属的组,请使用disjoint-set data structure。
如果你有很多点(几千个不很多),你可以使用分区或其他方法来限制要考虑的对数。分区可能是最常用的,因为它实现起来非常简单:只需将空间划分为极限大小的方块,然后您只需要考虑每个方块内的点以及相邻方块中的点之间的点。
我写了一个小的awk脚本来查找组(没有分区,大约84行或awk代码,也从1开始连续编号组,并输出每个输入点,组号和每个点的数量)组)。以下是总结的结果:
Limit Singles Pairs Triplets Clusters (of four or more points)
1.0 1313 290 29 24
2.0 1062 234 50 52
3.0 904 179 53 75
4.0 767 174 55 81
5.0 638 173 52 84
10.0 272 99 41 99
20.0 66 20 8 68
50.0 21 11 3 39
100.0 13 6 2 29
200.0 6 5 0 23
300.0 3 1 0 20
400.0 1 0 0 18
500.0 0 0 0 15
其中,Limit是认为这些点属于同一组的最大距离。
如果数据集非常详细,您可以交织但分开的组。您可以轻松地在圆环状组(或3D空心球)的孔中设置一个单独的组。这一点非常重要,因此您不必对 这些组的分离做出错误的假设。
有问题吗?
答案 3 :(得分:0)
你可以使用空间填充曲线,即a曲线a.k.a morton曲线。基本上你将x和y值转换为二进制,然后连接th,e坐标。空间索引将紧密坐标放在一起。您可以使用上限和最重要的位来验证它。