graphx-社区发现(community detection)
LPA算法(标签传播算法)
1、为所有的节点指定一个唯一的标签
2、逐轮刷新所有节点的标签,直到达到收敛要求为止,对于每一轮刷新,节点标签刷新的规则如下:
对某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点,当个数最多的标签不唯一时,随机选择一个。
目前spark-graphx实现了该社区发现算法。该算法优点就是算法原理简单,实现简便,廉价的计算;缺点就是该算法完成的社区发现存在结果震荡的问题。
SLPA算法
是一种重叠社区发现算法,其中涉及到一个重要的阈值参数r,通过r的适当选取,可将其退化为非重叠模型。
SLPA引入了Listener和Speaker两个比较形象的概念,你可以这么理解,在刷新节点标签的过程中,任意选取一个节点作为listener,则其所有邻居节点就是他的speaker了,speaker通常不止一个,一大群speaker在七嘴八舌时,listener到底该听谁的呢?我们可以通过一定的规则来解决这个问题。例如LPA中出现次数最多的标签,这也是一个规则。
SLPA最大的特点在于,它会记录每一个节点在刷新迭代过程中的历史标签序列,(例如迭代T次,则每个节点保存一个长度为T的序列)当迭代停止后,对于每一个节点历史标签序列中(互异)标签出现的频率做统计,按照某一给定的阈值过滤掉那些出现频率小的标签,
剩下即为该节点的标签了(可能会有很多个)
object LabelPropagation {
/**
* 在社交网络中用lpa发现社区
*网络中的每个节点都有一个初始的社区标识,每次节点发送自己的社区标识到自己所有的邻居节点并且更新所有节点的模态社区
* lpa是一个标准的社区发现算法,它的计算是廉价的,虽然他不能保证一定会收敛,但是它可以使用某些规则结束其迭代
*
* @tparam ED 边属性的类型
* @param graph 需要计算社区的图
* @param maxSteps 由于是静态实现,设置最大的迭代次数
* @return 返回的结果在图的点属性中包含社区的标识 */
def run[VD, ED: ClassTag](graph: Graph[VD, ED], maxSteps: Int): Graph[VertexId, ED] = {
//初始化每个定点的社区表示为当前结点的id值
val lpaGraph = graph.mapVertices { case (vid, _) => vid }
//定义消息的发送函数,将顶点的社区标识发送到相邻顶点
def sendMessage(e: EdgeTriplet[VertexId, ED]): Iterator[(VertexId, Map[VertexId, Long])] = {
Iterator((e.srcId, Map(e.dstAttr -> 1L)), (e.dstId, Map(e.srcAttr -> 1L)))
}
//顶点的消息聚合函数 将每个节点消息聚合,做累加;例如一个定点出现了两次,id->2
def mergeMessage(count1: Map[VertexId, Long], count2: Map[VertexId, Long])
: Map[VertexId, Long] = {
(count1.keySet ++ count2.keySet).map { i =>
val count1Val = count1.getOrElse(i, 0L)
val count2Val = count2.getOrElse(i, 0L)
i -> (count1Val + count2Val)
}.toMap
}
//该函数用于在完成一次迭代的时候,将第一次的结果和原图做关联
如果当前结点的message为空,则将该节点的社区标识设置为当前结点的id,如果不为空,在根据其他节点在出现的次数求最大值,(可以把他看成是一种规则,slpa是基于重叠社区的发现,slpa则使用出现次数的阈值等规则)
def vertexProgram(vid: VertexId, attr: Long, message: Map[VertexId, Long]): VertexId = {
if (message.isEmpty) attr else message.maxBy(_._2)._1
}
val initialMessage = MapVertexId, Long
Pregel(lpaGraph, initialMessage, maxIterations = maxSteps)(
vprog = vertexProgram,
sendMsg = sendMessage,
mergeMsg = mergeMessage)
}
}
Logger.getLogger(“org.apache.spark”).setLevel(Level.WARN)
Logger.getLogger(“org.eclipse.jetty.server”).setLevel(Level.OFF)
val conf = new SparkConf().setAppName(“lpa”).setMaster(“local”)
val sc = new SparkContext( conf )
val rdd = sc.makeRDD(Array(
“1 2”,”1 3”,”2 4”,”3 4”,”3 5”,”4 5”,”5 6”,”6 7”,
“6 9”,”7 11”,”7 8”,”9 8”,”9 13”,”8 10”,”10 13”,
“13 12”,”10 11”,”11 12”
))
val edge =rdd .map( line =>{
val pair = line.split(“\s+”)
Edge( pair(0).toLong,pair(1).toLong,1L )
})
val graph = Graph.fromEdges( edge,0 )
val label = LabelPropagation.run(graph ,5 )
label.vertices.foreach( println )
graphx-社区发现(community detection)相关推荐
- 社区发现算法 python_社区发现(Community Detection)算法(转)
作者: peghoty 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区 ...
- Graphx社区发现算法学习
现实生活中存在各种各样的网络,诸如人际关系网.交易网.运输网等等.对这些网络进行社区发现具有极大的意义,如在人际关系网中,可以发现出具有不同兴趣.背景的社会团体,方便进行不同的宣传策略:在交易网中,不 ...
- 社区发现算法原理与louvain源码解析
前言 社区发现(community detection),或者社区切分,是一类图聚类算法,它主要作用是将图数据划分为不同的社区,社区内的节点都是连接紧密或者相似的,而社区与社区之间的节点连接则是稀疏的 ...
- 标签传播算法_复杂网络社区发现算法汇总
社区发现 这篇文章汇总了一些常见的社区发现概念和算法,包括 Modularity Q Fast Unfolding(Louvain Algorithm) LPA SLPA KL算法 GN算法 社区: ...
- (深度学习社区发现综述)A Comprehensive Survey on Community Detection with Deep Learning
论文地址 推荐直接看原文. 译文 深度学习分类框架,包括基于深度神经网络.深度非负矩阵分解和深度稀疏滤波的深度学习模型,并进一步将深度神经网络模型细分为卷积网络,图注意网络,生成对抗网络和自编码器. ...
- 论文翻译 - 深度学习社区发现综述 A Comprehensive Survey on Community Detection with Deep Learning
为大家介绍一篇「深度学习」在社区发现(图聚类/图划分)方面应用的最新综述论文. 作者:Xing Su 原文链接:https://arxiv.org/abs/2105.12584 Github链接:ht ...
- 深度学习助力网络科学:基于深度学习的社区发现最新综述
来源:AMiner科技 论文题目: A Comprehensive Survey on Community Detection with Deep Learning 论文网址: https://arx ...
- 社区发现算法 - Fast Unfolding(Louvian)算法初探
1. 社团划分 0x1:社区是什么 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏,在这样 ...
- UA MATH567 高维统计IV Lipschitz组合11 社区发现 Spectral Clustering容许的最大随机噪声
UA MATH567 高维统计IV Lipschitz组合11 社区发现 Spectral Clustering容许的最大随机噪声 社区发现的Spectral Clustering算法复习 用矩阵Be ...
- UA MATH567 高维统计III 随机矩阵8 社区发现 Spectral Clustering的理论分析
UA MATH567 高维统计III 随机矩阵8 社区发现 Spectral Clustering的理论分析 上一讲我们完成了Stochastic Block Model与社区发现问题的建模,并描述了 ...
最新文章
- 关于java的对象数组
- python split()方法_秘籍:10个Python字符串处理技巧(附代码)
- python自动批量发邮件脚本_Python实现自动发送邮件功能
- (转)利用MS AJAX 扩展服务器端控件
- h3c服务器系统关闭pxe,h3c服务器设置pxe启动
- Python简单GUI(随机点名)
- 【Stimulsoft Reports Silverlight教程】使用报表组件
- ios开发之cocoapods导入新三方库报错RuntimeError - [Xcodeproj] Unknown object version.
- FISCO BCOS log日志设置配置
- 宽带密码忘了怎么办?ADSL宽带账号密码找回教学
- 影音先锋 android下载地址,影音先锋手机版-影音先锋下载v5.8.2 安卓手机版-西西软件下载...
- 论文毕业设计--基于javaweb框架的个人博客系统项目毕业设计论文.doc
- MFC隐藏窗口及图标
- javascript跨域
- 杭州电信域名解析服务器,国内电信域名解析服务器dns分布表.docx
- SQL学习笔记——数据更新update语句的使用
- 5M的开源桌面整理软件,麻雀虽小,功能十分强大
- STM32物联网套件基础版03-控制继电器
- ios手机怎么连接adb命令_Mac ADB 命令连接 android手机并进行各种操作
- RiskCloud-双控平台(有效分享LOPA软件篇)
热门文章
- flutter webview加载http图片失败处理
- 超级详细!!!Spring、SpringMVC、Mybatis知识点完整版更新!IOD、DI依赖注入、Mybatis配置、SQL、MVC拦截器、Web开发、SSM整合案例。
- ad10搜索快捷键_AD10设计所需快捷键(席雪晴)
- 百度搜索引擎优化指南 2.0
- DELLEMC S4048
- iOS组件化中xib转nib
- 点亮LED灯(STC89C52RC芯片)
- 醉翁之意不在酒,网易“星球”意在用户数据
- List去重 排序 多list 穿插筛选 (java 8)
- 【生活】罗曼·罗兰语录