最近在看聚類方面的論文,接觸到了MCL聚類,在網上找了許久,沒什么中文的資料,可能寫的最具體的便是GatsbyNewton寫的 馬爾可夫聚類算法(MCL) 這篇博客了。但是,其中仍有一些不詳細的地方。而MCL這一方法是在作者在其博士論文中提出的,篇幅太長,難以細讀,也不適合作為用來學習MCL這一算法的文獻。找來找去,終於找到一篇可以看的PDF文檔,但每中不足的是此文檔是英文的。趁此機會,結合上述材料,總結了一下MCL的基本思想,也為了往個人博客里添加些實質性的內容,便整理了這一文檔。文章中可能會有不對的地方,希望大家相互交流 。◕‿◕。
Background
Different Clustering
Vector Clustering
我們在描述一個人時,常常會使用他所擁有的特點來表示,比如說:張三,男,高個子,有點壯。那么,這就可以用四維向量來表示,如果再復雜一些,就是更高維的向量空間了。下圖是在二維空間之中的分布情況,可以較為直觀的看出,以紅色虛線為界,可以分為兩個類別。

Graph Clustering
和特征聚類不同,圖聚類比較難以觀察,整個算法以各點之間的距離作為突破口,可以這樣形容:張三,是王五的好朋友,剛認識李四,對趙六很是反感。那么,對於該節點,我們無法直接得出他的特征,但能知道他的活動圈。利用圖聚類,可以將同一社交范圍的人聚合到一起。MCL就是屬於圖聚類的一種。

Random Walks
首先看下圖:

從圖中,我們可以看到,不同的簇,應當具有以下的特點:
- 位於同一簇的點,其內部的聯系應當緊密,而和外部的聯系則比較少(惺惺相惜)
也就是說:如果你從一個點出發,到達其中的一個鄰近點,那么你在簇內的可能性遠大於離開當前簇,到達新簇的可能性——這就是MCL的核心思想。如果在一張圖上進行多次的“Random Walks”,那么就有很大可能發現簇群,達到聚類的目的。而“Random Walks”的實現則是通過“Markov Chains”(馬爾柯夫鏈)。
Markov Chains
為了說明 Markov Chain ,我們使用如下的簡單例子:

在此圖中,我們可以分為兩個子圖:\(V(1,2,3,4)\)和\(V(5,6,7)\),其中,\(V_1\)是一簇,\(V_2\)是另一簇。在同一簇群中,各點之間完全連接,在不同簇之間,僅有\((2,5)\)一條邊。
- 現在,我們從\(V_1\)出發,假設每條邊都一樣,那么則一步之后我們有\(1/3\)的概率到達\(V_2\),\(1/3\)的概率到達\(V_3\),\(1/3\)的概率到達\(V_4\),同時,有0的概率到達\(V_5,V_6,V_7\)。
- 對於\(V_2\),則有\(1/4\)的概率到達\(V_1,V_3,V_4,V_5\),有0的概率到達\(V_6,V_7\)。
通過計算每個點到達其余點的概率,我們可以得到如下的概率矩陣:
為了計算簡單,我們使用一個更簡單的矩陣進行接下來的說明:
這表示的是從任意點出發,經過一步之后到達其它點的概率矩陣,那么,經過兩次之后、三次以及最終的概率矩陣為:
根據上述例子,我們已經接觸到了 Markov Chain ,那么現在就給其下一個定義:
Markov Process——在給定當前知識或信息的情況下,過去(即當期以前的歷史狀態)對於預測將來(即當期以后的未來狀態)是無關的。
Markov Chain——如果有由隨機變量\(X_1,X_2,X_3\cdots\)組成的數列。這些變量的范圍,即他們所有可能取值的集合,被稱為“狀態空間”。而\(X_n\)的值則是在時間\(n\)的狀態,如果\(X_{n+1}\)對於過去狀態的條件概率分布滿足:\(P(X_{n+1} = x | X_0,X_1,X_2,\cdots,X_n) = P(X_{n+1} = x | X_n)\),則我們稱其是一條Markov Chain
Weighted Graphs
之前的例子中,圖的邊是沒有權值的,也就是所有的邊都是一樣的。現在,為每條邊添加一個權重(可以理解為親密程度),那么,就需要重新計算到達每個點的概率了。
假設有如下的圖:

那么,其概率矩陣怎么計算?
首先,我們要計算得到鄰接矩陣,即:
通過鄰接矩陣,我們就可以計算得到概率矩陣了,具體計算公式如下:
最后的概率矩陣如下:
之后的計算相同。
Self Loops
在上述的例子中均未考慮一個重要的問題,我們先來看一個例子:

很簡單,就兩個點,一條邊。那么,它的概率矩陣呢:
仔細觀察可以發現,這個概率矩陣不管進行幾次計算,都不會收斂,而且,對於\(P_{11}\)和\(P_{22}\)而言,僅在奇數步后到達,在偶數步時,永遠不可達。因此,無法進行隨機游走(本來它就沒有隨機項供人選擇)
為了解決這個問題,我們可以為其添加自環來消除奇偶冪次帶來的影響:
MCL
Markov Chain Cluster Structure
利用 Random Walks 可以求出最終的概率矩陣,但是,在求的過程中,也丟失了大量的信息。

還是這張圖,它的概率矩陣和最終的概率矩陣如下:
從最終的矩陣可以看出,其最終概率和起始點的位置無關!對於聚類,這並不是一個好消息,因為我們想要得到的是一個有明顯區分度的矩陣來表示不同的類別。因此,我們需要對其進行一定的修改,這也是MCL主要要解決的問題。
Inflation
如果說,前面的內容在介紹 Markov Chain 如何進行 Expansion 的話,那么,現在就添加一個新的過程: Inflation 。這個過程就是為了解決 Expansion 所導致的概率趨同問題的。
簡單的說,Inflation 就是將概率矩陣中的每個值進行了一次冪次擴大,這樣就能使得強化緊密的點,弱化松散的點。(強者恆強,弱者恆弱)
假設有矩陣\(M^{k \times l}\),和一個給定的非負實數\(r\),經過 Inflation 強化后的矩陣為\(\Gamma_rM\),那么它的強化公式如下:
為了更直觀的說明,我們來看下面的一個例子:
在 Inflation 之前,向量\(A\) 就是一個正常的概率向量。為了令其具有更明顯的區分度,對其進行 Inflation 強化。
假設\(r\)的取值為2,\(A^2\)如下:
對該向量進行標准化,保證\(\sum\limits_{i=1}^n A_i = 1\)。
可以看出,進過一次變換后,區分度進一步的增加,這就為之后的聚類提供了保證。在這里要注明的是Inflation 的參數\(r\)會影響聚簇的粒度,這個在之后會有說明。
MCL Algorithm
在MCL中, Expansion 和 Inflation 將不斷的交替進行,Expansion 使得不同的區域之間的聯系加強,而 Inflation 則不斷的分化各點之間的聯系。經過多次迭代,將漸漸出現聚集現象,以此便達到了聚類的效果。
MCL的算法流程具體如下:
- 輸入:一個非全連通圖,Expansion 時的參數\(e\)和 Inflation 的參數\(r\)。

-
建立鄰接矩陣
\[edge = \left[ \matrix{ 0 & 1 & 1 & 1 \cr 1 & 0 & 0 & 1 \cr 1 & 0 & 0 & 0 \cr 1 & 1 & 0 & 0 } \right] \] -
添加自環
\[edge' = \left[ \matrix{ 1 & 1 & 1 & 1 \cr 1 & 1 & 0 & 1 \cr 1 & 0 & 1 & 0 \cr 1 & 1 & 0 & 1 } \right] \]
-
標准化概率矩陣
\[P_0 = \left[ \matrix{ 1/4 & 1/3 & 1/2 & 1/3 \cr 1/4 & 1/3 & 0 & 1/3 \cr 1/4 & 0 & 1/2 & 0 \cr 1/4 & 1/3 & 0 & 1/3 } \right] \] -
Expansion操作,每次對矩陣進行\(e\)次冪方
\[P_1 = P_0P_0 = \left[ \matrix{ .35 & .31 & .38 & .31 \cr .23 & .31 & .13 & .31 \cr .19 & .08 & .38 & .08 \cr .23 & .31 & .13 & .31 } \right] \] -
Inflation操作,每次對矩陣內元素進行r次冪方,再進行標准化
\[P_1' = \left[ \matrix{ .13 & .09 & .14 & .09 \cr .05 & .09 & .02 & .09 \cr .04 & .01 & .14 & .01 \cr .05 & .09 & .02 & .09 } \right] \\ \Gamma_rP_1 = \left[ \matrix{ .47 & .33 & .45 & .33 \cr .20 & .33 & .05 & .33 \cr .13 & .02 & .45 & .02 \cr .20 & .33 & .05 & .33 } \right] \] -
重復步驟5和6,直到達到穩定
-
將結果矩陣轉化為聚簇
MCL Algorithm Convergence
在作者的論文中,並沒有證明MCL算法的收斂性。但是,在實驗過程中,總是能夠達到最終的收斂狀態。下圖是一個達到收斂的例子:

為了方便區分不同聚簇,我們將圖上的點分為兩類:Attractor 和 Vertex 。Attractor 代表了那些有着主導地位的點,這些點吸引着其它的點,將它們牢牢的聚集在周圍;Vertex 則表示那些被吸引的點,它們沒有主導地位,被 Attractor 所吸引着。其中,Attractor 所在的行必須至少有一個正值,聚集着它所在行中所有正值的點。可以看出,在這個例子中,總共有三個聚簇:{1,6,7,10},{2,3,5},{4,8,9,11,12}。
當然,在MCL中也會存在着重疊的聚簇。如下圖,當且僅當簇與簇是同構的時才出現一個點被多個聚簇所吸引。

Inflation Parameter
在之前有提到過Inflation 參數會對聚簇產生影響。一般的,隨着\(r\)的增大,其粒度將減小。

從上圖中還可以看出,聚簇的多少和\(e\)有着很大的關系,在大直徑的圖中就更為明顯了。因為偏遠地區的點和簇群中心的聯系越來越少,便很可能出現“挖牆腳”的可能,以及簇群內部分化問題。

Analysis of MCL
MCL有着較為優良的性能,總的來說,它的優缺點如下:
-
隨着圖大小的擴張,MCL有着良好的刻度
-
可以在有權或無權的圖上運行
-
最后的聚類結果令人滿意
-
可以較好的處理噪聲數據
-
不需要人為規定簇群數量,而是可以根據參數自行確定
-
不能發現發生重疊的點
-
不適合在大圖上使用(它的算法復雜度是\(O(N^3)\))
以上是我對MCL的一些總結看法,歡迎大家來和我交流討論。
