dbscan

1szpjjfi  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(322)

实际上我不知道map()的键和值应该是什么,输入格式和输出格式应该是什么。如果我通过map()一次读取一个点,那么如何使用一个点计算邻居,因为剩余的点还没有读取。

vzgqcmou

vzgqcmou1#

dbscan并不是一个令人尴尬的并行算法。
将其表示为map reduce并不是一件小事。
您需要采用一些技巧(比如对数据进行分区,并将每个值Map到分区),或者完全重新设计算法。
有许多关于并行dbscan的文章。您很可能能够在类似map-reduce的框架中运行其中一些,或者至少可以在定制(非map-reduce)的yarn引擎上运行。

6uxekuva

6uxekuva2#

看看这篇论文:https://www.researchgate.net/publication/261212964_a_new_scalable_parallel_dbscan_algorithm_using_the_disjoint-set_data_structure
以下是我的解决方案,可能比论文中的解决方案更容易理解:
首先,我要计算距离矩阵-可以是一个稀疏矩阵,只包含那些距离,小于dbscan epsilon参数-找到一种方法来实现它。
您可以将该距离矩阵Map到多个设备和群集点。您意识到,在这种情况下,并行化集群会破坏输入空间,并在一个示例中获得一个集群id,该id可能对应于另一个示例中的另一个id。
要解决这个问题,在reduce步骤中收集所有核心点,然后检查每个核心点的每个邻居(map,不必是o(n^2),要聪明点)。如果你能找到其他的核心元素,创建一个2个相邻核心的集群id的条目;收集这些id对(减少)。使用这些对,导出正确的全局集群id。
上面的描述听起来可能有点抽象,但它应该给你的想法。

相关问题