run[VD, ED: ClassTag](graph: Graph[VD, ED], maxSteps: Int): Graph[VertexId, ED]
参数名称 |
参数含义 |
取值类型 |
备注 |
---|---|---|---|
graph |
从文件读入后的graph数据 |
Graph[VD,ED] |
VD表示顶点属性开源接口中用于占位,非泛型;ED表示边属性,为泛型。 |
maxSteps |
算法的迭代次数(通常设为10次) |
Int |
maxSteps必须大于0。 |
使用lpa算法内置runConvergence分支,该分支在震荡图模型上可保证收敛,用户可以通过spark参数的传入进行调用,当spark.boostkit.graph.lpa.convergence设置为true时,算法将会调用到该分支(算法内部默认该参数为false,当不传入该参数或设置该参数为false时,按maxSteps迭代进行)。
举例如下:
--conf "spark.boostkit.graph.lpa.convergence=true"
spark.boostkit.graph.lpa.PreIter为算法runConvergence分支内置参数,用户可以通过spark参数的传入进行调用,此参数为设置lpa算法的预迭代次数。原则上,对于震荡图预迭代次数越大,lpa初始迭代越充分,算法后续流程更容易收敛,但是过多的预迭代次数会对性能有一定影响。绝大多数场景我们建议使用算法内部默认值:20,既满足迭代的充分,又兼顾的整体性能(数据集非常大,可以适当调大)。
使用如下:
--conf "spark.boostkit.graph.lpa.PreIter=20"
返回值名称 |
返回值含义 |
返回值类型 |
备注 |
---|---|---|---|
Graph[VertexId,ED] |
返回图结构数据 |
Graph[VertexId,ED] |
划分到相同社区的定点属性会用类型Long的同一个整数进行标记。即为社区编码,该编号取值不保证连续。 |
val edgesRDD = sc.parallelize(Array((1, 2), (2,3),(3,4),(4,1),(2,4),(1,3),(4,9),(9,7),(5,7),(5,8),(8,6),(6,7),(7,8),(5,6))) val iterNum = 10 val graph = Graph.fromEdgeTuples(edgesRDD.map(f=>(f._1.toLong, f._2.toLong)), 0) val nodesInfo = LabelPropagation.run(graph, iterNum).vertices.sortByKey().collect().foreach(println)
第一列为节点ID,第二列为该节点对应社区。
因为LPA算法属于启发式算法,所以开源结果与自研算法结果往往会有不一致的情况。通常,我们是通过计算模块度的大小来判断自研算法与开源算法的准确度以及社区划分的效果。
1,1 2,1 3,1 4,1 5,5 6,5 7,5 8,5 9,5