譜聚類演算法及其程式碼(Spectral Clustering)
簡介
文章將介紹譜聚類(spectral clustering)的基本演算法,以及在matlab下的程式碼實現。介紹內容將包括:
- 從圖分割角度直觀理解譜聚類
- 譜聚類演算法步驟
- 資料以及實現程式碼
本文將不會涉及細節化的證明和推導,如有興趣可參考july大神的文章從拉普拉斯矩陣說到譜聚類.
對譜聚類的理解
這一節將從圖分割聚類的角度直觀理解譜聚類。不過,因為本人是從事社交媒體分析的,將從一種社會關係網路的角度來介紹網路圖分割成多個子圖的概念。
圖的分割
首先將社會關係網路看成是一個整體,每一個個體(user)就是這個網路中的各個節點(node),而連線個體的就是各個節點之間的邊(edge)。在不同性質的網路中,邊的定義可能有所不同,這裡可以簡單的理解成個體之間關係的親密度。如圖(1)所示
每個個體與其他個體之間都有關係親密度(也叫做權重,設定範圍是[0,1]),可以看到user1,2,3之間關係緊密,user4,5,6關係緊密,而兩個小部分是靠著user2和user6來聯絡的。以現實生活為例,123是A班級同學,456是B班級同學,2和6正好是認識的,關係一般,所以我們可以直觀的把2和6之間的邊給截斷(cut),從而形成兩個互不相關的子圖,這樣就完成了對這個網路的分割。
圖的泛化意義
很多時候,並不是說一定要實際生活中是一個網路(network)的事物,才能夠用圖(graph)模型來表示。圖模型只是解決問題的一個模型,可能一個物件既可以用圖模型,也可以用非圖模型來解決(拓撲,非拓撲)。舉個例子,在聚類,我們之前(
譜聚類的意義
譜聚類要做的事情就是完成對圖的分割,它想要找到最好的分割方式,來將圖分割開來。這種對圖的分割,取決於你如何定義這個圖。比如,圖中的點是什麼?圖中的邊又是怎麼確定的?最優分割的標準又是怎麼樣的?等等。對圖本身定義的不同,就會導致不同的分割結果,所以我們為了明確這些東西,在這裡以一個實際的定義為準,事先宣告,圖的定義也可以用其他方式,不過我這裡用的就是現在常用的相似度矩陣圖模型。
我們要解決的問題是:給定資料{
而我們將這些資料點都看成是資料的節點,它們之間的相似度定義為邊的權重值,相似度矩陣為
高斯相似度來計算的,其中
這樣計算。
因為沒有給出關於截的概念,所以沒有辦法給出優化函式的形式,具體內容,還請參考從拉普拉斯矩陣說到譜聚類。
譜聚類演算法步驟
這一小節將會給出譜聚類演算法的步驟,整體來說,譜聚類演算法要做的就是先求出相似性矩陣,然後對該矩陣歸一化運算,之後求前
實際上,譜聚類要做的事情其實就是將高維度的資料,以特徵向量的形式簡潔表達,屬於一種降維的過程。本來高維度用k-means不好分的點,在經過線性變換以及降維之後,十分容易求解。下面就給出步驟:
1. 按照式
2. 將