【機器學習】聚類算法:層次聚類、K-means聚類

聚類算法實踐(一)——層次聚類、K-means聚類


摘要: 所謂聚類,就是將類似的事物彙集在一 起,而將不類似的事物劃分到不一樣的類別的過程,是數據分析之中十分重要的一種手段。好比古典生物學之中,人們經過物種的形貌特徵將其分門別類,能夠說就是 一種樸素的人工聚類。 ...

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

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

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

 


基本測試函數


0、測試數據集post

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

 

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

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

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



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



一、類似性度量

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

      好比像以上兩組樣品,給出了每一個數據點的空間座標,咱們就能夠用數據點之間的歐式距離來判斷,距離越近,數據點能夠認爲越「類似」。固然,也能夠用其它的度量方式,這跟所涉及的具體問題有關。

 


二、層次聚類

     層次聚類,是一種很直觀的算法。顧名思義就是要一層一層地進行聚類,能夠從下而上地把小的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這樣的算法仍是比較穩定的,能夠大體地判斷聚類數目,聚類效果也不錯,在數據量比較小的時候可使用。



三、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算法來計算,也能夠在實驗初期用來作測試看看數據集的大體狀況。

相關文章
相關標籤/搜索