Spark大数据分析-图算法,社团发现算法

社团发现算法介绍

(1)面向整体关系稠密度的三角形计数和聚类系数。
(2)用于发现连通族的强连通分量算法和连通分量算法。
(3)标签传播算法,可基于节点标签快速推断群组。
(4)Louvain模块度算法,用于研究分组的质量和层级结构。
在这里插入图片描述

数据导入

使用Neo4j导数数据,首先导入节点

WITH "https://github.com/neo4j-graph-analytics/book/raw/master/data/" AS base
WITH base + "sw-nodes.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MERGE (:Library {id: row.id})

接着导入关系

WITH "https://github.com/neo4j-graph-analytics/book/raw/master/data/" AS base
WITH base + "sw-relationships.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MATCH (source:Library {id: row.src})
MATCH (destination:Library {id: row.dst})
MERGE (source)-[:DEPENDS_ON]->(destination)

三角形计数和聚类系数

三角形计数算法确定了图中经过每个节点的三角形数量。三角形是由三个节点组成的集合,且每个节点与其他各节点都有关系。三角形计数算法也可以全局运行,用于评估整个数据集。
聚类系数的目标是比较群组的聚合紧密程度与其能够达到的聚合紧密程度。该算法在计算过程中用到了三角形计数算法,它提供现有三角形数与可能关系数的比值。最大值1表示团的每个节点都可以连接到该团的其他节点。聚类系数有两类:局部聚类系数和全局聚类系数。

局部聚类系数

在这里插入图片描述
将通过该节点的三角形数乘2,该群组的最大关系数减1后与最大关系数相乘,然后用前一个积除以后一个积。
在这里插入图片描述

全局聚类系数

全局的聚类系数基于triplet。全局系数=闭triplet的数量/(闭triplet的数量+开triplet的数据量)
在这里插入图片描述
如上图所示,一个闭triplet可以是{1,(2,3)},{2,(1,3)}等,开triplet则是{3,(4,5)}等

三角形计数和聚类系数的用法

需要判断群组的稳定性时,可使用三角形计数算法,也可在计算其他网络指标(如聚类系数)时使用。三角形计数算法在社交网络分析中很流行,主要用于发现社团。
聚类系数可以反映随机选定节点的连通概率。还可以用聚类系数来快速评估特定群组或整个网络的内聚力。将这两种算法结合使用可估计弹性和探查网络结构。
(1)识别垃圾网站内容时找出特征。Luca Becchetti,《Efficient Semi-Streaming Algorithms for Local Triangle Counting in Massive Graphs》
(2)研究Facebook社交图的社团结构,比如一些研究人员在一张看起来稀疏的全球社交图中发现了稠密的用户友邻关系。
(3)探测Web的主题结构,并且基于网页间的相互链接来发现网页社团的共同主题。Jean-Pierre Eckmann,Elisha Moses,《Curvature of Co-Links Uncovers Hidden Thematic Layers in the World Wide Web》

Neo4j实现三角形计数

CALL algo.triangle.stream("Library","DEPENDS_ON")
YIELD nodeA, nodeB, nodeC
RETURN algo.getNodeById(nodeA).id AS nodeA,
       algo.getNodeById(nodeB).id AS nodeB,
       algo.getNodeById(nodeC).id AS nodeC

Neo4j计算局部聚类系数

CALL algo.triangleCount.stream('Library', 'DEPENDS_ON')
YIELD nodeId, triangles, coefficient
WHERE coefficient > 0
RETURN algo.getNodeById(nodeId).id AS library, coefficient
ORDER BY coefficient DESC

强连通分量算法

在这里插入图片描述

强连通分量算法

强连通分量算法(strongly connected components algorithm,SCC algorithm)是最早的图算法之一。SCC在一个有向图中查找连通的节点集,其中每个节点都与同一集合中其他任何节点双向可达。该算法运行时,操作规模与节点数成正比。
(1)找出每个成员直接或间接拥有其他成员股份的公司集合。
(2)多跳无线网络中测量路由性能时,计算不同网络配置的连通性。Mahesh K. Marina,Samir R. Das的《Routing Performance in the Presence of Unidirectional Links in Multihop Wireless Networks》

Neo4j实现强连通分量算法

CALL algo.scc.stream("Library", "DEPENDS_ON")
YIELD nodeId, partition
RETURN partition, collect(algo.getNodeById(nodeId)) AS libraries
ORDER BY size(libraries) DESC

连通分量算法

连通分量算法(connected components algorithm,也称联盟查找算法或弱连通分量算法)可在无向图中发现连通节点集合。与强连通分量算法不同,该算法只需要节点对之间存在单向路径,而强连通分量算法需要节点对之间存在双向路径。

Neo4j实现连通分量算法

CALL algo.unionFind.stream("Library", "DEPENDS_ON")
YIELD nodeId,setId
RETURN setId, collect(algo.getNodeById(nodeId)) AS libraries
ORDER BY size(libraries) DESC

标签传播算法

标签传播算法(label propagation algorithm,LPA)是在图中查找社团的一种快速算法。
在这里插入图片描述

半监督学习和种子标签

标签传播算法可以在同一图上多次运行并返回不同的社团结构。节点的评估顺序对最终返回的社团有影响。
当某些节点被赋予初始标签(种子标签),而其他节点没有标记时,求解范围会变窄。未标记的节点更可能采用初始标签。
可将使用标签传播算法视为一种针对社团查找的半监督学习方法。半监督学习是一类机器学习任务和技术,针对少量有标记的数据和大量无标记的数据进行运算。当图发生演变时,还可以在图上重复运行算法。
此外,标签传播算法有时无法收敛于单个解。在这种情况下,社团发现的结果将在几个非常相似的社团之间持续摆荡,而且算法永远无法完成。种子标签有助于引导算法得出解。Spark和Neo4j使用一个最大迭代次数集合来避免执行过程无休止。你应该针对自己的数据来测试迭代设置,以平衡准确率和执行时间。

使用Neo4j实现标签传播算法

CALL algo.labelPropagation.stream("Library", "DEPENDS_ON",
  { iterations: 10 })
YIELD nodeId, label
RETURN label,
       collect(algo.getNodeById(nodeId).id) AS libraries
ORDER BY size(libraries) DESC

Louvain模块度算法

待定

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页