Algorithm 三维聚类算法

Algorithm 三维聚类算法,algorithm,3d,cluster-analysis,spatial,data-partitioning,Algorithm,3d,Cluster Analysis,Spatial,Data Partitioning,问题陈述: 我有以下问题: 3D空间中有超过十亿个点。目标是找到在给定距离R内邻域数最多的前N个点。另一个条件是这些前N个点的任意两点之间的距离必须大于R。这些点的分布不均匀。空间的某些区域包含许多点是很常见的 目标: 寻找一种能够很好地扩展到多个处理器且内存需求小的算法 想法: 由于非均匀分布,正态空间分解不足以解决这类问题。均匀划分点数的不规则空间分解可能有助于解决这个问题。如果有人能告诉我如何解决这个问题,我将不胜感激。我没有一个明确的答案给你,但我有一个可能产生解决方案的方法的建议 我认

问题陈述: 我有以下问题:

3D空间中有超过十亿个点。目标是找到在给定距离R内邻域数最多的前N个点。另一个条件是这些前N个点的任意两点之间的距离必须大于R。这些点的分布不均匀。空间的某些区域包含许多点是很常见的

目标: 寻找一种能够很好地扩展到多个处理器且内存需求小的算法

想法:
由于非均匀分布,正态空间分解不足以解决这类问题。均匀划分点数的不规则空间分解可能有助于解决这个问题。如果有人能告诉我如何解决这个问题,我将不胜感激。

我没有一个明确的答案给你,但我有一个可能产生解决方案的方法的建议

我认为这是值得调查的。我认为平均划分点,然后将这种LSH应用于每个集合应该是容易并行的。如果设计散列算法,以便根据
R
定义存储桶大小,则对于划分为存储桶的给定点集,满足条件的点很可能存在于最满的存储桶中

在本地执行此操作后,也许您可以应用某种map reduce样式的策略,以逐步的方式组合LSH算法不同并行运行的空间存储桶,利用这样一个事实,即您可以开始通过忽略整个存储桶来排除部分问题空间。显然,您必须小心跨越不同存储桶的边缘情况,但我怀疑在合并的每个阶段,您可以应用不同的存储桶大小/偏移,以消除这种影响(例如,执行合并空间等效存储桶以及相邻存储桶)。我相信这种方法可以用来保持较小的内存需求(即,在任何给定时刻,您不需要存储比点本身多得多的内存,并且您总是在较小(ish)子集上操作)

如果你在寻找某种启发式方法,那么我认为这个结果会立即产生类似于“好”解决方案的结果-即,它会给你一些可能的点,你可以检查这些点是否满足你的标准。如果您正在寻找准确的答案,那么在开始合并并行bucket时,您必须应用一些其他方法来修剪搜索空间


我的另一个想法是,这可能与找到目标有关。这肯定不是一个完全相同的问题,但也许在解决这个问题时使用的一些方法在这种情况下是适用的。问题是,这假设您有一个可以计算距离度量的模型-但是,在您的情况下,十亿个点的存在使得执行任何类型的全局遍历(例如,点之间距离的排序)都是不可取和困难的。正如我所说,这只是一个想法,也许是进一步灵感的来源。

以下是解决方案的一些可能部分。 每个阶段都有不同的选择, 这将取决于Ncluster,取决于数据变化的速度, 以及你想用这些手段做什么

3个步骤:量化、方框、K-均值

1) 量化:将输入XYZ坐标减少到每个8位, 分别取X,Y,Z的2^8个百分位数。 这将加快整个流程,而不会丢失太多细节。 您可以对所有1G点进行排序,也可以随机对1M点进行排序, 要获得8位x08位X,展开的二进制搜索速度很快- 见本特利,珍珠p。九十五

增加: 将任意点云拆分为不同大小的框,每个框都有~Leafsize点- 比上面分割X Y Z好得多。 但是,你必须使用自己的Kd树代码 只拆分第一批(比如16M个盒子),只保留计数,不保留点数

2) 框:计算每个三维框中的点数, [xj..xj+1,yj..yj+1,zj..zj+1]。 平均框将有2^(30-3*8)个点; 分布将取决于数据的密集程度。 如果一些盒子太大或得分太多,你可以 a) 把他们分成8个, b) 跟踪每个框中各点的中心, 其他宽度仅取方框中点

(三) 在2^(3*8)个盒子中心。 (谷歌平行搜索“k”的意思是“->121k次点击。) 这很大程度上取决于K,也取决于半径R。 一个粗略的方法是增加一个 在点数最多的27*n聚类框中, 然后根据半径限制选择最大的。 (我想从一个 , 然后删除K-1最长的链接以获得K个簇。) 另见

我要把Nbit,这里是8,从一开始就是一个参数

你的分类是什么

补充:如果您的点在时间上移动,请参阅
就这样。

只是个想法。当距离 这种图形的创建类似于空间分解。您的问题可以通过图中的本地搜索得到答案。首先是具有最大度的顶点,其次是寻找最大度顶点的最大不连通集


我认为图形的创建和搜索可以并行进行。这种方法可能需要大量内存。拆分域并使用较小卷的图形可以减少内存需求。

使用八叉树。对于具有有限值域的三维数据,可以很好地扩展到大型数据集

前面提到的许多方法(如局部敏感哈希)都是为更高维度设计的近似版本,在这些维度中,您无法再进行合理的拆分

将每一层分成8个箱子(d=3时为2^d)效果非常好。自从你