火花上的分布式DBSCAN

时间:2018-05-02 10:40:06

标签: apache-spark spark-graphx dbscan

我试图在Spark上实现DBSCAN算法,因此我按照文章A Parallel DBSCAN Algorithm Based on Spark进行了操作。 他们提出了一个包含4个主要步骤的算法:

  1. 数据分区
  2. 计算本地DBSCAN
  3. 合并数据分区
  4. 全球群集
  5. 所以我使用GraphX实现了第二步,伪代码是这样的:

    1. 在当前分区中选择任意点p
    2. 计算N_{e}N_{e} >= minPts标记p作为核心点,否则作为噪点。
    3. 如果p是核心点,则按c创建一个集群p,将属于集群c的所有点添加到列表中以进行递归调用。
    4. ...
    5. 这里是我的代码(我知道它不起作用):

      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)
              }
          })
      }
      

      我有多个问题:

      • 我怎样才能更改顶点的一个属性的值?我知道顶点是不可变的,但我想用NoiseCoreBorderUnclassified来标记节点。
      • 我怎样才能在分区中选择一个随机节点?因为我对map方法的问题是我必须在浏览图表的同时修改值。
      • 我怎样才能调用递归方法并修改属性值?在同一时间?

0 个答案:

没有答案