![047551c70dc7347e77ff9dab3851604a.png](https://img-blog.csdnimg.cn/img_convert/047551c70dc7347e77ff9dab3851604a.png)
最近工作中需要使用到标签传播算法,发现spark自带的lpa算法不是很贴合业务场景,改了一下在这里做一个总结。
背景:
面向千万到亿级别的主体对象,用spark.graphx里的图网络表示。因为已经有了一部分坏样本,需要根据图网络对剩下的样本进行标记,达到查缺补漏的作用。
业务需要:
- 实际场景需要使用坏标签对已有的好标签进行标注,原算法是使用VertexId打标注;
- 实际场景中坏标签应该需要被固定,它不会被其他好标签影响,原算法不考虑固定标签;
- 实际场景边的权重需要被考虑进去,原算法中边的权重全部为1;
源代码:https://github.com/apache/spark/blob/master/graphx/src/main/scala/org/apache/spark/graphx/lib/LabelPropagation.scalagithub.com
更改后:
- 指定输入Graph[String,Double]类型,规定主体的属性为String,边的属性为Double;
- run函数增加参数keepLabel:Array[VertexId],将需要固定标签的id传进入;