现实生活中存在各种各样的网络,诸如人际关系网、交易网、运输网等等。对这些网络进行社区发现具有极大的意义,如在人际关系网中,可以发现出具有不同兴趣、背景的社会团体,方便进行不同的宣传策略;在交易网中,不同的社区代表不同购买力的客户群体,方便运营为他们推荐合适的商品;在资金网络中,社区有可能是潜在的洗钱团伙、刷钻联盟,方便安全部门进行相应处理;在相似店铺网络中,社区发现可以检测出商帮、价格联盟等,对商家进行指导等等。总的来看,社区发现在各种具体的网络中都能有重点的应用场景,图1展示了基于图的拓扑结构进行社区发现的例子。

如上所述,在一个无向图中,点和点之间通过一条无向边链接。但是有的时候我们需要根据图中已经给的信息来挖掘可能存在一定共性的社区。Graphx中的LPA算法就是用来实现这一功能的。

LPA算法是一个非常简单的迭代算法,通过向邻近的点发送本点的标签,在接收到标签的时候合并收到的标签,按照同一个key值合并,计算同一个key值的数量,然后用出现最多次的标签来更新本node的标签。

最后,根据每个Node上的标签来确定是否是属于同一个社区。这个算法在计算关系图中可以挖掘出比较有价值的信息。

以下是Graphx中的源码分析,在分析之前需要你了解一些关于Pregel的基础知识。如果有需要请翻阅之前的blog。

  def run[VD, ED: ClassTag](graph: Graph[VD, ED], maxSteps: Int): Graph[VertexId, ED] = {require(maxSteps > 0, s"Maximum of steps must be greater than 0, but got ${maxSteps}")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)))}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}def vertexProgram(vid: VertexId, attr: Long, message: Map[VertexId, Long]): VertexId = {if (message.isEmpty) attr else message.maxBy(_._2)._1}val initialMessage = Map[VertexId, Long]()Pregel(lpaGraph, initialMessage, maxIterations = maxSteps)(vprog = vertexProgram,sendMsg = sendMessage,mergeMsg = mergeMessage)}

这里最终要的三个函数sendMessage、mergeMessage、vertexProgram,熟悉Pregel的同学可能就非常容易理解此处的意义了。

其中sendMessage向起点发送终点的标签,向终点发送起点的标签。这里说明了Graphx默认这里的图是无向的图的,如果有需要 的同学可以考虑改为有向图的情况下如何处理。

mergeMessage用于处理接收到的多个message的reduce,这里可以看到就是对同一个标签的合并,并且value值相加。

vertexProgram则是对node的操作,这里就是简单的把收到的message标签里面的值取出出现次数最多的nodeid用来更新本个node上的值。

Graphx社区发现算法学习相关推荐

  1. 社区发现算法原理与louvain源码解析

    前言 社区发现(community detection),或者社区切分,是一类图聚类算法,它主要作用是将图数据划分为不同的社区,社区内的节点都是连接紧密或者相似的,而社区与社区之间的节点连接则是稀疏的 ...

  2. 文献记录(part66)--一种基于交叉熵的社区发现算法

    学习笔记,仅供参考,有错必纠 关键词:复杂网络:社区发现:交叉熵: 一种基于交叉熵的社区发现算法 摘要 作为复杂网络中的一个极其重要的研究领域,社区结构的搜寻和发现研究具有重要的应用价值 . 该文将信 ...

  3. Louvain 社团发现算法学习(我的java实现+数据用例)

    为了大家方便,直接把数据放在github了: https://github.com/qq547276542/Louvain 算法介绍: Louvain 算法是基于模块度的社区发现算法,该算法在效率和效 ...

  4. 【图算法】社区发现算法——Fast unfolding

    [图算法]社区发现算法--Fast unfolding 1. 社区划分问题的定义: 2. 社区划分的评价标准: 3. Fast unfolding算法: 3.1 Fast Unfolding算法的基本 ...

  5. 重叠社区发现算法LFM算法python源码含数据集

    LFM算法是来源于论文<Detecting the overlapping and hieerarchical community structure in complex networks&g ...

  6. 标签传播算法_复杂网络社区发现算法汇总

    社区发现 这篇文章汇总了一些常见的社区发现概念和算法,包括 Modularity Q Fast Unfolding(Louvain Algorithm) LPA SLPA KL算法 GN算法 社区: ...

  7. 社区发现算法 - Fast Unfolding(Louvian)算法初探

    1. 社团划分 0x1:社区是什么 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏,在这样 ...

  8. fastunfolding算法_社区发现算法综述—part1

    目前我能在arxiv上找到的最新的关于社区发现算法系列的综述文了. 正文从这里开始: 2.2 社区发现 现代网络在规模.多样性和复杂性上呈指数增长. 由于网络的变化,各种各样呈现出网络结构的不同类型的 ...

  9. 社区发现算法中模块化度量值Q(Modularity)的计算

    社区发现算法中模块化度量值Q(Modularity)的计算 Modularity Measure(模块化度量值),由Newman等人提出,是目前常用的一种衡量网络中社区稳定度的方法. 如上图所示的图中 ...

最新文章

  1. Kotlin------函数和代码注释
  2. LeetCode Integer to Roman(数字转罗马)
  3. RTSP流媒体数据传输的两种方式(TCP和UDP)
  4. 调制优缺点_钓鱼,何时用搓饵、何时用拉饵?及对应的优缺点分析
  5. Python数据分析pandas之series初识
  6. 06.full_text multi_match查询
  7. linux版本photoshop,在linux上使用ps(转载)
  8. html之属性的定义
  9. 3D远方纯动态白云页面源码
  10. java中fileter用法,Java 8 使用Lambda表达式的FileFilter示例
  11. java 字符串换行问题
  12. ios13 文件 连接服务器 您已离线,iOS13,终于可以屏蔽系统更新了
  13. itlwm驱动_黑苹果系统 macOS 驱动英特尔无线网卡的小教程
  14. java技术简介英文_JAVA技术人员英文简历模板
  15. AOSP 隐藏 su
  16. 国产化图形引擎一词引发的感想!
  17. English trip 自习内容 英语时态
  18. 生态篇-HBase 进化之从 NoSQL 到 NewSQL,凤凰涅槃成就 Phoenix
  19. 在线问答系统---数据库管理
  20. 软件测试的定义、分类、方法、生命周期

热门文章

  1. 如何对技术视频转换文章投稿进行二次创作
  2. 盛大搅局手游市场:引入日系卡牌游戏_0
  3. 用python编写密码安全性_用大数据python保护密码
  4. 实现.KML和.KMZ 文件的下载
  5. linux服务器抓包分析,抓包分析SSL/TLS连接建立过程总结
  6. Python期末复习题:流程控制
  7. mana spark有中文吗_Mana Spark
  8. 用PDF格式协议的方式给PDF文档添加透明文字水印
  9. 行走C江湖多年,你修炼过五大秘笈吗?
  10. idea设置自动导包