其中部分轉載的社區發現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