实际上我不知道map()的键和值应该是什么,输入格式和输出格式应该是什么。如果我通过map()一次读取一个点,那么如何使用一个点来计算邻居,因为剩余的点还没有读取。
DBSCAN不是一个令人尴尬的并行算法。
将其表示为map reduce并非易事。
您需要使用一些技巧(例如对数据进行分区,并将每个值映射到分区),或者完全重新设计算法。
并行DBSCAN上有许多文章。您可能能够在类似map reduce的框架中运行其中一些,或者至少在自定义(非map reduce)YARN引擎上运行。
查看本文:https://www.researchgate.net/publication/261212964_A_new_scalable_parallel_DBSCAN_algorithm_using_the_disjoint-set_data_structure
以下是我的解决方案,可能比论文中的解决方案更容易理解:
首先,我会计算你的距离矩阵——这可能是一个只包含那些距离的稀疏矩阵,这些距离小于DBSCANε参数——找到一种实现它的方法。
您可以将该距离矩阵映射到多个设备和簇点。您意识到,在这种情况下,并行集群会破坏输入空间,并且您在一个实例中获得一个集群id,该id可能与另一个实例的另一个id相对应。
为了弥补这一点,在减少步骤中收集所有核心点,然后检查每个核心点的每个邻居(映射,不必是O(n^2),要聪明)。如果您可以在附近找到其他核心元素,请创建一个包含2个相邻核心的2个集群ID的条目;收集这些id对(reduce)。使用这些对,导出正确的全局集群id。
上面的描述听起来可能有点抽象,但它应该给你一个想法。