Background
Different Clustering
Vector Clustering
我們在描述一個人時,常常會使用他所擁有的特點來表示,比如說:張三,男,高個子,有點壯。那麼,這就可以用四維向量來表示,如果再複雜一些,就是更高維的向量空間了。根據各個維度的特徵進行聚類是常見的數據分析任務,這類聚類方法包括:系統聚類法、K均值聚類法等。
Graph Clustering
和特徵聚類不同,圖聚類比較難以觀察,整個算法以各點之間的距離作爲突破口,可以這樣形容:張三,是王五的好朋友,剛認識李四,對趙六很是反感。那麼,對於該節點,我們無法直接得出他的特徵,但能知道他的活動圈。利用圖聚類,可以將同一社交範圍的人聚合到一起。馬爾科夫聚類MCL就是屬於圖聚類的一種。
Random Walks
首先看下圖:
從圖中,我們可以看到,不同的簇,應當具有以下的特點:
- 位於同一簇的點,其內部的聯繫應當緊密,而和外部的聯繫則比較少(惺惺相惜)
也就是說:如果你從一個點出發,到達其中的一個鄰近點,那麼你在簇內的可能性遠大於離開當前簇而到達新簇的可能性——這就是MCL的核心思想。如果在一張圖上進行多次的“Random Walks”,那麼就有很大可能發現簇羣,達到聚類的目的。而“Random Walks”的實現則是通過“Markov Chains”(馬爾柯夫鏈)。
Markov Chains
爲了說明 Markov Chain ,我們使用如下的簡單例子:
在此圖中,我們可以分爲兩個子圖(兩簇):和。在同一簇羣中,各點之間完全連接,在不同簇之間,僅有(2,5)一條邊。
- 現在,我們從出發,假設每條邊都一樣,那麼則一步之後我們有1/3的概率到達,1/3的概率到達,1/3的概率到達,同時,有0的概率到達。
- 對於,則有1/4的概率到達,有0的概率到達。
通過計算每個點到達其餘點的概率,我們可以得到如下的概率矩陣:
爲了計算簡單,我們使用一個更簡單的矩陣進行接下來的說明:
這表示的是從任意點出發,經過一步之後到達其它點的概率矩陣,那麼,經過兩次之後、三次以及最終的概率矩陣爲:
關於馬爾可夫鏈,請再具體參考相關資料,此處不作過多贅述。
Weighted Graphs
之前的例子中,圖的邊是沒有權值的,也就是所有的邊都是一樣的。現在,爲每條邊添加一個權重(可以理解爲親密程度),那麼,就需要重新計算到達每個點的概率了。
假設有如下的圖:
那麼,其概率矩陣怎麼計算?
首先,我們要計算得到鄰接矩陣,即:
通過鄰接矩陣,我們就可以計算得到概率矩陣了,具體計算公式如下:
最後的概率矩陣如下:
之後的計算相同。
Self Loops
在上述的例子中均未考慮一個重要的問題,我們先來看一個例子:
很簡單,就兩個點,一條邊。那麼,它的概率矩陣呢:
仔細觀察可以發現,這個概率矩陣不管進行幾次計算,都不會收斂,而且,對於P11和P22而言,僅在奇數步後到達,在偶數步時,永遠不可達。因此,無法進行隨機遊走(本來它就沒有隨機項供人選擇)
爲了解決這個問題,我們可以爲其添加自環來消除奇偶冪次帶來的影響:
MCL
Markov Chain Cluster Structure
利用 Random Walks 可以求出最終的概率矩陣,但是,在求的過程中,也丟失了大量的信息。
還是這張圖,它的概率矩陣和最終的概率矩陣如下:
從最終的矩陣可以看出,其最終概率和起始點的位置無關!對於聚類,這並不是一個好消息,因爲我們想要得到的是一個有明顯區分度的矩陣來表示不同的類別。因此,我們需要對其進行一定的修改,這也是MCL主要要解決的問題。
Inflation
如果說,前面的內容在介紹 Markov Chain 如何進行 Expansion 的話,那麼,現在就添加一個新的過程: Inflation 。這個過程就是爲了解決 Expansion 所導致的概率趨同問題的。
簡單的說,Inflation 就是將概率矩陣中的每個值進行了一次冪次擴大,這樣就能使得強化緊密的點,弱化鬆散的點。(強者恆強,弱者恆弱)
假設有矩陣,和一個給定的非負實數 r,經過 Inflation 強化後的矩陣爲,那麼它的強化公式如下:
爲了更直觀的說明,我們來看下面的一個例子:
在 Inflation 之前,向量AA 就是一個正常的概率向量。爲了令其具有更明顯的區分度,對其進行 Inflation 強化。
假設 r 的取值爲2,如下:
對該向量進行標準化,保證 。
可以看出,進過一次變換後,區分度進一步的增加,這就爲之後的聚類提供了保證。在這裏要註明的是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有着良好的刻度
- 可以在有權或無權的圖上運行
- 最後的聚類結果令人滿意
- 可以較好的處理噪聲數據
-
不需要人爲規定簇羣數量,而是可以根據參數自行確定
- 不能發現發生重疊的點
-
不適合在大圖上使用(它的算法複雜度是)
Reference