Community
之前講到了網絡中節點扮演不同角色,而角色這個概念和社區互補,那麼接下來就討論下社區這個概念。
以找工作爲例,曾經學者 Granovetter 調查過人們的工作是由誰介紹的,結果很意外。大部分人的工作是由“熟人”,或者說關係並不是很密切的人介紹的。然後 Granovetter 分析後提出了他的解釋:這種“熟人”可能涉及整個社交網絡很廣泛的區域 (普遍來說通過 個人就能認識全世界任何人)。這樣一來他們很可能覆蓋了很多行業,其中一個就是你的專業。然後將這個解釋整理一下就得到了如下兩個方面的結論:
- 結構上連接緊密的邊的社會性更強;跨度大的邊連接了網絡不同的兩個或多個領域反而社會性不穩定
- 從信息傳播的角度來看,跨度大的邊能傳遞不同領域的信息,在找工作方面更有利;而結構上連接密的邊過於冗餘因此無法提供新的信息
Granovetter 的這個理論在後來電話網絡中得到了印證,即連接更強的邊一般都有更頻繁的電話聯絡。這裏提到一個 edge overlap 需要記錄一下,它衡量了兩個點間連接的緊密程度。當某條邊是 local bridge 時,重疊率爲 。
那如果我們按重疊率從小到大來移除邊,那整個網絡會很快變成不相連的幾個部分,也就是說網絡的最大相連的部分大小會很快縮小。如此一來我們就可以斷定這個網絡裏存在不同的社區。那麼給出社區的定義:包含大量內部連接和少量外部連接的節點集合。一個比較經典的社團網絡是 Zachary 的 Karate club network
給出具有明顯社區的網絡的鄰接矩陣,按一定順序排列節點可以明顯看出有分塊的趨勢。
按套路來說,這時候應該要提出一個用來衡量網絡是否具有典型的社區的標準了。那麼他來了:modularity 。給定網絡中的一些點作爲一個劃分
這個式子的結果衡量的是:到底圖裏的邊或邊的權重比我們預想的多多少?如果多很多那說明存在一個社區,少很多說明是 bridge。那這裏的 expected 是怎麼來的呢?再一次請出零模型
Configuration Model
現在我們的目標是給定 個節點 條邊,然後生成一個具有相同度分佈的隨機網絡。不同於之前我們構建的零模型,這裏我們只需要知道節點間邊的期望,或者對於無向圖來說就是有邊的概率。這裏可以通過每個節點的度來計算節點間邊的期望
那麼這個圖裏所有邊的期望爲
有了這個期望後,我們將 modularity 這個概念具體化。其中 是判別函數,判斷兩個節點所屬社區是否相同,即只考慮劃分 內的所有邊。
得到的 值落在 ,正值表示圖中的邊多餘預期。一般地, 大於 ~ 表明圖中存在明顯的社區結構。
Louvain Algorithm
根據上面推導到的 modularity 我們可以想到將 最大化就能得到一個比較好的劃分方案。於是 Louvain 算法就是基於這樣思想的一個貪心算法。而且它具有
- 速度快
- 收斂快
- 結果好
- 支持嵌套社區結構
這個算法分兩步,然後不停迭代直到收斂
- 在局部範圍內交換節點的社區,如果交換後能使 modularity 增大則保留交換,否則回退
- 在第一步收斂後將所有屬於同一社區的節點匯聚爲一個超級節點,然後根據原圖結構連接這些超級節點形成新的圖,而邊的權重是所有對應邊的權重之和
在第一步裏還有很多細節。初始化的時候給所有節點分配一個單獨的社區。交換社區怎麼做呢?將節點 的社區改變爲其任一鄰接節點 的社區,然後計算 ,在得到所有鄰接節點的 後取其中最大的。這裏有學生問節點遍歷順序的問題,的確,遍歷順序會影響最終結果。但 Jure 在 slide 裏批註到根據研究表明節點順序並不會對結果產生很大影響,因此無所謂。
那麼現在還有一個問題,就是這個 。雖然說這是 modularity 的變化量,但思考一下,改變一個節點的社區類型其實是兩步操作:首先將這個節點從原社區移除,然後才能將其加入新的社區。那這裏的 就需要包括移除和加入兩步對 modularity 的影響。因此定義 將節點 加入社區 ; 將節點 從社區 移除。。其中移除節點的具體表達爲
- 社區 內邊的權重之和
- 與社區 內所有點相連的邊的權重
- 節點 和社區 內所有點的連接的權重和
- 與節點 連接的所有邊的權重和
(目前先理解加入這一步,但沒有自己推導;而移除的表達式沒有推,後面有時間會補上)
下圖是這個計算式的 intuition 1
具體僞碼有點長就不貼了,但需要說明一點。在移動了節點的社區類型後社區結構變了,看起來需要重新數邊什麼的,然而可以根據改變了的節點的信息更新社區信息,因此只是簡單的加減法而不需要重新數。
這裏學生提到一個問題,就是什麼時候結束算法?這裏我們其實不需要手動中止,因爲 Louvain 保證收斂,所以只要讓它跑完就行。每迭代一次都會輸出一次 modularity,而我們只需要取 modularity 最大的那一次迭代就能確定多少社區合適,並從而獲取社區的聚類。一般來說算法最後都會收斂到剩下兩個社區。
另一個學生提問:這個算法在多大程度上收斂到最優解。這個問題 Jure 的回答是不知道,但應該不差。
BigCLAM
Louvain 雖然好處多多應用也廣,但有個缺陷,它只能給每個節點分配一個社區。然而現在社會結構複雜,一個人可能參加多個社團或屬於多個社區,這樣就是 overlap 的問題。用鄰接矩陣來表示更直觀
這裏採取的思路是:首先設計一個能生成重疊圖的模型,然後通過調整模型參數來擬合給定的圖。這個模型叫 Community Affiliation Graph Model (AGM),它的定義很直觀。給定社區集合 ,節點集合 以及成員關係 表示某個節點屬於某個或多個社區。社區 內部的點互相連接的概率爲 ,那麼任意兩個節點互相連接的概率就是 。AGM 不僅能表示重疊,還能表示嵌套的情況,因此是個很有效的模型。而現在我們要做的就是通過給定的網絡結構反推 AGM 模型,包括社區個數、節點與社區的隸屬關係以及每個社區內的連接概率。即給定圖 ,找模型 ,相當於最大化概率
但是這種“有就是有,沒有就是沒有”的定義太死板了,需要鬆弛一下。所以給每個節點定義一個向量 表示這個節點屬於各個社區的權重(或概率)。這樣就需要調整節點間連接的概率 ,而我們需要最大化的目標就是這樣的一個似然函數
那接下來需要做的就是
- 隨機初始化 AGM 的參數
- 固定其他節點的社區成員關係,更新節點
至於怎麼做 Jure 這裏因爲快下課了就沒講。但是提點了一下,就是大家再熟悉不過的梯度上升了。這裏梯度爲
這裏看起來是要對所有非鄰節點的 求和,但實際上只需要保存然後隨迭代更新就行了。因此這一步的複雜度是和節點的度呈線性關係的。
這裏 到 的權重爲什麼是 ,不應該就是 嗎? ↩︎