infomap核心問題(補充)

社區發現類算法似乎並不存在一個最好的算法,因爲在現實數據中對於社區或者說團伙的定義千差萬別,不一定都跟算法的假設匹配。有一些學術文章嘗試過對於最近十幾年提出的算法進行比較,發現在一些常規評價指標(比如,modularity)上表現比較好的算法,可能在有 ground truth 的真實數據上表現不太好;在其中一些真實數據上表現好的算法,可能在另一些真實數據上表現並不好。在現實應用中,最爲保險的做法,可能是儘量瞭解一些不同思路的算法,以備不時之需。而 Infomap 是衆多社區發現算法中思路比較特別的一種算法。

Infomap 設計之初想解決的問題如下:如果在一張圖上做隨機遊走(不限步數的遊走),如何用最短的編碼來描述隨機遊走產生的路徑?比如,下圖(a)中展示了一段隨機遊走產生的路徑,那怎麼描述它先訪問了哪個節點,後訪問了哪個節點呢?

原始做法: 採用等長的二進制編碼,每個節點一個編碼,不同節點之間的編碼不一樣。

高級做法:採用 huffman 編碼,每個節點一個編碼,但是碼的長度不一樣。對於訪問頻率比較高的給予較短的編碼,對於訪問頻率比較低的給予較長的編碼。下圖(b)展示了這樣的編碼,顯然,相比較等長編碼,採用huffman編碼可以縮短描述的信息長度。

進階做法:採用雙層結構,將不同節點劃分羣組(這裏的“羣組”同“社區”是等價的概念),這樣在編碼時候需要對兩種信息編碼。第一種是羣組的名字,不同羣組的名字編碼不一樣;第二種是每個羣組內部的節點,不同節點的名字編碼不一樣。但是,不同羣組內部的節點的編碼可以複用。顯然,在劃分羣組之後,每個羣組內部節點相對較少,可以採用短一些的編碼。不同羣組內部節點的編碼複用,可以大幅縮短描述的信息長度。

 

不同羣組內部節點的編碼複用,就好比不同城市裏街道的名字可以相同一樣,上海有南京路,武漢有南京路,青島也可以有南京路。

 

Infomap 在具體做法上,爲了區分隨機遊走從一個羣組進入到了另一個羣組,除了羣組的名字之外,對於每個羣組的跳出動作也給予了一個編碼。比如,下圖(c)中紅色節點部分是一個羣組,羣組名的編碼是 111,跳出編碼是 0001。這樣在描述某個羣組內部的一段隨機遊走路徑的時候,總是以羣組名的編碼開頭,以跳出編碼結束。

 

算法步驟簡述

Infomap 的雙層編碼方式把羣組識別(社區發現)同信息編碼聯繫到了一起。一個好的羣組劃分,可以帶來更短的編碼。所以,如果能量化編碼長度,找到使得長度最短的羣組劃分,那就找到了一個好的羣組劃分。

知道了每種概率對應的編碼長度,就可以計算出一種概率分佈的平均編碼長度。

上面公式的H,就是該種概率分佈的平均編碼長度。理論上,這也是最優編碼長度,不可能獲得比它更短的編碼了。下面計算L(M)其實也是按照上面這個公式來的,只不過L(M)中有兩類要編碼的東西:社區和節點。所以L(M)理解起來的時候有點費勁,很多人都沒有講明白了。對於 節點本身的編碼,可以用上述公式直接計算,這是沒問題的。但是對於社區本身的編碼,還是要好好想一下的。(等我想明白了,再好好寫出來)

那如何量化編碼的長度呢?假設現在有一種羣組劃分方式 M 將節點劃分爲 m 個羣組, 則描述隨機遊走的平均每步編碼長度(average number of bits per step)可以用下面這個公式來度量:

在上面的公式裏用到的最重要的概念是信息熵 H(X)。熵在一般的理解裏是用來描述“系統混亂程度”的,當一個隨機變量爲均勻分佈的時候,它的狀態最不確定,系統最混亂不可預測,這個時候熵最大。 而在編碼理論裏,熵還有一個解釋是 “編碼每個狀態所需的平均字節長度”。阮一峯有一篇通俗易懂的文章是解釋信息熵的:《數據壓縮與信息熵》,有興趣的可以一讀。

上面的公式裏, 有四個變量,其含義分別爲:

  • : 在編碼中所有表示羣組名字的編碼的佔比, 表示羣組 i 的名字出現的概率(或者,也等於從羣組 i 跳出的概率)

簡單的理解上面這個公式:平均每步編碼長度 L(M)是兩部分的加權和,一個是編碼羣組名字所需的平均字節長度,一個是編碼每個羣組中的節點所需的平均字節長度,權值是各自的佔比。

如果要計算上述四個變量的值,我們只需要知道圖中每個節點的訪問概率和每個羣組的跳轉概率。其中訪問概率的計算方法,Infomap 採取了類似 pagerank 的做法:

 (1) 初始所有節點都是均勻訪問概率;
 (2) 在每個迭代步驟裏,對於每個節點  有兩種方式跳轉:要麼以 1-r 的概率從節點 a 的連接邊中選擇
   一條邊進行跳轉,選每條邊的概率正比於邊的權重;要麼以 r 的概率從節點 a 隨機的跳到圖上其他任意
   一點。
 (3) 重複步驟 2 直到收斂。

總結一下,Infomap 算法的大體步驟如下(看起來跟 Louvain 有些許類似):

(1)初始化,對每個節點都視作獨立的羣組;
(2)對圖裏的節點隨機採樣出一個序列,按順序依次嘗試將每個節點賦給鄰居節點所在的社區,取平均比特
    下降最大時的社區賦給該節點,如果沒有下降,該節點的社區不變;
(3)重複直到步驟 2 直到 L(M)不再能被優化。

 

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