社交網絡分析之網絡分解(小世界劃分)

略談社交網絡:

抽屜裏有本書《social networks analysis》,平時也沒翻,突然老闆說,搞一下社交網絡分析,於是就上了。一週下來寫個小結。由於在網絡中找關鍵點,已經被分析了很多(比如中心性、流中心性等,而且python有個networks的包,總之沒什麼難度。),我當時的定位是網絡分解:把一個大的網絡劃分爲若干個緊密連接的子網絡。


數據的準備以及驗證:

作爲驗證算法的有效性來說,我們沒有去找一個已經標記過的網絡,而是造了一批數據。我們設定A B C三個羣體,分別20、20、50人;同類人與人之間 0.2的概率與其他人發生聯繫,異類人與人之間0.02的概率法身聯繫。這樣一個用於測試的社交網絡就夠造好了。


分解的思想:

記得之前看一本書上說:信息是來自於網絡的外部(原話已經忘了)。對於局部網絡來說他有一些橋樑(邊)使他與全局相連,那怎麼找到這些橋樑呢?我們使用的方法非常簡單,讓網絡中每一個人都從自己的出發點傳遞一條信息給其他所有人(當然,因爲這些人很懶,他們每次都會走最近的路線),然後看看哪條(邊)被最多(或者top K)的人使用,那它就是“橋樑”。拆掉一座橋後,再做相同事情時,會有其他邊再次充當橋樑角色,一直拆下去,網絡就會斷開了。有沒有感覺太簡單了……(後來發現這和一些書上說的“邊介數”是一樣的)


分解的效果:

網絡點數在100個左右時,在同類鏈接概率大於異類鏈接概率的 4 倍時,效果已經非常明顯了。在相差10倍時,我們做了多次試驗,往往只有0~3個元素被分錯網絡歸屬。


代碼性能:

我自己寫的算法複雜度爲N的4次方多一些。首先隨着網絡的元素增加,要切開更多的“橋樑”才能將網絡切開,我們構造的數據中這個值接近正比於N的2次方。其次隨着網絡的元素增加,我們要找到任意兩個元素間的最短路線的複雜度與具體實現有關,不過我們的是略高於N的2次方。

實現中我避開了遍歷元素,而是採取遍歷邊的方法,因此對複雜度有所降低,也使原來的深度優先遍歷轉化爲廣度優先(深度優先指每次都把一個人所有的最短路線找出來,而廣度在這指每次每個人都只走一步;感興趣的同學可以實現一下)。不過現在其中部分地方使用矩陣記錄圖,導致很多無效的訪問,在後續中會改掉。


總結:

關於性能這塊我也有些其他的方法去優化(當然不包括並行、分佈式這種野蠻的方法),但是現在沒有完全解決。另外看了一下自己之前寫的文章,感覺有點貪多,沒寫明白,希望這次說清楚了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章