馬爾可夫聚類 MCL

本文轉載自:聚類算法——MCL 和 馬爾可夫聚類算法

Background

Different Clustering

Vector Clustering

我們在描述一個人時,常常會使用他所擁有的特點來表示,比如說:張三,男,高個子,有點壯。那麼,這就可以用四維向量來表示,如果再複雜一些,就是更高維的向量空間了。根據各個維度的特徵進行聚類是常見的數據分析任務,這類聚類方法包括:系統聚類法、K均值聚類法等。

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)。在同一簇羣中,各點之間完全連接,在不同簇之間,僅有(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

通過計算每個點到達其餘點的概率,我們可以得到如下的概率矩陣:

      

爲了計算簡單,我們使用一個更簡單的矩陣進行接下來的說明:

      

這表示的是從任意點出發,經過一步之後到達其它點的概率矩陣,那麼,經過兩次之後、三次以及最終的概率矩陣爲:

      

關於馬爾可夫鏈,請再具體參考相關資料,此處不作過多贅述。

Weighted Graphs

之前的例子中,圖的邊是沒有權值的,也就是所有的邊都是一樣的。現在,爲每條邊添加一個權重(可以理解爲親密程度),那麼,就需要重新計算到達每個點的概率了。

假設有如下的圖:

      

那麼,其概率矩陣怎麼計算?

首先,我們要計算得到鄰接矩陣,即:

      

通過鄰接矩陣,我們就可以計算得到概率矩陣了,具體計算公式如下:

      

最後的概率矩陣如下:

      

之後的計算相同。

Self Loops

在上述的例子中均未考慮一個重要的問題,我們先來看一個例子:

      

很簡單,就兩個點,一條邊。那麼,它的概率矩陣呢:

      

仔細觀察可以發現,這個概率矩陣不管進行幾次計算,都不會收斂,而且,對於P11和P22而言,僅在奇數步後到達,在偶數步時,永遠不可達。因此,無法進行隨機遊走(本來它就沒有隨機項供人選擇)

爲了解決這個問題,我們可以爲其添加自環來消除奇偶冪次帶來的影響:

      

MCL

Markov Chain Cluster Structure

利用 Random Walks 可以求出最終的概率矩陣,但是,在求的過程中,也丟失了大量的信息。

      

還是這張圖,它的概率矩陣和最終的概率矩陣如下:

      

從最終的矩陣可以看出,其最終概率和起始點的位置無關!對於聚類,這並不是一個好消息,因爲我們想要得到的是一個有明顯區分度的矩陣來表示不同的類別。因此,我們需要對其進行一定的修改,這也是MCL主要要解決的問題。

Inflation

如果說,前面的內容在介紹 Markov Chain 如何進行 Expansion 的話,那麼,現在就添加一個新的過程: Inflation 。這個過程就是爲了解決 Expansion 所導致的概率趨同問題的。

簡單的說,Inflation 就是將概率矩陣中的每個值進行了一次冪次擴大,這樣就能使得強化緊密的點,弱化鬆散的點。(強者恆強,弱者恆弱)

假設有矩陣M^{k\times l},和一個給定的非負實數 r,經過 Inflation 強化後的矩陣爲\Gamma _rM,那麼它的強化公式如下:

      

爲了更直觀的說明,我們來看下面的一個例子:

      

在 Inflation 之前,向量AA 就是一個正常的概率向量。爲了令其具有更明顯的區分度,對其進行 Inflation 強化。

假設 r 的取值爲2,A^2如下:

      

對該向量進行標準化,保證 \sum_{i=1}^{n}A_i=1  。

      

可以看出,進過一次變換後,區分度進一步的增加,這就爲之後的聚類提供了保證。在這裏要註明的是Inflation 的參數 r 會影響聚簇的粒度,這個在之後會有說明。

MCL Algorithm

在MCL中, Expansion 和 Inflation 將不斷的交替進行,Expansion 使得不同的區域之間的聯繫加強,而 Inflation 則不斷的分化各點之間的聯繫。經過多次迭代,將漸漸出現聚集現象,以此便達到了聚類的效果。

MCL的算法流程具體如下:

1 輸入:一個非全連通圖,Expansion 時的參數 e 和 Inflation 的參數 r 。

      

2 建立鄰接矩陣,並添加自環

      

3 標準化概率矩陣

      

4 Expansion操作,每次對矩陣進行ee次冪方

      

5 Inflation操作,每次對矩陣內元素進行r次冪方,再進行標準化

      

6 重複步驟4和5,直到達到穩定

7 將結果矩陣轉化爲聚簇

Code

代碼實現:

import numpy as np
 
def markovCluster(adjacencyMat, dimension, numIter, power = 2, inflation = 2):
    columnSum = np.sum(adjacencyMat, axis = 0)
    probabilityMat = adjacencyMat / columnSum
    
    #Expand by taking the e^th power of the matrix.
    def _expand(probabilityMat, power):
        expandMat = probabilityMat
        for i in range(power - 1):
            expandMat = np.dot(expandMat, probabilityMat)
        return expandMat
    expandMat = _expand(probabilityMat, power)
    
    #Inflate by taking inflation of the resulting 
    #matrix with parameter inflation. 
    def _inflate(expandMat, inflation):
        powerMat = expandMat
        for i in range(inflation - 1):
            powerMat = powerMat * expandMat
        inflateColumnSum = np.sum(powerMat, axis = 0)
        inflateMat = powerMat / inflateColumnSum
        return inflateMat
    inflateMat = _inflate(expandMat, inflation)
    
    for i in range(numIter):
        expand = _expand(inflateMat, power)
        inflateMat = _inflate(expand, inflation)
    print(inflateMat)
    
    
if __name__ == "__main__":
    dimension = 4
    numIter = 2
    adjacencyMat = np.array([[1, 1, 1, 1],
                             [1, 1, 0, 1],
                             [1, 0, 1, 0],
                             [1, 1, 0, 1]])
    markovCluster(adjacencyMat, dimension, numIter)

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 參數會對聚簇產生影響。一般的,隨着rr的增大,其粒度將減小。

      

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

      

Analysis of MCL

MCL有着較爲優良的性能,總的來說,它的優缺點如下:

  • 隨着圖大小的擴張,MCL有着良好的刻度
  • 可以在有權或無權的圖上運行
  • 最後的聚類結果令人滿意
  • 可以較好的處理噪聲數據
  • 不需要人爲規定簇羣數量,而是可以根據參數自行確定

  • 不能發現發生重疊的點
  • 不適合在大圖上使用(它的算法複雜度是O(N^3)

 

Reference

聚類算法——MCL 

馬爾可夫聚類算法

 

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