其中部分转载的社区发现SLPA算法文章
一、概念
社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏。
设图G=G(V,E),所谓社区发现是指在图G中确定nc(>=1)个社区C={C1,C2,...,Cnv},使得各社区的顶点集合构成V的一个覆盖。
若任意两个社区的顶点集合的交际均为空,则称C为非重叠社区(disjoint communities);否则称为重叠社区(overlapping communities)。
二、SLPA算法思想与流程
SLPA(Speaker-listener Label Propagation Algorithm)算法是一种社区发现算法,它是对LPA算法(标签传播算法)的拓展。SLAP重叠社区的发现主要认为每个节点不光只有一个标签,每次迭代增加一个标签,最后再通过r进行筛选
算法思想如下:
输入参数:迭代次数T,满足社区次数要求的阈值r
输出参数:每一个节点的社区分布
(1)首先,每一个节点的存储器中初始化一个唯一的标签。
(2)然后,重复进行以下步骤,直到达到最大迭代T:
a. 选择一个节点作为监听器;
b. 所选节点的每个邻居随机选择概率正比于该标签在其存储器中的出现频率的标签,把所选择的标签(speakervote)发送到听众(listener);
c. 监听器增加接收到的最流行的标签到内存。
(3)最后,根据在存储器里的标签和阈值r,后处理被用于输出社区
三、代码实现
实现代码可在GitHub网站上下载,Python下载地址
伪代码:
//Algorithm 1 : SLPA(T, r) [n,Nodes]=loadnetwork(); //Stage 1: initialization for i = 1 : n do Nodes(i).Mem=i; //Stage 2: evolution for t = 1 : T do Nodes.ShuffleOrder(); for i = 1 : n do Listener=Nodes(i); Speakers=Nodes(i).getNbs(); for j = 1 : Speakers.len do LabelList(j)= Speakers(j).speakerRule(); w=Listener.listenerRule(LabelList); Listener.Mem.add(w); //Stage 3: post-processing for i = 1 : n do remove Nodes(i) labels seen with probability < r;
四、References
Xie J, Szymanski B K, Liu X. SLPA: Uncovering Overlapping Communities in Social Networks via a Speaker-Listener Interaction Dynamic Process[C]// IEEE, International Conference on Data Mining Workshops. IEEE Computer Society, 2011:344-349.
注意事项:
SLAP算法是异步更新,但是原文并没有提到节点排序的具体规则,Python中调用代码numpy.random.permutation(x),对矩阵进行洗牌,并返回洗牌后的矩阵副本;
其次T根据网络结构和规模取值不一,实验证明当T>=20时,节点社区划分结果一般就稳定了。r>=0.04