社区探测 (Community Detection)

一. 社区探测 (Community Detection) [无向图]
   输入: 顶点值[Long] 和 边值[Double]; 即 Graph[K, Long, Double], K 为label标签.
   返回: 和输入同类型的Graph, 其中顶点值与社区标签 (community labels) 对应. 
   如果两个顶点有相同的顶点值, 则这两个顶点属于同一个社区.

   文档翻译: 
   The Vertex values of the input Graph provide the initial label assignments.
   输入图的顶点值提供初始标签分配

   Initially, each vertex is assigned a tuple formed of its own initial value along with a score equal to 1.0.
   最初, 每个顶点被分配一个 Tuple2[Long, Double] 它包含了其初始值和一个分数, 分数值等于1.0
   The vertices propagate their labels and max scores in iterations, 
   在每一次迭代中, 所有顶点将自身的标签和最高分数发送给它们的邻居.
   each time adopting the label with the highest score from the list of received messages. 
   当接收到来自邻居的信息时, 顶点每次采用接收消息列表中得分最高的标签.
   The chosen label is afterwards re-scored using the fraction delta/the superstep number. 
   通过 (跳衰减 / 超步) 算法 对标签重新算分
   Delta is passed as a parameter and has 0.5 as a default value.
   跳衰减参数默认值为 0.5

   [ScatterGatherIteration]
   org.apache.flink.graph.library.CommunityDetection

   源码解读: 
   1. 从输入图[K, Long, Double] 转换为新的顶点[K, Tuple2[Long, Double(default 1.0)]], 边保持不变. 新图[K, Tuple2[Long, Double], Double]
   2. runScatterGatherIteration(LabelMessenger, VertexLabelUpdater(delta), maxIterations)
   2.1 LabelMessenger: 发消息. 顶点值不变, 新顶点分数 = 顶点分数 * 边值; 消息体: Tuple2[顶点值, 新顶点分数]
   2.2 VertexLabelUpdater: 更新顶点. 记录 标签的最高分数|收到的标签分数 [顶点值, 顶点分数]. 若有收到标签分数, 设置新顶点 Tuple2[最高顶点值, 最高顶点分数].
   3. 将计算的结果清理分数并返回图: mapVertices(RemoveScoreFromVertexValuesMapper). 

   2.2 备注: 
   收到的标签分数: 相同的顶点值时, 分数是累加的.
   标签的最高分数: 只保留最高分数.
   最高顶点值: 取最高分数的顶点值.
   最高顶点分数: 根据最高分数的顶点值取分数. 最高顶点值不等于当前顶点的顶点值时, 重计算新分数 highestScore -= (delta / SuperstepNumber)

   [分数]示例: 1~3是顶点值, 同时是顶点标签.
   1    4    1.0
   2    4    1.0
   3    4    1.0
   2    4    1.0
   highestScore
   2    4重复输入2次即分数为2.0, 最大值是1.0(1超步), 
   从 收到的标签分数 遍历出 分数值为2.0对应的顶点2, 
   从 标签的最高分数 获取顶点2的最高分数1.0, 
   若 最高分数1.0不等于当前顶点值4, 则 重新计算分数 最高分数 = 最高分数 - (delta / SuperstepNumber). 即 最高分数 = 1.0 - (0.5 / 1) = 0.5
   设置新顶点值 Tuple2(2.0, 0.5)

   个人总结: 
   一个社区由一组连接紧密的结点组成, 同时这些结点与社区外部的结点连接稀疏. 
   该算法用于哪些是在一个社区内的. 即联系的紧密程度高属于一个社区.

   论文: https://arxiv.org/pdf/0808.2633.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值