社区发现SLPA算法

社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏。

设图G=G(V,E),所谓社区发现是指在图G中确定nc(>=1)个社区C={C1,C2,...,Cnv},使得各社区的顶点集合构成V的一个覆盖。

若任意两个社区的顶点集合的交际均为空,则称C为非重叠社区(disjoint communities);否则称为重叠社区(overlapping communities)。

SLPA(Speaker-listener Label Propagation Algorithm)算法是一种社区发现算法,它是对LPA算法(标签传播算法)的拓展。

算法思想如下:

输入参数:迭代次数T,满足社区次数要求的阈值r

输出参数:每一个节点的社区分布

(1)首先,每一个节点的存储器中初始化一个唯一的标签。

(2)然后,重复进行以下步骤,直到达到最大迭代T:

  a. 选择一个节点作为监听器;

  b. 所选节点的每个邻居随机选择概率正比于该标签在其存储器中的出现频率的标签,把所选择的标签(speakervote)发送到听众(listener);

  c. 监听器增加接收到的最流行的标签到内存。

(3)最后,根据在存储器里的标签和阈值r,后处理被用于输出社区。

 1 public int speakerVote() {
 2         //Run through each element in the map to create a cumulative distribution
 3         Set<Integer> communityIds = communityDistribution.keySet();
 4         ArrayList<Integer> communities = new ArrayList<Integer>();
 5         ArrayList<Integer> cumulativeCounts = new ArrayList<Integer>();
 6
 7         int sum=-1;
 8         for (Integer comm: communityIds) {
 9             sum += communityDistribution.get(comm);
10             communities.add(comm);
11             cumulativeCounts.add(sum);
12         }
13
14         //Generate a random integer in the range [0,sum)
15         int rand = RandomNumGenerator.getRandomInt(sum+1);
16
17         //Find the index of first value greater than rand in cumulativeCounts
18         int i=0;
19         for (i=0; i<cumulativeCounts.size(); i++) {
20             if (cumulativeCounts.get(i)>=rand)
21                 break;
22         }
23
24         //Return the corresponding community
25         return communities.get(i);
26     }

SpeakerVote

 1 public void updateLabels(Integer userId){
 2         Set<DefaultWeightedEdge> incomingEdges = userNodegraph.getGraph().incomingEdgesOf(userId);//获取所有该顶点的入度顶点
 3         Map<Integer, Integer> incomingVotes = new HashMap<Integer, Integer>();//所有speaker顶点投票情况
 4
 5         //For each vertex V with an incoming edge to the current node
 6         for ( DefaultWeightedEdge edge: incomingEdges ) {
 7             int speakerId = userNodegraph.getGraph().getEdgeSource(edge);
 8             UserNode speakerNode = userNodegraph.getNodeMap().get(speakerId);
 9
10             int votedCommunity = speakerNode.speakerVote();
11             int votedCommunitycount = 1;
12             if ( incomingVotes.containsKey(votedCommunity)){
13                 votedCommunitycount += incomingVotes.get(votedCommunity);
14             }
15             incomingVotes.put(votedCommunity, votedCommunitycount);
16         }
17
18         //Find the most popular vote
19         Iterator<Entry<Integer, Integer>> it = incomingVotes.entrySet().iterator();
20         int popularCommunity=-1;
21         int popularCommunityCount=0;
22         while ( it.hasNext()) {
23             Entry<Integer, Integer> entry = it.next();
24             if ( entry.getValue() > popularCommunityCount ) {
25                 popularCommunity = entry.getKey();
26                 popularCommunityCount = entry.getValue();
27             }
28         }
29         //Update community distribution of the current node by 1
30         UserNode currentNode = userNodegraph.getNodeMap().get(userId);
31         currentNode.updateCommunityDistribution(popularCommunity, 1);
32     }

listenerUpdateCommunity

注:源代码请联系[email protected].

时间: 2024-10-01 01:28:32

社区发现SLPA算法的相关文章

社区发现(Community Detection)算法(转)

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区是一个比较含糊的概念,只给出了一个定性的刻画. 另外需要注意的是,社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法. 这里在相互关注的用户

[转] 社区发现(Community Detection)算法

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法.     这里在相互关注的用户之间建立连接关系,主要是为了简化模型,此时对应的图为无向图. 当然,我们也可以采用

社区发现(Community Detection)算法

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区是一个比较含糊的概念,只给出了一个定性的刻画. 另外需要注意的是,社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法. 这里在相互关注的用户

模块度与Louvain社区发现算法

Louvain算法是基于模块度的社区发现算法,该算法在效率和效果上都表现较好,并且能够发现层次性的社区结构,其优化目标是最大化整个社区网络的模块度. 模块度(Modularity) 模块度是评估一个社区网络划分好坏的度量方法,它的物理含义是社区内节点的连边数与随机情况下的边数只差,它的取值范围是 [−1/2,1),其定义如下: $$Q = \frac{1}{2m}\sum_{i,j}[A_{ij} - \frac{k_ik_j}{2m}]\delta(c_i,c_j)$$ $$\delta(u,

社区发现算法问题&amp;&amp;NetworkX&amp;&amp;Gephi

在做东西的时候用到了社区发现,因此了解了一下有关社区发现的一些问题 1,社区发现算法 (1)SCAN:一种基于密度的社团发现算法 Paper: <SCAN: A Structural Clustering Algorithm for Networks>  Auther: Xiaowei Xu, Nurcan Yuruk, Zhidan Feng, Thomas A. J. Schweiger  Conference: SIGKDD 2007 主要概念: 节点相似度定义为两个节点共同邻居的数目与

社区发现的学习笔记

社区发现 社团结构与计算机中的图分割和社会学中的分级聚类有密切关系. 分级聚类是寻找网络中社团结构的一类传统算法,根据向网络中添加边还是从网络中移除边,该类算法可分为两类:凝聚方法.分裂方法. 一.基于模块度 **无向无权图:** 模块度(Modularity)是近年常用的一种衡量社团划分质量的标准.基本思想就是把社团划分后的网络与相应的零模型进行比较,来估量实际的网络和随机的网络的差别. 社团内部边的总和:Q(real)=1/2*Sigma(a(ij)*delta(C(i),C(j))) 零模

什么是社区发现?

  朋友要我通俗地讲讲什么是"社区发现",这下还真觉得有些为难.之前写东西,上来就是概念.术语.公式和算法,这些对于有专业基础的朋友当然没问题,但对于那些没有基础而且也只想知道个大概的朋友显然就不适合了.尝试着写了写,觉得通俗和严谨之间的度还真不容易把握.看来,通俗易懂地表达东西也是门需要花时间修炼的功夫,以后这样的内容还是要多多练习才行. 如果你仔细观察,你会发现,我们的生活中存在着各种各样的网络,如科研合作网络.演员合作网络.城市交通网络.电力网.以及像 QQ.微博.微信这样的社交

Louvain社区发现算法

LabelRank(A Stabilized Label Propagation Algorithm for Community Detection in Networks)非重叠社区发现

最近在研究基于标签传播的社区分类,LabelRank算法基于标签传播和马尔科夫随机游走思路上改装的算法,引用率较高,打算将代码实现,便于加深理解. 一.概念 相关概念不再累述,详情见前两篇文章 二.算法思路 (1)Propagation (2)Inflation (3)Cut off (4)Explicit Conditional Update (5)Stop Criterion 三.A Stabilized Label Propagation Algorithm for Community D