我试图在Spark上实现DBSCAN算法,因此我按照文章A Parallel DBSCAN Algorithm Based on Spark进行了操作。 他们提出了一个包含4个主要步骤的算法:
所以我使用GraphX实现了第二步,伪代码是这样的:
p
N_{e}
和N_{e} >= minPts
标记p作为核心点,否则作为噪点。c
创建一个集群p
,将属于集群c
的所有点添加到列表中以进行递归调用。这里是我的代码(我知道它不起作用):
def dataPartition() : Graph[Array[String], Int] = {
graph.partitionBy(PartitionStrategy.RandomVertexCut)
}
def computingLocalDBSCAN() : Unit = {
graph = dataPartition()
//val neighbors = graph.mapVertices((id, attr) => localDBSCANMap(id, attr))
}
def localDBSCANMap(id: VertexId, attr:Array[String], cluster:Int):Unit = {
val neighbors = graph.collectNeighbors(EdgeDirection.Out).lookup(id)
if (neighbors.size >= eps) {
attr(0) = PointType.Core.toString
attr(1) = cluster.toString
} else {
attr(0) = PointType.Noise.toString
}
neighbors.foreach(it => {
for (item <- it) {
localDBSCANMap(item._1, item._2, cluster)
}
})
}
我有多个问题:
Noise
,Core
,Border
或Unclassified
来标记节点。