1. 程式人生 > >通俗易懂描述譜聚類

通俗易懂描述譜聚類

複習:實對稱陣的特徵值是實數因此實對稱陣不同特徵值的特徵向量一定是正交的,這個正交是實數範圍內的正交。

首先我們來看什麼叫譜這個字是什麼意思,比如說我們唱歌的時候有一個歌譜,那個歌譜就來確定了我們這首歌它唱的旋律是什麼樣子,我們唱的這個歌是不是在譜上,有沒有跑調對吧。

而這個我們想定義一個矩陣A它的譜怎麼定義呢?OK,因為矩陣A我們可以用它的特徵值\lambda _{1}......\lambda _{n}去做度量的。因為Au=\lambda u,那麼這樣的話入本身可以作為A的一種度量方案。那這樣我們把所有的特徵值拿出來,我們就認為得到了A它的譜,也就是說一個方陣它的全體就構成了譜,這就是它的定義了。然後呢,一個矩陣A的話往往是用A^{T}A去求它的最大特徵值把它叫做譜。然後所謂的譜半徑就是所有的譜中的那個最大的那個值。所以以後要是看到某個演算法聲稱叫做譜什麼的,它極有可能就是用的特徵值和特徵向量的辦法去來求的。而這個譜聚類真的是基於圖論的辦法來做聚類,然後來求這個樣本資料的拉普拉斯矩陣,對這個矩陣去求特徵向量,利用這個特徵向量做聚類,從而達到對樣本資料做聚類的目的。

我們先來看它是怎麼做的,在來形式化的看一下為什麼。

先看第一點,就是說對於這樣一個演算法我們其實第一步要來度量第i個和第j個樣本的相似度S_{ij},這個其實是這麼來度量相似度的問題,最常用的相似度是高斯相似度也就是所謂的徑向基函式(RBF)(它其實就是度量了兩個樣本之間的相似性)。那麼現在任意兩個樣本都能求這個S_{ij},如果是有ñ個樣本的時候,形成了ñ階的矩陣,並且我們如果是用這種高斯相似度的話,而且S_{ij}是對於S_{ji}的,因此這樣一個矩陣是對稱的。現在不管怎麼樣能夠得到一個相似度的矩陣S,當然我們做一個規定,就是對角線上都寫零,這是為了方便我們做計算。我們把第i個樣本到所有樣本相似度的和加起來叫做度。第i個樣本它的度就等於d_{i}=S_{i1}+S_{i1}+......+S_{in}

。我們把相似度就認為是連線邊的權值,那這個加和不就是這個點它出現的權值的和嘛。然後我們把所有的d寫在一個矩陣的對 線上,其它位置都取零。

現在我們做一個最為神奇的事情,我們先去用這D這個矩陣,減去W這矩陣得到一個新的矩陣我們把它叫做拉普拉斯矩陣L = DW。因為D和W都是一個對稱的,所以L也是一個對稱的矩陣。所以我們對於這樣一個對稱的矩陣就可以求它的特徵值和特徵向量。

拉普拉斯矩陣:L=D-W

這個D和W都是對稱陣,對它做一個變換:

                                                               f^{T}Lf=f^{T}Df-f^{T}Wf

=

                                                                 \sum_{i=1}^{n}d_{i}f_{i}^{2}-\sum_{i,j=1}^{n}f_{i}f_{j}w_{ij}=

                                                   \frac{1}{2}\left ( \sum_{i=1}^{n}d_{i}f_{i}^{2}-2\sum_{i,j=1}^{n}f_{i}f_{j}w_{ij}+\sum_{j=1}^{n}d_{j}f_{j}^{2} \right )=

                                                                  \frac{1}{2}\sum_{i,j=1}^{n}w_{ij}(f_{i}-f_{j})^{2}

它有若干個特徵值\lambda _{1}......\lambda _{n},比如前面很多\lambda都是零,對應的也有n個特徵向量u _{1}......u_{n},我們現在如果是來做一個聚類,要求它的簇的個數是k個,那我們就取前k個\lambda,從小到大排得到\lambda _{1}......\lambda _{k}。但別忘了,這個L矩陣是一個n乘n的矩陣,n是樣本個數,其實這個u1的樣子是(u_{11},u_{21}......u_{n1})^{T}這麼一個列向量,u2也是一樣的,uk也是。把它展開其實我們可以得到U這樣一個矩陣,它是n行k列的,因為我們只取了前k個嘛。對於這樣一個n行k列的矩陣U,我們這麼做呢?我們認為第一個樣本,它的特徵就是u11,……,u1k,第n個樣本的特徵就是un1,……unk,我們現在眼中就是對於這樣一個數據,相當於拿到手了n個樣本,而每個樣本都是k維的,我們做一個k均值總可以吧,其實相當於對這n個樣本做了一個聚類,聚成了k份對吧。那這樣的一個聚類結果不就相當於對原始的樣本做了一個聚類嘛。也就是說這個k均值的聚類結果是什麼我們最後的最終的聚類結果就是什麼,這就是所謂的譜聚類的做法。

再來總結一下,假定有m個樣本,這樣我們就可以定義一個Sij的相似度,比如說就用高斯相似度,我們現在就可以做一個矩陣W,其中每一個值表示第i個樣本到第j個樣本的相似度,然後呢我們對W讓它主對角線強制取零,把每一行的數都加起來再寫到對角線上並令其它元素等於零,得到了一個矩陣D,然後定義一個L=D-W,而這L是一個正定的,也就是說如果要去計算它的特徵值的時候,把它的特徵值從小到大排列,\lambda _{1}一定等於零,然後每一個特徵值都有一個特徵向量ui,而我們知道每個ui都是一個列向量,而我們在做譜聚類的時候選k個簇,然後選出前k小的特徵值\lambda _{1}......\lambda _{k},現在把它們展開,就截出了一個m行k列的矩陣,將這矩陣定義做U,我們現在換個視角,第一行的k個數是第一樣本的特徵,第m行的是第m個樣本的特徵,相當於我們本來的m個樣本用k均值聚類聚成了k個簇,它的最終結果是什麼,譜聚類的結果就是什麼。