1. 程式人生 > >譜聚類演算法及其程式碼(Spectral Clustering)

譜聚類演算法及其程式碼(Spectral Clustering)

簡介

文章將介紹譜聚類(spectral clustering)的基本演算法,以及在matlab下的程式碼實現。介紹內容將包括:

  • 從圖分割角度直觀理解譜聚類
  • 譜聚類演算法步驟
  • 資料以及實現程式碼

本文將不會涉及細節化的證明和推導,如有興趣可參考july大神的文章從拉普拉斯矩陣說到譜聚類.

對譜聚類的理解

這一節將從圖分割聚類的角度直觀理解譜聚類。不過,因為本人是從事社交媒體分析的,將從一種社會關係網路的角度來介紹網路圖分割成多個子圖的概念。

圖的分割

首先將社會關係網路看成是一個整體,每一個個體(user)就是這個網路中的各個節點(node),而連線個體的就是各個節點之間的邊(edge)。在不同性質的網路中,邊的定義可能有所不同,這裡可以簡單的理解成個體之間關係的親密度。如圖(1)所示

圖(1)

每個個體與其他個體之間都有關係親密度(也叫做權重,設定範圍是[0,1]),可以看到user1,2,3之間關係緊密,user4,5,6關係緊密,而兩個小部分是靠著user2和user6來聯絡的。以現實生活為例,123是A班級同學,456是B班級同學,2和6正好是認識的,關係一般,所以我們可以直觀的把2和6之間的邊給截斷(cut),從而形成兩個互不相關的子圖,這樣就完成了對這個網路的分割。

圖的泛化意義

很多時候,並不是說一定要實際生活中是一個網路(network)的事物,才能夠用圖(graph)模型來表示。圖模型只是解決問題的一個模型,可能一個物件既可以用圖模型,也可以用非圖模型來解決(拓撲,非拓撲)。舉個例子,在聚類,我們之前(

K-means 聚類演算法及其程式碼實現)討論過如何將資料點看成是座標系下的一個個點,然後迭代找出中心點從而聚類。如果以另外一種視角,我們的座標系中的各個點看成是圖的節點,而點與點之間的相似性看成是邊的權重,我們同樣就構成了一個圖模型。所以圖與非圖是相對來看的,取決於哪個更好解決問題。

譜聚類的意義

譜聚類要做的事情就是完成對圖的分割,它想要找到最好的分割方式,來將圖分割開來。這種對圖的分割,取決於你如何定義這個圖。比如,圖中的點是什麼?圖中的邊又是怎麼確定的?最優分割的標準又是怎麼樣的?等等。對圖本身定義的不同,就會導致不同的分割結果,所以我們為了明確這些東西,在這裡以一個實際的定義為準,事先宣告,圖的定義也可以用其他方式,不過我這裡用的就是現在常用的相似度矩陣圖模型。

我們要解決的問題是:給定資料{x1,x2,x3,...,xN},將其分成K個類。

而我們將這些資料點都看成是資料的節點,它們之間的相似度定義為邊的權重值,相似度矩陣為W={wij|1iN,1jN},其中相似性是按照 

wij=e||xixj||22σ2(1)
高斯相似度來計算的,其中σ是一個超引數(hyperparameter)。當然其他的相似性(如餘弦相似度)也是同樣適用的。可以看出,相似度矩陣W是一個對稱(symmetric)矩陣。為了使某個單節點不會更容易被剔除,我們考慮一個歸一化的對角矩陣D(diagonal),對角線上元素是相似度矩陣一行(列,因為對稱行列一樣)所有元素的和,即 
D(i,i)=j=1Nxij(2)
這樣計算。

因為沒有給出關於截的概念,所以沒有辦法給出優化函式的形式,具體內容,還請參考從拉普拉斯矩陣說到譜聚類

譜聚類演算法步驟

這一小節將會給出譜聚類演算法的步驟,整體來說,譜聚類演算法要做的就是先求出相似性矩陣,然後對該矩陣歸一化運算,之後求前K個特徵向量,最後運用K-means演算法分類。 
實際上,譜聚類要做的事情其實就是將高維度的資料,以特徵向量的形式簡潔表達,屬於一種降維的過程。本來高維度用k-means不好分的點,在經過線性變換以及降維之後,十分容易求解。下面就給出步驟:

1. 按照式(1)計算相似性矩陣W 
2. 將W的對角線值,即W(i,i)=0,是為了排除自身的相似度