聚類算法實踐經驗彙總


所謂聚類,就是將相似的事物聚集在一起,而將不相似的事物劃分到不同的類別的過程,是數據分析之中十分重要的一種手段。比如古典生物學之中,人們通過物種的形貌特徵將其分門別類,可以說就是一種樸素的人工聚類。如此,我們就可以將世界上紛繁複雜的信息,簡化爲少數方便人們理解的類別,可以說是人類認知這個世界的最基本方式之一。

      在數據分析的術語之中,聚類和分類是兩種技術。分類是指我們已經知道了事物的類別,需要從樣品中學習分類的規則,是一種有指導學習;而聚類則是由我們來給定簡單的規則,從而得到分類,是一種無指導學習。兩者可以說是相反的過程。

       網上關於聚類算法的資料很多,但是其實大都是幾種最基本的方法,如K-means、層次聚類、SOM等,以及它們的許許多多的改進變種。這裏,我就來討論一下這些聚類算法,對它們的表現做一個簡單的評估。因爲內容有點多(其實主要是圖佔位置……),所以準備分幾次來完成。

 

0、測試數據集

      在介紹這些算法之前,這裏先給出兩個簡單的測試樣品組,下面每介紹完一個算法,可以直接看看它對這兩個樣品組的聚類結果,從而得到最直觀的認識。 

下圖就是兩個簡單的二維樣品組:

1)第一組樣品屬於最基本的聚類測試,界線還是比較分明的,不過三個cluster的大小有較明顯差異,可以測試一下算法對cluster size的敏感度。樣品總共有2000個數據點

2)第二組是典型的甜甜圈形。使用這樣的測試組主要是爲了考察算法對cluster形狀敏感度。共有1500個數據點。

聚類算法

聚類算法

      對於這樣的兩個樣品組,人類憑肉眼可以很容易地判斷它們應該分爲三個cluster(特別是我還用顏色做了區分……),但對於計算機就不一定了,所以就需要有足夠優秀的聚類算法。

 

1、相似性度量

      對於聚類,關鍵的一步是要告訴計算機怎樣計算兩個數據點的“相似性”,不同的算法需要的“相似性”是不一樣的。

      比如像以上兩組樣品,給出了每個數據點的空間座標,我們就可以用數據點之間的歐式距離來判斷,距離越近,數據點可以認爲越“相似”。當然,也可以用其它的度量方式,這跟所涉及的具體問題有關。

 

2、層次聚類

     層次聚類,是一種很直觀的算法。顧名思義就是要一層一層地進行聚類,可以從下而上地把小的cluster合併聚集,也可以從上而下地將大的cluster進行分割。似乎一般用得比較多的是從下而上地聚集,因此這裏我就只介紹這一種。

      所謂從下而上地合併cluster,具體而言,就是每次找到距離最短的兩個cluster,然後進行合併成一個大的cluster,直到全部合併爲一個cluster。整個過程就是建立一個樹結構,類似於下圖。

聚類算法

      那麼,如何判斷兩個cluster之間的距離呢?一開始每個數據點獨自作爲一個類,它們的距離就是這兩個點之間的距離。而對於包含不止一個數據點的cluster,就可以選擇多種方法了。最常用的,就是average-linkage,即計算兩個cluster各自數據點的兩兩距離的平均值。類似的還有single-linkage/complete-linkage,選擇兩個cluster中距離最短/最長的一對數據點的距離作爲類的距離。個人經驗complete-linkage基本沒用,single-linkage通過關注局域連接,可以得到一些形狀奇特的cluster,但是因爲太過極端,所以效果也不是太好。

      層次聚類最大的優點,就是它一次性地得到了整個聚類的過程,只要得到了上面那樣的聚類樹,想要分多少個cluster都可以直接根據樹結構來得到結果,改變cluster數目不需要再次計算數據點的歸屬。層次聚類的缺點是計算量比較大,因爲要每次都要計算多個cluster內所有數據點的兩兩距離。另外,由於層次聚類使用的是貪心算法,得到的顯然只是局域最優,不一定就是全局最優,這可以通過加入隨機效應解決,這就是另外的問題了

    

聚類結果

      對樣品組1使用average-linkage,選擇聚類數目爲4,可以得到下面的結果。右上方的一些異常點被獨立地分爲一類,而其餘的數據點的分類基本符合我們的預期。

聚類算法

      如果選擇聚類數目爲5,則是下面的結果。其中一個大的cluster被分割,但沒有出現均勻分割的情況(比如K-means),只有少量的數據點被分離,大體的分類還是比較正確的。因此這個算法可以處理大小差別比較大的聚類問題,對cluster size不太敏感。

聚類算法

      如何確定應該取多少個cluster?這是聚類裏面的一個非常重要的問題。對於層次聚類,可以根據聚類過程中,每次合併的兩個cluster的距離來作大概判斷,如下圖。因爲總共有2000個數據點,每次合併兩個cluster,所以總共要做2000次合併。從圖中可以看到在後期合併的兩個cluster的距離會有一個陡增。假如數據的分類是十分顯然的,就是應該被分爲K個大的cluster,K個cluster之間有明顯的間隙。那麼如果合併的兩個小cluster同屬於一個目標cluster,那麼它們的距離就不會太大。但當合並出來K個目標cluster後,再進行合併,就是在這K個cluster間進行合併了,這樣合併的cluster的距離就會有一個非常明顯的突變。當然,這是十分理想的情況,現實情況下突變沒有這麼明顯,我們只能根據下圖做個大致的估計。

聚類算法

 

      對於測試樣品2,average-linkage可謂完全失效,這是由於它對“相似性”的理解造成的,所以只能得到凸型的cluster。

      總體而言,像average-linkage這樣的算法還是比較穩定的,可以大致地判斷聚類數目,聚類效果也不錯,在數據量比較小的時候可以使用。

 

3、K-means算法

      K-means是最爲常用的聚類方法之一,儘管它有着很多不足,但是它有着一個很關鍵的優點:快!K-means的計算複雜度只有O(tkn),t是迭代次數,k是設定的聚類數目,而n是數據量,相比起很多其它算法,K-means算是比較高效的。

      K-means的目標是要將數據點劃分爲k個cluster,找到這每個cluster的中心,並且最小化函數

其中就是第i個cluster的中心。上式就是要求每個數據點要與它們所屬cluster的中心儘量接近。

      爲了得到每個cluster的中心,K-means迭代地進行兩步操作。首先隨機地給出k箇中心的位置,然後把每個數據點歸類到離它最近的中心,這樣我們就構造了k個cluster。但是,這k箇中心的位置顯然是不正確的,所以要把中心轉移到得到的cluster內部的數據點的平均位置。實際上也就是計算,在每個數據點的歸類確定的情況下,上面函數取極值的位置,然後再次構造新的k個cluster。這個過程中,中心點的位置不斷地改變,構造出來的cluster的也在變化(動畫請看這裏)。通過多次的迭代,這k箇中心最終會收斂並不再移動。

      K-means實際上是EM算法的一個特例(關於EM算法,請猛擊這裏這裏),根據中心點決定數據點歸屬是expectation,而根據構造出來的cluster更新中心則是maximization。理解了K-means,也就順帶了解了基本的EM算法思路。

      實際應用裏,人們指出了很多K-means的不足。比如需要用戶事先給出聚類數目k,而這個往往是很難判斷的;又如K-means得到的是局域最優,跟初始給定的中心值有關,所以往往要嘗試多個初始值;總是傾向於得到大小接近的凸型cluster等等。

      K-means算法相比起上面提到的層次聚類,還有一個很大的不同,那就是它需要數據點的座標,因爲它必須要求取平均,而層次聚類實際上並不需要座標數據,只需要知道數據點之間的距離而已。這也就是說K-means只適用於使用歐氏距離來計算數據點相似性的情況,因爲如果採用非歐距離,那麼也不能通過簡單的平均來得到cluster中心。

 

聚類結果

       取k=3,K-means對樣品組1聚類得到下面兩張圖。爲什麼是兩張圖呢?正如前面所說,K-means的聚類結果跟初始中心選擇有關,而不是所有的的初始值都能保證聚類成功的,下面第二張就是失敗的例子。另外由於K-means總傾向於得到接近大小的cluster,所以可以看到兩個小的cluster對大cluster的“入侵”。

      對甜甜圈樣品組,K-means也是完全沒轍。

      從上面的結果可以看出,K-means的聚類效果確實不是很好。用戶如果選擇了不正確的聚類數目,會使得本應同一個cluster的數據被判定爲屬於兩個大的類別,這是我們不想看到的。因爲需要數據點的座標,這個方法的適用性也受到限制。但是效率是它的一個優勢,在數據量大或者對聚類結果要求不是太高的情況下,可以採用K-means算法來計算,也可以在實驗初期用來做測試看看數據集的大致情況。

4、譜聚類

      一般說到譜聚類,都是從降維(Dimensionality Reduction)或者是圖分割(Graph Cut)的角度來理解。但是實際上,從物理學的簡正模式的角度,可以更爲直觀地理解這個算法的本質。

      這裏先把基本的算法步驟寫出來,然後再討論算法的原理。

譜聚類基本步驟:

1、給出N個數據點兩兩之間的相似性。也就是一個N*N的相似性矩陣A,A(i,j)代表i和j兩個數據點的相似度,數值越大則表示越相似。注意A(i,j)=A(j,i),A(i,i)=0。

2、計算矩陣D,使它的對角元是A矩陣的對應的那一列(或行)的值之和,其餘地方爲0。也就是使得

3、令B=D-A

4、求B矩陣的前k個本徵值和本徵矢,將數據點投影到一個k維空間。第i本徵矢的第j個值,就表示第j個數據點在k維空間中第i維的投影。就是說如果把k個特徵矢量併成一個N*k的矩陣,則每一行代表一個數據點在k維空間的座標。

5、根據每個數據點的k維空間座標,使用K-means或者其它聚類算法在k維空間對數據進行聚類。

      從算法的第4、5步就可以看出,譜聚類的本質實際上就類似於PCA,先將數據點投影到一個更能反映數據特徵的空間,然後再用其它辦法進行聚類。這也就是一種降維的思想(實際上也可能是升維)。那麼問題的關鍵就在於,它把數據點投影到什麼空間去了?爲什麼這個空間更能反映數據特徵?這個問題可以從圖分割的角度來理解(看這裏),不過我這裏要從簡諧振動的角度來討論這個問題,這也是一個更爲直觀的理解。

簡正模式

      說起簡諧振動,學過高中物理的童鞋都不會陌生:兩個小球連上一根彈簧,就是最簡單的簡諧振動模型。爲了簡單起見,寫成一維的形式,而且彈簧的平衡距離設爲0,於是,當小球的座標給定時,彈性勢能就是

      我們把上面那個算法套用在這個例子上試試,兩個小球的“相似度”就看成是它們之間彈簧的彈性係數k,k越大,小球之間的關係自然就越緊密了。這樣上面要求的矩陣就是

          

      給出整個系統的座標矢量,容易證明

      B只有兩個本徵矢量,分別是

    

       這兩個本徵向量就代表了體系的兩個簡正運動模式,向量中的值表示對應的小球在這個運動模式中的運動方向。比如p1之中兩個小球往同一個方向運動,這其實是系統的整體平動,對應的本徵值爲0;p2則表示兩個小球往相反方向運動,這就符合我們想象中這兩個小球的簡諧振動了。

       究竟什麼是簡正運動模式?爲什麼用上面的方法就能得到系統的簡正運動模式呢?其實所謂的簡正模式,就類似於傅立葉分析裏面,用來將原函數展開的那組相互正交的基函數組。這裏所使用的,就是簡諧振動這樣的一種基組,將整個系統的複雜運動表示爲這些簡正模式的疊加。

       無論我們有多少個小球,只要小球之間是以彈簧相連的,那麼根據它們之間的連接方式,總是可以將系統的勢能表示爲

       但是,我們希望的是將運動方式去耦合,寫成多個簡正模式之和,也就是

所以需要對原來的B矩陣對角化,而對角化過程中得到的本徵矢量和本徵值,也就是所要求的簡正模式以及它們的頻率的平方值。

      上面說了那麼多關於簡正模的東西,可是到底爲什麼要求簡正模呢?這是因爲譜聚類的目的是要找到一個能很好地反映數據點特徵的空間,然後在新空間中進行聚類。試着想象一下,如果兩個數據之間相似性很大,那麼也就是說它們之間的“彈簧”彈性係數很大,就跟用一個棒子連起來一樣,那麼自然在運動的時候,它們就會傾向於往同一個方向運動。類似地,如果一堆數據點之間很相似,那麼它們就會形成一個rigid的整體,就像一個剛體一樣,剛體內部的小球喜歡一起動。而兩個剛體之間,則會產生簡諧運動,傾向於往不同的方向運動。

       用一個簡單的例子來說明這個現象,我們可以想象6個小球,分成對稱的兩組123和456,組內小球兩兩之間連在一起,兩組之間則在3和4間有一根彈簧相連。這樣一個結構,很明顯應該是分爲123和456兩組。如果我們使用譜聚類,那麼相似矩陣和求得的本徵矢量如下

        

這裏只列出本徵值最小的前4個本徵矢量:第一個一樣是整體平動,沒有什麼意義;第二個表示兩組小球之間的相對運動,兩組小球往不同方向運動,這是我們想要得到的結果;第三、四個表示每組小球內部的相對運動。

       在這個結構裏,組內部的相對運動相比起組間運動是很弱的,這可以從它們對應的本徵值看出來。根據能均分定理,能量應該在每個簡正模式之間均分,所以模式的振幅反比於它們的頻率,也就是跟本徵值的開方的倒數成正比,這裏A2:A3:A4~3:1:1。這其實也就告訴了我們,對傳統的譜聚類算法可以根據它的物理意義進行改進,根據本徵值對本徵矢量進行加權,而不是同一對待。這樣,不重要的模式即便被考慮進來,因爲振幅很小,所以也不會對結果產生什麼影響。這樣,我們在算法的第4步,考慮k個本徵矢量來進行投影時,就不用擔心會多取了多餘的本徵矢了,而且也可以根據本徵值譜的變化來判斷k的合理取值,就像在層次聚類中那樣。

       對PCA比較熟悉的童鞋,會發現這個方法在形式上跟主元分析有類似的地方。其實簡正模分析和PCA是兩個相反的思路,簡正模是根據系統的性質來推斷系統的特徵運動模式,而PCA則是根據系統的運動結果來得到特徵方向。一個是從原理來進行推斷,一個則是從結果來進行反推。

聚類結果

       使用譜聚類對樣品1進行聚類,可以得到下圖。兩個結果分別對應聚類數目k取爲3和8的情況,可以看到並不會像K-means那樣把大的cluster分離,只會把少量異常點分離出去,總體的聚類結果十分穩定。因爲算法最後還是使用了K-means進行聚類,所以我們可以想象譜聚類在投影到新空間的時候,應該是很好地把不同的cluster遠遠地分離了開來。

       可惜,譜聚類對特殊形狀的cluster的聚類效果依然不盡如人意。不過相比起K-means這樣的算法,譜聚類已經辨認出一些形狀信息了(有成環狀的cluster,而不是都是球型的)。

5、Chameleon聚類

      之前介紹的三個算法都沒辦法分辨出樣品2的甜甜圈,而這次介紹的chameleon算法則可以說是專門用來幹這活的。下面是算法的提出者在他們的文獻中給出的一些測試組,可以看到這個算法就是對各類奇葩形狀都應對自如……

聚類方法

       我們不妨來想當然地考慮一下,怎樣才能識別出甜甜圈結構的cluster。簡單起見,考慮最極端的情況,假設數據的噪聲不是像樣品2那麼大,而是分界很明顯的三個環帶。想象我們把一隻甲蟲放在了其中一個環帶上,甲蟲的視野很小,而且它會隨機地走到它能看到的數據點上。如果環帶之間的間距足夠大,那麼甲蟲就不會走到其它環帶上。最後,甲蟲能走到的區域就是一個環形的cluster。

       上面這個問題的關鍵就在於,要主動地把甲蟲的視野變小,也就是根據近鄰數據來進行聚類,然後不斷延伸。這其實也就類似於層次聚類中的single-linkage,實際上single-linkage也確實可以識別出樣品2。

       但是這樣會帶來新的問題,比如對於下面的情況。在fig 4中,如果只看最近鄰的連接,算法會傾向於合併c、d而不是a、b,又或者說,如果甲蟲的視野足夠大到會合並a和b,那麼c和d也就一定會被看作一個cluster。但事實上,a、b的鄰接區域較大,距離也不遠(相對於a、b內部),所以是應該被認爲是屬於同一個cluster,而c、d則顯然不應該被看作一類。fig 5則表示另外一種情況,就是過分強調鄰接區域的大小,這樣就會傾向於把a與c進行合併,而不是與b合併。

聚類方法

       Chameleon算法就是努力在這兩種情況之間保持平衡,既考慮Closeness,即近鄰節點的靠近程度,也考慮Inter-Connectivity,即鄰接區域的大小。

       Chameleon本質上也是一個從下而上的層次聚類算法,不過它只考慮每個節點鄰近的K個節點(K由用戶給定),也就是說,只有最接近節點的其它K個節點會被認爲與節點存在連接。兩個節點越“接近”,連接強度越強。兩個cluster的“距離”由兩個參量決定:relative inter-connectivity和relative closeness。

Relative Inter-Connectivity

cluster i和j的relative inter-connectivity表徵了他們之間鄰接區域的大小,其中EC{Ci,Cj}表示跨越i和j的所有連接的強度之和,EC{Ci}表示將cluster i分割爲大小接近的兩部分所需要切斷的連接的強度值和。

Relative Closeness

cluster i和j的relative closeness表徵了他們之間近鄰連接的強度,其中SEC{Ci,Cj}表示跨越i和j的所有連接的強度平均值,SEC{Ci}表示將cluster i分割爲大小接近的兩部分所需要切斷的連接的強度平均值。

最後,兩個cluster之間的距離爲

a是用來調節兩個參量的比重的參數。

聚類結果

       因爲原算法需要使用一些額外的算法來進行圖分割,我這裏只是使用了一個簡化版本的Chameleon算法,使用了絕對的inter-connectivity和closeness,沒有對cluster的大小進行normalization(也就是沒有考慮上面兩條式子中的分母)。

       對樣品1進行聚類,分別取聚類數目k=5和8。類似於譜聚類,Chameleon算法也可以穩定地對數據進行聚類,不會對k的選擇過分敏感。

       經過多次的調整參數,我也終於把樣品2的cluster給識別了出來……

       從算法的角度來說,Chameleon可以用於識別形狀特別的cluster,但是實際上調整參數殊爲不易(當然這也跟我使用簡化版算法有關),而且關鍵是層次聚類的效率終歸不高。所以Chameleon可以在一些特殊的場合使用,個人認爲不是一個十分通用的算法。


6、PCCA

      PCCA算法的全稱是Perron Cluster Cluster Analysis,名稱裏有兩個cluster是因爲這樣簡寫就可以和PCA區分開來(無語……)。PCCA並不是設計來處理傳統的聚類問題的,而是專門用於得到馬爾科夫鏈中的cluster。當然,對於一般的聚類問題,只要根據系統特點構造出一個概率轉移矩陣,也可以使用PCCA算法。

       要解釋馬爾科夫模型中的cluster,讓我們想象有一隻跳蚤在了數據點間跳躍轉移。它下一個時刻跳到特定數據點上的概率,只跟它當前落在哪個數據點上有關,這顯然是一個經典的馬爾可夫過程。再讓我們假定,跳蚤在點與點之間的躍遷概率跟數據點的“距離”成反比。如果數據點可以分成幾個分界明顯的cluster,跳蚤大多數時間就只會在某個cluster內部的數據點間轉移,在cluster之間的跳躍則相對罕見。

       先解釋一下馬爾科夫模型的一些性質。馬爾科夫模型需要的是一個轉移矩陣A,元素A(i,j)表示系統從狀態i轉移到狀態j的概率。矩陣的每一列元素之和必須爲1,這是因爲轉移概率總和必須爲1。轉移矩陣有一個本徵值爲1的本徵矢量,對應着系統的穩態,亦即系統到達這個狀態後,它在各個狀態的概率分佈就不會再發生變化。

       爲了說明PCCA的原理,我們直接來考慮最爲極端的情況,也就是系統由幾個完全分離的cluster所構成。對於最爲極端的情況,如果系統只能在cluster內部轉移,而完全不會在cluster之間轉移,那麼轉移矩陣A就會是分塊矩陣的形式,比如下面的系統就可以分爲兩個完全不連通的cluster,如下面的矩陣。

      這樣的一個矩陣存在着不止一個本徵值爲1的本徵矢量,因爲它的每個分塊都可以看做一個轉移矩陣,都會對應着一個穩態。比如對於上面的矩陣A,下面兩個本徵矢的本徵值都爲1。

      

      如果我們得到的矢量都是這樣的理想形式,那麼聚類就很簡單了,只要得到本徵值爲1的全部本徵矢,把對應的元素大於0的數據點歸爲一類就可以。十分可惜的是,由於這兩個本徵矢量是簡併的,它們線性疊加產生的矢量也是矩陣的本徵值爲1的本徵矢量,比如這個矢量:

      因此PCCA算法的思路,就是要從計算得到實際本徵矢量,反推得到理想矢量,從而實現聚類。

       如果將計算得到的k個本徵值爲1的本徵列矢量並排合併,成爲一個N*k的矩陣,那麼矩陣的每一行可以看成對應與數據點的一個座標。對於理想本徵矢(對應下圖藍色基矢),數據點都是落在座標軸上(因爲除了所屬的cluster所對應的那個本徵值,其餘的維度都是0),比如下圖的紅色和黃色的數據點。但是由於實際得到的本徵矢量是理想本徵矢的線性疊加,所以基矢就發生了旋轉(對應黑色基矢)。

      儘管如此,每個cluster的數據點落在一條直線上的性質並沒有發生改變。現在的問題就變成了如何找到這些直線的方向。PCCA首先找到離原點最遠的數據點,這個點相對於原點的矢量,就對應了一個理想本徵矢。然後每一次都找與已知的理想矢量垂直(相對原點),而又離原點最遠的數據點。只要找k次,就能找到所有的理想矢量。最後看數據點落在哪個方向上,就可以知道它們屬於哪個cluster。實際情況下,矩陣並不會是完全的分塊矩陣,所以除了第一個本徵矢,其餘本徵矢量對應的本徵值不會完全爲1,而是接近於1。cluster之間的轉移機率越小,這個算法的準確性自然越高。

聚類結果

       PCCA算法的一個優點就是,它可以根據本徵值來直接得到cluster的數目,有多少個接近於1的本徵值就應該分多少個cluster。當然這也是一個限制,聚類數目不能隨意給定,完全由數據性質決定,如果cluster的分界不明顯,那麼可能聚類就完全無效。

       下面是PCCA對樣品1的聚類結果。第一幅圖是由算法自動判定聚類數目,正好爲3,聚類十分成功;第二幅圖是人爲地要求分爲4個cluster,結果算法就基本失效了。

聚類方法

聚類方法

       PCCA是除了Chameleon算法外,對樣品2聚類結果最好的一個算法。不過它並不能正確地判斷出cluster的數目,總共劃分出了7個cluster,這裏顯示了前5個。

聚類方法

       PCCA可以自動判定cluster數目,而且也能得到非凸型的cluster,還可以適用於概率轉移矩陣的聚類,看上去確實是一個性能比較好的聚類算法。不過,PCCA對數據的性質特徵有比較強的預設,當數據性質偏離理想狀況較遠時,算法的穩定性有待考驗。

7、SOM

      之所以嘗試SOM聚類,主要是因爲這是基於神經網絡的一種算法,而神經網絡本身又是機器學習中的一個重要方法,所以就自己實踐一下體會體會。

       所謂SOM指的是Kohonen提出的競爭網絡,全稱是self-organizing map。這個算法有着非常多的改進和變種,在網絡的拓撲結構、節點之間的反饋方式等方面各有不同。更一般地說,SOM應該是一個降維算法,它可以將高維的數據投影到節點平面上,實現高維數據可視化,然後也可以繼續根據降維之後的數據再進行聚類,就像譜聚類一樣。不過,因爲這裏僅僅是個人的算法嘗試,所以我就使用最簡單的方式,直接使用SOM進行聚類。

       競爭網絡,顧名思義就是網絡節點相互競爭。對於每一個輸入的數據點,網絡節點都要進行競爭,最後只有一個節點獲勝。獲勝節點會根據贏得的數據點進行演化,變得與這個數據點更匹配。如果數據可以明顯地分爲多個cluster,節點變得跟某個cluster內的數據點更爲匹配,一般而言就會跟其它cluster不太匹配,這樣其它節點就會贏得了其它cluster的數據點。如此反覆學習,每個節點就會變得只跟特定的一個cluster匹配,這樣就完成了數據點的聚類。

       SOM需要輸入數據點的座標矩陣,對應的,每個網絡節點也有一個座標,初始時刻隨機賦值。每次輸入一個數據點,與這個數據距離最近的節點獲勝,獲勝點的座標向着這個數據點的方向偏移。聰明的看官們肯定發現了,這個簡單化的SOM算法跟K-means算法思路基本一致,確實一些文章也提到,在節點數目偏少的情況下SOM的結果就類似於K-means。

聚類結果

       SOM的聚類結果確實跟K-means比較類似,不過當聚類數目取爲4時,經常也能正確的結果,而不會聚成4個cluster,這個跟學習時間以及節點的初始值有關。這應該是因爲SOM的學習方式與K-means直接求平均不同。至於對樣品2的聚類,SOM也跟K-means類似,就不貼出來了。

聚類方法

聚類方法

       這個SOM聚類只是個人試水,並不能真正代表SOM聚類的最佳效果,僅作參考。

8、Affinity Propagation

       Affinity Propagation(簡稱AP)是一個比較新的算法,在07年發表在Science上面,可見肯定是有一些獨到之處的。

       個人認爲,AP算法的具體實現步驟沒有很直觀的物理意義,大致上就是一個網絡自動演化的過程,實現起來也並不複雜。感興趣的童鞋可以直接到算法作者的網頁,上面也提供了各個版本的實現程序,可以直接拿來使用。

        

這裏我就不詳細地敘述算法的實現步驟了,只是介紹一下這個算法的一些特點。

1)AP只要求輸入數據點之間相似性矩陣,而且還不需要是對稱陣。從這個角度來說,適用範圍非常大。

2)AP算法的核心是對於每個cluster找到一個代表數據點exemplar,使得cluster內其它數據點到這個點的距離平方和最小。這是AP算法的一個很大的優點,因爲它不僅能完成聚類,還可以給出這個類別的代表。很多時候我們聚類也就是爲了找出代表而已。

3)AP算法不能直接知道聚類的數目,它不僅不能判定合適的聚類數目,甚至在聚類完成前,用戶都不知道這次會聚出多少個cluster來,只能自己慢慢調整參數,多次嘗試……

       AP算法的目標函數跟K-means類似,不過中心點不是平均值,而是真實的一個數據點。其實這個算法可以說是K-centers的一個高效實現,但歸根到底得到的也就是K-centers最佳情況下的結果而已,跟K-means也類似,都是大小接近的凸型cluster,所以我就不貼結果了。可以說,當你想得到K-centers的結果時,AP算法是你的最佳選擇,但如果你的目標不在於此,那就不要用這個方法了。


       譜聚類聚類的效果比較好,性能也比較穩定。算法需要的輸入只是相似矩陣,不需要數據點的座標矩陣,適用性也較廣。一個潛在的問題是,如果數據量很大的話,對大矩陣的對角化可能會導致算法效率低下。但是如果是稀疏矩陣的情況,只計算前k個本徵矢量和本徵值的效率還是很高的。所以譜聚類算法總體而言是一個不錯的選擇。


原文地址:http://www.itongji.cn/article/0R52E22013.html
發佈了8 篇原創文章 · 獲贊 18 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章