一.算法介绍:
标签传播算法:基于图的半监督学习方法。
基本思路:从已标记的节点的标签信息来预测未标记的节点的标签信息。将一个节点的邻居节点的标签中数量最多的标签作为该节点自身的标签,给每个节点添加标签以代表它所属的社区,并通过标签的传播形成同一标签的社区结构。
二.传播过程:
(1)先给每个节点分配对应标签。
(2)遍历n个节点,找到对应节点邻居,获取此节点邻居标签,找到出现次数最大标签,若出现次数最多标签不止一个,则随机选择一个标签替换成此节点标签。
(3)若标签不再变化,则迭代停止,否则重复第二步。
三.neo4j算法调用:
CALL algo.labelPropagation.stream(label:String, relationship:String, {iterations:1,
weightProperty:'weight', writeProperty:'partition', concurrency:4,direction:'OUTGOING'})
YIELD nodeId, label
其中 iterations可设置迭代次数。
实例:
MERGE (nAlice:User {id:'Alice'}) SET nAlice.seed_label=52
MERGE (nBridget:User {id:'Bridget'}) SET nBridget.seed_label=21
MERGE (nCharles:User {id:'Charles'}) SET nCharles.seed_label=43
MERGE (nDoug:User {id:'Doug'}) SET nDoug.seed_label=21
MERGE (nMark:User {id:'Mark'}) SET nMark.seed_label=19
MERGE (nMichael:User {id:'Michael'}) SET nMichael.seed_label=52
MERGE (nAlice)-[:FOLLOW]->(nBridget)
MERGE (nAlice)-[:FOLLOW]->(nCharles)
MERGE (nMark)-[:FOLLOW]->(nDoug)
MERGE (nBridget)-[:FOLLOW]->(nMichael)
MERGE (nDoug)-[:FOLLOW]->(nMark)
MERGE (nMichael)-[:FOLLOW]->(nAlice)
MERGE (nAlice)-[:FOLLOW]->(nMichael)
MERGE (nBridget)-[:FOLLOW]->(nAlice)
MERGE (nMichael)-[:FOLLOW]->(nBridget)
MERGE (nCharles)-[:FOLLOW]->(nDoug);
CALL algo.labelPropagation.stream("User", "FOLLOW",{direction: "OUTGOING", iterations: 10})
yield nodeId,label
return algo.getNodeById(nodeId).id as name ,label
四.
在算法开始时,每个节点被初始化一个唯一的标签,可以使用partitionProperty参数定义节点的初始标签(标识符)。我们需要保存一组初步的标签,这些标签将作为节点的属性(必须是一个数字)运行标签传播算法。该算法首先检查是否有分配给节点的种子标签,如果有,则加载它。如果没有,它将为节点分配新的惟一标签(使用节点ID)。使用这组初步的标签(标识符),然后它顺序地将每个节点的标签更新为一个新标签。