這是我在一篇論文中看到的思路,與之前的一些思路有比較大的不同。論文沒有通篇看完,只看到算法描述部分,我就迫不及待的實驗,對於同學,同事圈子的挖掘有一定的效果。我之前了解的一些算法的思路可以總結如下:
- 從節點開始,每個節點作為一個社團圈子進行合並
- 從整個網絡開始,通過某些算法選取某些邊,進行分割
- 從最大團開始,選擇合適的相似度計算的方法,對最大團進行合並
我比較關注圈子之間有重疊的情況。前兩種,我目前實驗做得少,主要集中在第三種,及其擴展。第三種思路目前比較經典的就是k-clique算法,相似度計算的依據很強,很直接,就是要有k-1公共節點。后來有幾篇文章,也是從最大團開始做的。我個人認為,是一個很好的開始。對於最大團思路的進一步分析,在后面的博客會有進一步的深入。我一直很看好這個思路。 這里要討論的論文的思路與上面三種都不同,與2,3有點類似,當仍有較大不同。論文中沒有命名,我姑且稱之為local方法,這個方法的核心思路是,從局部的角度考慮節點是否能夠作為一個社團。這個方法,有一個假設,就是社團或者圈子,就是一個局部的結構。只會包含一個節點,以及它的鄰居們。這個假設是合理的。根據這個假設,就可以尋找從某一個節點開始的,這個節點屬於的社團。方法中,有兩個度量,一個是社團的fitness,另一個是節點的fitness。社團的fitness定義如下:
其中,k[in]表示社團內部的總的度數,k[out]表示社團內部的節點與社團外部節點連邊的總數。a是一個參數,用來調整層次性。對於某一個節點的fitness定義如下:
很好理解:加入節點A的社團的fitness與移除節點A的社團的fitness的差,越大節點A越重要,如果為負,則表示A不屬於該社團。有了着兩個度量之后,就可以從某一個節點開始,知道這個點所在的社團。具體算法如下,初始社團C,只有一個節點A:
- 循環處理C中節點的所有鄰居節點(注意要去重,比且鄰居節點不再C中)
- 找到fitness最大的鄰居節點,加入到C中,得到C1
- 重新計算C1中的所有節點的fitness
- 如果某一個節點的fitness是負的,就將它從C1中移除,得到社團結構C2
- 如果4發生了,轉到3,否則轉到1
算法結束的條件是:當第一步得到的鄰居節點的fitness都為負,即可停止。這里有一個好處,就是可以不用使用q函數來判斷算法結束的時機。 我簡單實現了上面的算法,用我自己的關注數據測試了一下,效果如下: 以“王大美”為種子,得到的人民搜索同事圈子如下:
悅曉0709 |
豆爸何銳 |
loveEmma |
魚曉-五毛 |
袁小暈 |
王大美 |
即刻搜索JIKE |
yellowleaf2010 |
guoyipeng |
以“hny101”為種子,得到高中同學圈子如下:
c背a井t醫y志y貓c |
兔傑列夫 |
hny101 |
奔三北P |
以“bill323”為種子,得到前實驗室的同學圈子如下:
暖暖cathy |
alue-fabre |
bill323 |
hszhsh1915647047 |
桂林山水78 |
以“wpwei”為種子,得到大學同學的圈子如下:
海帶絲絲 |
Eva奶奶 |
wpwei |
這幾個圈子的挖掘效果非常好,但是我的主要圈子,技術圈,挖掘得不是很理想,技術圈比較大,比較雜,不好挖掘。但是同學,同事圈子還是比較理想。對於技術圈子不好的主要效果還是這部分鏈接過於復雜,這是目前算法都不能很好解決的問題。
[引用]
Detecting the overlapping and hierarchical community structure in complex networks