譜聚類(spectral clustering)原理總結

譜聚類(spectral clustering)是普遍使用的聚類算法,比起傳統的K-Means算法,譜聚類對數據分佈的適應性更強,聚類效果也很優秀,同時聚類的計算量也小不少,更加難能難得的是實現起來也不復雜。在處理實際的聚類問題時,我的認爲譜聚類是應該首先考慮的幾種算法之一。下面咱們就對譜聚類的算法原理作一個總結。算法

1、譜聚類概述

    譜聚類是從圖論中演化出來的算法,後來在聚類中獲得了普遍的應用。它的主要思想是把全部的數據看作空間中的點,這些點之間能夠用邊鏈接起來。距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,經過對全部數據點組成的圖進行切圖,讓切圖後不一樣的子圖間邊權重和儘量的低,而子圖內的邊權重和儘量的高,從而達到聚類的目的。微信

    乍一看,這個算法原理的確簡單,可是要徹底理解這個算法的話,須要對圖論中的無向圖,線性代數和矩陣分析都有必定的瞭解。下面咱們就從這些須要的基礎知識開始,一步步學習譜聚類。函數

2、譜聚類基礎之一:無向權重圖

    因爲譜聚類是基於圖論的,所以咱們首先溫習下圖的概念。對於一個圖\(G\),咱們通常用點的集合\(V\)和邊的集合\(E\)來描述。即爲\(G(V,E)\)。其中\(V\)即爲咱們數據集裏面全部的點\((v_1, v_2,...v_n)\)。對於\(V\)中的任意兩個點,能夠有邊鏈接,也能夠沒有邊鏈接。咱們定義權重\(w_{ij}\)爲點\(v_i\)和點\(v_j\)之間的權重。因爲咱們是無向圖,因此\(w_{ij} = w_{ji}\)學習

    對於有邊鏈接的兩個點\(v_i\)\(v_j\)\(w_{ij} >; 0\),對於沒有邊鏈接的兩個點\(v_i\)\(v_j\)\(w_{ij} = 0\)。對於圖中的任意一個點\(v_i\),它的度\(d_i\)定義爲和它相連的全部邊的權重之和,即
\[ d_i = \sum\limits_{j=1}^{n}w_{ij} \]優化

    利用每一個點度的定義,咱們能夠獲得一個nxn的度矩陣\(D\),它是一個對角矩陣,只有主對角線有值,對應第i行的第i個點的度數,定義以下:spa

\[ \mathbf{D} = \left( \begin{array}{ccc} d_1 & \ldots & \ldots \\ \ldots & d_2 & \ldots \\   \vdots & \vdots & \ddots \\   \ldots & \ldots & d_n \end{array} \right) \]blog

    利用全部點之間的權重值,咱們能夠獲得圖的鄰接矩陣\(W\),它也是一個nxn的矩陣,第i行的第j個值對應咱們的權重\(w_{ij}\)ci

    除此以外,對於點集\(V\)的的一個子集\(A \subset V\),咱們定義:
\[ |A|: = 子集A中點的個數 \]數學

\[ vol(A): = \sum\limits_{i \in A}d_i \]it

3、譜聚類基礎之二:類似矩陣

    在上一節咱們講到了鄰接矩陣\(W\),它是由任意兩點之間的權重值\(w_{ij}\)組成的矩陣。一般咱們能夠本身輸入權重,可是在譜聚類中,咱們只有數據點的定義,並無直接給出這個鄰接矩陣,那麼怎麼獲得這個鄰接矩陣呢?

    基本思想是,距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,不過這僅僅是定性,咱們須要定量的權重值。通常來講,咱們能夠經過樣本點距離度量的類似矩陣\(S\)來得到鄰接矩陣\(W\)

    構建鄰接矩陣\(W\)的方法有三類。\(\epsilon\)-鄰近法,K鄰近法和全鏈接法。

    對於\(\epsilon\)-鄰近法,它設置了一個距離閾值\(\epsilon\),而後用歐式距離\(s_{ij}\)度量任意兩點\(x_i\)\(x_j\)的距離。即類似矩陣的\(s_{ij} = ||x_i-x_j||_2^2\),  而後根據\(s_{ij}\)\(\epsilon\)的大小關係,來定義鄰接矩陣\(W\)以下:

\[ w_{ij}= \begin{cases} 0& {s_{ij} >; \epsilon}\\ \epsilon& {{s_{ij} \leq \epsilon}} \end{cases} \]

    從上式可見,兩點間的權重要不就是\(\epsilon\),要不就是0,沒有其餘的信息了。距離遠近度量很不精確,所以在實際應用中,咱們不多使用\(\epsilon\)-鄰近法。

    第二種定義鄰接矩陣\(W\)的方法是K鄰近法,利用KNN算法遍歷全部的樣本點,取每一個樣本最近的k個點做爲近鄰,只有和樣本距離最近的k個點之間的\(w_{ij} >; 0\)。可是這種方法會形成重構以後的鄰接矩陣W非對稱,咱們後面的算法須要對稱鄰接矩陣。爲了解決這種問題,通常採起下面兩種方法之一:

    第一種K鄰近法是隻要一個點在另外一個點的K近鄰中,則保留\(s_{ij}\)

\[ w_{ij}=w_{ji}= \begin{cases} 0& {x_i \notin KNN(x_j) \;and \;x_j \notin KNN(x_i)}\\ exp(-\frac{||x_i-x_j||_2^2}{2\sigma^2})& {x_i \in KNN(x_j)\; or\; x_j \in KNN(x_i}) \end{cases} \]

    第二種K鄰近法是必須兩個點互爲K近鄰中,才能保留\(s_{ij}\)

\[ w_{ij}=w_{ji}= \begin{cases} 0& {x_i \notin KNN(x_j) \;or\;x_j \notin KNN(x_i)}\\ exp(-\frac{||x_i-x_j||_2^2}{2\sigma^2})& {x_i \in KNN(x_j)\; and \; x_j \in KNN(x_i}) \end{cases} \]

    第三種定義鄰接矩陣\(W\)的方法是全鏈接法,相比前兩種方法,第三種方法全部的點之間的權重值都大於0,所以稱之爲全鏈接法。能夠選擇不一樣的核函數來定義邊權重,經常使用的有多項式核函數,高斯核函數和Sigmoid核函數。最經常使用的是高斯核函數RBF,此時類似矩陣和鄰接矩陣相同:
\[ w_{ij}=s_{ij}=exp(-\frac{||x_i-x_j||_2^2}{2\sigma^2}) \]

    在實際的應用中,使用第三種全鏈接法來創建鄰接矩陣是最廣泛的,而在全鏈接法中使用高斯徑向核RBF是最廣泛的。

4、譜聚類基礎之三:拉普拉斯矩陣

    單獨把拉普拉斯矩陣(Graph Laplacians)拿出來介紹是由於後面的算法和這個矩陣的性質息息相關。它的定義很簡單,拉普拉斯矩陣\(L= D-W\)\(D\)即爲咱們第二節講的度矩陣,它是一個對角矩陣。而\(W\)即爲咱們第二節講的鄰接矩陣,它能夠由咱們第三節的方法構建出。

    拉普拉斯矩陣有一些很好的性質以下:

    1)拉普拉斯矩陣是對稱矩陣,這能夠由\(D\)\(W\)都是對稱矩陣而得。

    2)因爲拉普拉斯矩陣是對稱矩陣,則它的全部的特徵值都是實數。

    3)對於任意的向量\(f\),咱們有
\[ f^TLf = \frac{1}{2}\sum\limits_{i,j=1}^{n}w_{ij}(f_i-f_j)^2 \]

      這個利用拉普拉斯矩陣的定義很容易獲得以下:

\[ f^TLf = f^TDf - f^TWf = \sum\limits_{i=1}^{n}d_if_i^2 - \sum\limits_{i,j=1}^{n}w_{ij}f_if_j \]

\[ =\frac{1}{2}( \sum\limits_{i=1}^{n}d_if_i^2 - 2 \sum\limits_{i,j=1}^{n}w_{ij}f_if_j + \sum\limits_{j=1}^{n}d_jf_j^2) = \frac{1}{2}\sum\limits_{i,j=1}^{n}w_{ij}(f_i-f_j)^2  \]

    4) 拉普拉斯矩陣是半正定的,且對應的n個實數特徵值都大於等於0,即\(0 =\lambda_1 \leq \lambda_2 \leq... \leq \lambda_n\), 且最小的特徵值爲0,這個由性質3很容易得出。

5、譜聚類基礎之四:無向圖切圖

    對於無向圖\(G\)的切圖,咱們的目標是將圖\(G(V,E)\)切成相互沒有鏈接的k個子圖,每一個子圖點的集合爲:\(A_1,A_2,..A_k\),它們知足\(A_i \cap A_j = \emptyset\),且\(A_1 \cup A_2 \cup ... \cup A_k = V\).

    對於任意兩個子圖點的集合\(A, B \subset V\), \(A \cap B =  \emptyset\), 咱們定義A和B之間的切圖權重爲:
\[ W(A, B) = \sum\limits_{i \in A, j \in B}w_{ij} \]

    那麼對於咱們k個子圖點的集合:\(A_1,A_2,..A_k\),咱們定義切圖cut爲:
\[ cut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}W(A_i, \overline{A}_i ) \]

     其中\(\overline{A}_i \)\(A_i\)的補集,意爲除\(A_i\)子集外其餘V的子集的並集。

    那麼如何切圖可讓子圖內的點權重和高,子圖間的點權重和低呢?一個天然的想法就是最小化\(cut(A_1,A_2,...A_k)\), 可是能夠發現,這種極小化的切圖存在問題,以下圖:

    咱們選擇一個權重最小的邊緣的點,好比C和H之間進行cut,這樣能夠最小化\(cut(A_1,A_2,...A_k)\), 可是卻不是最優的切圖,如何避免這種切圖,而且找到相似圖中"Best Cut"這樣的最優切圖呢?咱們下一節就來看看譜聚類使用的切圖方法。

6、譜聚類之切圖聚類

    爲了不最小切圖致使的切圖效果不佳,咱們須要對每一個子圖的規模作出限定,通常來講,有兩種切圖方式,第一種是RatioCut,第二種是Ncut。下面咱們分別加以介紹。

6.1 RatioCut切圖

    RatioCut切圖爲了不第五節的最小切圖,對每一個切圖,不光考慮最小化\(cut(A_1,A_2,...A_k)\),它還同時考慮最大化每一個子圖點的個數,即:
\[ RatioCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{|A_i|} \]

    那麼怎麼最小化這個RatioCut函數呢?牛人們發現,RatioCut函數能夠經過以下方式表示。

    咱們引入指示向量\(h_j \in \{h_1, h_2,..h_k\}\; j =1,2,...k\),對於任意一個向量\(h_j\), 它是一個n維向量(n爲樣本數),咱們定義\(h_{ij}\)爲:

\[ h_{ij}= \begin{cases} 0& { v_i \notin A_j}\\ \frac{1}{\sqrt{|A_j|}}& { v_i \in A_j} \end{cases} \]

    那麼咱們對於\(h_i^TLh_i\),有:

\[ \begin{align} h_i^TLh_i & = \frac{1}{2}\sum\limits_{m=1}\sum\limits_{n=1}w_{mn}(h_{im}-h_{in})^2 \\& =\frac{1}{2}(\sum\limits_{m \in A_i, n \notin A_i}w_{mn}(\frac{1}{\sqrt{|A_i|}} - 0)^2 +  \sum\limits_{m \notin A_i, n \in A_i}w_{mn}(0 - \frac{1}{\sqrt{|A_i|}} )^2\\& = \frac{1}{2}(\sum\limits_{m \in A_i, n \notin A_i}w_{mn}\frac{1}{|A_i|} +  \sum\limits_{m \notin A_i, n \in A_i}w_{mn}\frac{1}{|A_i|}\\& = \frac{1}{2}(cut(A_i, \overline{A}_i) \frac{1}{|A_i|} + cut(\overline{A}_i, A_i) \frac{1}{|A_i|}) \\& =  \frac{cut(A_i, \overline{A}_i)}{|A_i|} \end{align} \]

    上述第(1)式用了上面第四節的拉普拉斯矩陣的性質3. 第二式用到了指示向量的定義。能夠看出,對於某一個子圖i,它的RatioCut對應於\(h_i^TLh_i\),那麼咱們的k個子圖呢?對應的RatioCut函數表達式爲:
\[ RatioCut(A_1,A_2,...A_k) = \sum\limits_{i=1}^{k}h_i^TLh_i = \sum\limits_{i=1}^{k}(H^TLH)_{ii} = tr(H^TLH) \]

    其中\(tr(H^TLH)\)爲矩陣的跡。也就是說,咱們的RatioCut切圖,實際上就是最小化咱們的\(tr(H^TLH)\)。注意到\(H^TH=I\),則咱們的切圖優化目標爲:
\[ \underbrace{arg\;min}_H\; tr(H^TLH) \;\; s.t.\;H^TH=I \]

    注意到咱們H矩陣裏面的每個指示向量都是n維的,向量中每一個變量的取值爲0或者\(\frac{1}{\sqrt{|A_j|}}\),就有\(2^n\)種取值,有k個子圖的話就有k個指示向量,共有\(k2^n\)種H,所以找到知足上面優化目標的H是一個NP難的問題。那麼是否是就沒有辦法了呢?

    注意觀察\(tr(H^TLH)\)中每個優化子目標\(h_i^TLh_i\),其中\(h\)是單位正交基, L爲對稱矩陣,此時\(h_i^TLh_i\)的最大值爲L的最大特徵值,最小值是L的最小特徵值。若是你對主成分分析PCA很熟悉的話,這裏很好理解。在PCA中,咱們的目標是找到協方差矩陣(對應此處的拉普拉斯矩陣L)的最大的特徵值,而在咱們的譜聚類中,咱們的目標是找到目標的最小的特徵值,獲得對應的特徵向量,此時對應二分切圖效果最佳。也就是說,咱們這裏要用到維度規約的思想來近似去解決這個NP難的問題。

    對於\(h_i^TLh_i\),咱們的目標是找到最小的L的特徵值,而對於\(tr(H^TLH) = \sum\limits_{i=1}^{k}h_i^TLh_i\),則咱們的目標就是找到k個最小的特徵值,通常來講,k遠遠小於n,也就是說,此時咱們進行了維度規約,將維度從n降到了k,從而近似能夠解決這個NP難的問題。

    經過找到L的最小的k個特徵值,能夠獲得對應的k個特徵向量,這k個特徵向量組成一個nxk維度的矩陣,即爲咱們的H。通常須要對H矩陣按行作標準化,即
\[ h_{ij}^{*}= \frac{h_{ij}}{(\sum\limits_{t=1}^kh_{it}^{2})^{1/2}} \]

    因爲咱們在使用維度規約的時候損失了少許信息,致使獲得的優化後的指示向量h對應的H如今不能徹底指示各樣本的歸屬,所以通常在獲得nxk維度的矩陣H後還須要對每一行進行一次傳統的聚類,好比使用K-Means聚類.

6.2 Ncut切圖

    Ncut切圖和RatioCut切圖很相似,可是把Ratiocut的分母\(|Ai|\)換成\(vol(A_i)\). 因爲子圖樣本的個數多並不必定權重就大,咱們切圖時基於權重也更合咱們的目標,所以通常來講Ncut切圖優於RatioCut切圖。
\[ NCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{vol(A_i)} \]

    ,對應的,Ncut切圖對指示向量\(h\)作了改進。注意到RatioCut切圖的指示向量使用的是\(\frac{1}{\sqrt{|A_j|}}\)標示樣本歸屬,而Ncut切圖使用了子圖權重\(\frac{1}{\sqrt{vol(A_j)}}\)來標示指示向量h,定義以下:

\[ h_{ij}= \begin{cases} 0& { v_i \notin A_j}\\ \frac{1}{\sqrt{vol(A_j)}}& { v_i \in A_j} \end{cases} \]

    那麼咱們對於\(h_i^TLh_i\),有:

\[ \begin{align} h_i^TLh_i & = \frac{1}{2}\sum\limits_{m=1}\sum\limits_{n=1}w_{mn}(h_{im}-h_{in})^2 \\& =\frac{1}{2}(\sum\limits_{m \in A_i, n \notin A_i}w_{mn}(\frac{1}{\sqrt{vol(A_i)}} - 0)^2 +  \sum\limits_{m \notin A_i, n \in A_i}w_{mn}(0 - \frac{1}{\sqrt{vol(A_i)}} )^2\\& = \frac{1}{2}(\sum\limits_{m \in A_i, n \notin A_i}w_{mn}\frac{1}{vol(A_i)} +  \sum\limits_{m \notin A_i, n \in A_i}w_{mn}\frac{1}{vol(A_i)}\\& = \frac{1}{2}(cut(A_i, \overline{A}_i) \frac{1}{vol(A_i)} + cut(\overline{A}_i, A_i) \frac{1}{vol(A_i)}) \\& =  \frac{cut(A_i, \overline{A}_i)}{vol(A_i)} \end{align} \]

    推導方式和RatioCut徹底一致。也就是說,咱們的優化目標仍然是
\[ NCut(A_1,A_2,...A_k) = \sum\limits_{i=1}^{k}h_i^TLh_i = \sum\limits_{i=1}^{k}(H^TLH)_{ii} = tr(H^TLH) \]

    可是此時咱們的\(H^TH \neq I\),而是\(H^TDH = I\)。推導以下:
\[  h_i^TDh_i = \sum\limits_{j=1}^{n}h_{ij}^2d_j =\frac{1}{vol(A_i)}\sum\limits_{j \in A_i}d_j= \frac{1}{vol(A_i)}vol(A_i) =1 \]

    也就是說,此時咱們的優化目標最終爲:
\[ \underbrace{arg\;min}_H\; tr(H^TLH) \;\; s.t.\;H^TDH=I \]

    此時咱們的H中的指示向量\(h\)並非標準正交基,因此在RatioCut裏面的降維思想不能直接用。怎麼辦呢?其實只須要將指示向量矩陣H作一個小小的轉化便可。

    咱們令\(H = D^{-1/2}F\), 則:\(H^TLH = F^TD^{-1/2}LD^{-1/2}F\)\(H^TDH=F^TF = I\),也就是說優化目標變成了:
\[ \underbrace{arg\;min}_F\; tr(F^TD^{-1/2}LD^{-1/2}F) \;\; s.t.\;F^TF=I \]

    能夠發現這個式子和RatioCut基本一致,只是中間的L變成了\(D^{-1/2}LD^{-1/2}\)。這樣咱們就能夠繼續按照RatioCut的思想,求出\(D^{-1/2}LD^{-1/2}\)的最小的前k個特徵值,而後求出對應的特徵向量,並標準化,獲得最後的特徵矩陣\(F\),最後對\(F\)進行一次傳統的聚類(好比K-Means)便可。

    通常來講, \(D^{-1/2}LD^{-1/2}\)至關於對拉普拉斯矩陣\(L\)作了一次標準化,即\(\frac{L_{ij}}{\sqrt{d_i*d_j}}\)

7、譜聚類算法流程

    鋪墊了這麼久,終於能夠總結下譜聚類的基本流程了。通常來講,譜聚類主要的注意點爲類似矩陣的生成方式(參見第二節),切圖的方式(參見第六節)以及最後的聚類方法(參見第六節)。

    最經常使用的類似矩陣的生成方式是基於高斯核距離的全鏈接方式,最經常使用的切圖方式是Ncut。而到最後經常使用的聚類方法爲K-Means。下面以Ncut總結譜聚類算法流程。

    輸入:樣本集D=\((x_1,x_2,...,x_n)\),類似矩陣的生成方式, 降維後的維度\(k_1\), 聚類方法,聚類後的維度\(k_2\)

    輸出: 簇劃分\(C(c_1,c_2,...c_{k_2})\). 

    1) 根據輸入的類似矩陣的生成方式構建樣本的類似矩陣S

    2)根據類似矩陣S構建鄰接矩陣W,構建度矩陣D

    3)計算出拉普拉斯矩陣L

    4)構建標準化後的拉普拉斯矩陣\(D^{-1/2}LD^{-1/2}\)

    5)計算\(D^{-1/2}LD^{-1/2}\)最小的\(k_1\)個特徵值所各自對應的特徵向量\(f\)

    6) 將各自對應的特徵向量\(f\)組成的矩陣按行標準化,最終組成\(n \times k_1\)維的特徵矩陣F

    7)對F中的每一行做爲一個\(k_1\)維的樣本,共n個樣本,用輸入的聚類方法進行聚類,聚類維數爲\(k_2\)

    8)獲得簇劃分\(C(c_1,c_2,...c_{k_2})\).         

8、譜聚類算法總結

    譜聚類算法是一個使用起來簡單,可是講清楚卻不是那麼容易的算法,它須要你有必定的數學基礎。若是你掌握了譜聚類,相信你會對矩陣分析,圖論有更深刻的理解。同時對降維裏的主成分分析也會加深理解。

    下面總結下譜聚類算法的優缺點。

    譜聚類算法的主要優勢有:

    1)譜聚類只須要數據之間的類似度矩陣,所以對於處理稀疏數據的聚類頗有效。這點傳統聚類算法好比K-Means很難作到

    2)因爲使用了降維,所以在處理高維數據聚類時的複雜度比傳統聚類算法好。

    譜聚類算法的主要缺點有:

    1)若是最終聚類的維度很是高,則因爲降維的幅度不夠,譜聚類的運行速度和最後的聚類效果均很差。

    2) 聚類效果依賴於類似矩陣,不一樣的類似矩陣獲得的最終聚類效果可能很不一樣。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索