1. 程式人生 > >K-means聚類演算法的三種改進(K-means++,ISODATA,Kernel K-means)介紹與對比

K-means聚類演算法的三種改進(K-means++,ISODATA,Kernel K-means)介紹與對比

  一、概述

      在本篇文章中將對四種聚類演算法(K-means,K-means++,ISODATA和Kernel K-means)進行詳細介紹,並利用資料集來真實地反映這四種演算法之間的區別。

      首先需要明確的是上述四種演算法都屬於"硬聚類”演算法,即資料集中每一個樣本都是被100%確定得分到某一個類別中。與之相對的"軟聚類”可以理解為每個樣本是以一定的概率被分到某一個類別中。

      先簡要闡述下上述四種演算法之間的關係,已經瞭解過經典K-means演算法的讀者應該會有所體會。沒有了解過K-means的讀者可以先看下面的經典K-means演算法介紹再回來看這部分。

     (1)

K-means與K-means++:原始K-means演算法最開始隨機選取資料集中K個點作為聚類中心,而K-means++按照如下的思想選取K個聚類中心:假設已經選取了n個初始聚類中心(0<n<K),則在選取第n+1個聚類中心時:距離當前n個聚類中心越遠的點會有更高的概率被選為第n+1個聚類中心。在選取第一個聚類中心(n=1)時同樣通過隨機的方法。可以說這也符合我們的直覺:聚類中心當然是互相離得越遠越好。這個改進雖然直觀簡單,但是卻非常得有效。

      (2) K-means與ISODATA:ISODATA的全稱是迭代自組織資料分析法。在K-means中,K的值需要預先人為地確定,並且在整個演算法過程中無法更改。而當遇到高維度、海量的資料集時,人們往往很難準確地估計出K的大小。ISODATA就是針對這個問題進行了改進,它的思想也很直觀:當屬於某個類別的樣本數過少時把這個類別去除,當屬於某個類別的樣本數過多、分散程度較大時把這個類別分為兩個子類別。

      (3) K-means與Kernel K-means:傳統K-means採用歐式距離進行樣本間的相似度度量,顯然並不是所有的資料集都適用於這種度量方式。參照支援向量機中核函式的思想,將所有樣本對映到另外一個特徵空間中再進行聚類,就有可能改善聚類效果。本文不對Kernel K-means進行詳細介紹。

      可以看到,上述三種針對K-means的改進分別是從不同的角度出發的,因此都非常具有代表意義。目前應用廣泛的應該還是K-means++演算法(例如2016年底的NIPS上也有針對K-means++的改進,感興趣的讀者可以進一步學習)。

二、經典K-means演算法

演算法描述如下,非常清晰易懂。經典K-means演算法應該是每個無監督學習教程開頭都會講的內容,故不再多費口舌說一遍了。

圖1圖1. 經典K-means演算法

      值得一提的是關於聚類中心數目(K值)的選取,的確存在一種可行的方法,叫做Elbow Method:通過繪製K-means代價函式與聚類數目K的關係圖,選取直線拐點處的K值作為最佳的聚類中心數目。但在這邊不做過多的介紹,因為上述方法中的拐點在實際情況中是很少出現的。比較提倡的做法還是從實際問題出發,人工指定比較合理的K值,通過多次隨機初始化聚類中心選取比較滿意的結果。

三、K-means++演算法

圖2

    圖2. K-means++演算法

      下面結合一個簡單的例子說明K-means++是如何選取初始聚類中心的。資料集中共有8個樣本,分佈以及對應序號如下圖所示:

demo圖3. K-means++示例

      假設經過圖2的步驟一後6號點被選擇為第一個初始聚類中心,那在進行步驟二時每個樣本的D(x)和被選擇為第二個聚類中心的概率如下表所示:

圖3

    其中的P(x)就是每個樣本被選為下一個聚類中心的概率。最後一行的Sum是概率P(x)的累加和,用於輪盤法選擇出第二個聚類中心。方法是隨機產生出一個0~1之間的隨機數,判斷它屬於哪個區間,那麼該區間對應的序號就是被選擇出來的第二個聚類中心了。例如1號點的區間為[0,0.2),2號點的區間為[0.2, 0.525)。

      從上表可以直觀的看到第二個初始聚類中心是1號,2號,3號,4號中的一個的概率為0.9。而這4個點正好是離第一個初始聚類中心6號點較遠的四個點。這也驗證了K-means的改進思想:即離當前已有聚類中心較遠的點有更大的概率被選為下一個聚類中心。可以看到,該例的K值取2是比較合適的。當K值大於2時,每個樣本會有多個距離,需要取最小的那個距離作為D(x)

四、ISODATA演算法

     放在最後也是最複雜的就是ISODATA演算法。正如之前所述,K-means和K-means++的聚類中心數K是固定不變的。而ISODATA演算法在執行過程中能夠根據各個類別的實際情況進行兩種操作來調整聚類中心數K:(1)分裂操作,對應著增加聚類中心數;(2)合併操作,對應著減少聚類中心數。

    下面首先給出ISODATA演算法的輸入(輸入的資料和迭代次數不再單獨介紹):

      [1] 預期的聚類中心數目Ko:雖然在ISODATA執行過程中聚類中心數目是可變的,但還是需要由使用者指定一個參考標準。事實上,該演算法的聚類中心數目變動範圍也由Ko決定。具體地,最終輸出的聚類中心數目範圍是 [Ko/2, 2Ko]。

      [2] 每個類所要求的最少樣本數目Nmin:用於判斷當某個類別所包含樣本分散程度較大時是否可以進行分裂操作。如果分裂後會導致某個子類別所包含樣本數目小於Nmin,就不會對該類別進行分裂操作。

      [3] 最大方差Sigma:用於衡量某個類別中樣本的分散程度。當樣本的分散程度超過這個值時,則有可能進行分裂操作(注意同時需要滿足[2]中所述的條件)。

      [4] 兩個類別對應聚類中心之間所允許最小距離dmin:如果兩個類別靠得非常近(即這兩個類別對應聚類中心之間的距離非常小),則需要對這兩個類別進行合併操作。是否進行合併的閾值就是由dmin決定。

      相信很多人看完上述輸入的介紹後對ISODATA演算法的流程已經有所猜測了。的確,ISODATA演算法的原理非常直觀,不過由於它和其他兩個方法相比需要額外指定較多的引數,並且某些引數同樣很難準確指定出一個較合理的值,因此ISODATA演算法在實際過程中並沒有K-means++受歡迎。

      首先給出ISODATA演算法主體部分的描述,如下圖所示:

圖4

圖4. ISODATA演算法的主體部分

     上面描述中沒有說明清楚的是第5步中的分裂操作和第6步中的合併操作。下面首先介紹合併操作:

圖5

圖5. ISODATA演算法的合併操作

     最後是ISODATA演算法中的分裂操作。

圖6

圖6. ISODATA演算法的分裂操作

      最後,針對ISODATA演算法總結一下:該演算法能夠在聚類過程中根據各個類所包含樣本的實際情況動態調整聚類中心的數目。如果某個類中樣本分散程度較大(通過方差進行衡量)並且樣本數量較大,則對其進行分裂操作;如果某兩個類別靠得比較近(通過聚類中心的距離衡量),則對它們進行合併操作。

可能沒有表述清楚的地方是ISODATA-分裂操作的第1步和第2步。同樣地以圖三所示資料集為例,假設最初1,2,3,4,5,6,8號被分到了同一個類中,執行第1步和第2步結果如下所示:

圖7

      而在正確分類情況下(即1,2,3,4為一類;5,6,7,8為一類),方差為0.33。因此,目前的方差遠大於理想的方差,ISODATA演算法就很有可能對其進行分裂操作。

五、聚類演算法原始碼

      我已經將上述三種演算法整合成一個Matlab函式Clustering.m。讀者可以直接使用該函式對資料集進行聚類。由於程式碼比較長,而且程式碼外掛還不怎麼會用,就不在文中介紹了。需要使用的讀者可以點選下面的連結下載使用(歡迎Star和Fork,之後會不定期補充新的演算法和優化的):

     使用方式非常簡單,目前支援三種形式的輸入,分別對應著上面的三種演算法:

     [centroid, result] = Clustering(data, ‘kmeans’, k , iteration);

     [centroid, result] = Clustering(data, ‘kmeans++’, k , iteration);

     [centroid, result] =

   Clustering(data, ‘isodata’, desired_k , iteration, minimum_n, maximum_variance, minimum_d);

      其中的輸入data是一個矩陣,每一行代表資料集中的一個樣本。其他輸入的意義與上面的演算法描述中一一對應。輸出的centroid是聚類中心的位置,result是每個樣本所對應的類別索引。

六、資料集測試

      最後以一個簡單的滿足二維高斯分佈的資料集為例,展示上述三種演算法的聚類結果,如下圖所示。

測試結果

圖7. 一個簡單資料集上三種演算法的聚類效果(綠色加號代表聚類中心位置)

相關推薦

K-means演算法改進(K-means++,ISODATA,Kernel K-means)介紹對比

  一、概述       在本篇文章中將對四種聚類演算法(K-means,K-means++,ISODATA和Kernel K-means)進行詳細介紹,並利用資料集來真實地反映這四種演算法之間的區別。       首先需要明確的是上述四種演算法都屬於"硬聚類”演算法,即資料集中每一個樣本都是被100%確定得

吳恩達老師機器學習筆記K-means演算法(二)

運用K-means聚類演算法進行影象壓縮 趁熱打鐵,修改之前的演算法來做第二個練習—影象壓縮 原始圖片如下: 程式碼如下: X =imread('bird.png'); % 讀取圖片 X =im2double(X); % unit8轉成double型別 [m,n,z]=size

吳恩達老師機器學習筆記K-means演算法(一)

今天接著學習聚類演算法 以後堅決要八點之前起床學習!不要浪費每一個早晨。 K-means聚類演算法聚類過程如下: 原理基本就是先從樣本中隨機選擇聚類中心,計算樣本到聚類中心的距離,選擇樣本最近的中心作為該樣本的類別。最後某一類樣本的座標平均值作為新聚類中心的座標,如此往復。 原

使用Java實現K-Means演算法

第一次寫部落格,隨便寫寫。 關於K-Means介紹很多,還不清楚可以查一些相關資料。 個人對其實現步驟簡單總結為4步: 1.選出k值,隨機出k個起始質心點。  2.分別計算每個點和k個起始質點之間的距離,就近歸類。  3.最終中心點集可以劃分為k類,

機器學習 (十二)讓你輕鬆理解K-means 演算法

前言        你還記得菜市場賣菜的嗎?書店賣書的或者是平時去超市買東西時的物品,它們是不是都根據相似性擺放在一起了呢,飲料、啤酒、零食分佈在各自區域,像這樣各級事物的相似特點或特性組織在一起的方法,在機器學習裡面即成為

K-means演算法原理簡單介紹

K-means演算法 (1. 剛開始隨機選擇兩個點作為簇重心,然後計算每個資料點離這個重心的距離並把這些點歸為兩個類) (上一步的結果如下圖,所有離藍色叉近的點被標為藍色了,紅色亦然)

【機器學習】接地氣地解釋K-means演算法

       俗話說“物以類聚,人以群分”,這句話在K-means聚類演算法裡面得到了充分的繼承。而K-means演算法的實際應用範圍可謂是大到無法估量,基本可以說,只要你想不到,沒有聚類聚不起來的東西!       &nbs

吳恩達機器學習 筆記八 K-means演算法

1. 代價函式   K-means演算法是比較容易理解的,它屬於無監督學習方法,所以訓練樣本資料不再含有標籤。我們假設有樣本資料x(1),x(2),⋯,x(m)x(1),x(2),⋯,x(m),我們選擇設定KK個聚類中心u1,u2,⋯,uKu1,u2,⋯,uK

吳恩達機器學習第七次作業Part1: K-means演算法

這是習題和答案的下載地址,全網最便宜,只要一積分哦~~~ 0.綜述 學習K-means聚類演算法,並對一幅影象進行畫素壓縮。 1.Find Closest Centroids 這是指令碼 %% ================= Part 1: Find Clo

ML-61: 機器學習之K均值(K-Means)演算法含原始碼

機器學習之K均值聚類演算法1 演算法原理2 演算法例項3 典型應用參考資料 機器學習分為監督學習、無監督學習和半監督學習(強化學習)。無監督學習最常應用的場景是聚類(clustering)和降維(dimension reduction)。聚類演算法包括:K均值

K-means演算法——機器學習

聚類屬於無監督學習,以往的迴歸、樸素貝葉斯、SVM 等都是有類別標籤 y 的,也就 是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定 y,即監督樣本。 在聚類問題中,給我們的訓練樣本是{?(1),…,?(?)},每個?(?) ∈ ℝ?,沒有了 y。  K-mean

機器學習 K-means 演算法 C++

筆記: 尚未解決的問題 :     1. 只支援二維,而不支援三維或更高,需要模板元     2. 尚未實現如何刪除極端點, 即預處理     3. 尚未視覺化 編譯環境 Ubuntu gcc 5.4 編譯選項  g++ -std=c++14 #include &l

K-Means演算法小結

1.基本概念 K-Means演算法是一種很典型的基於距離的聚類演算法,採用距離作為相似性的評價標準,認為兩個物件的距離越近,那麼相似度就越大。把簇作為距離靠近的物件組成的,最終得到的是緊湊和獨立的簇。對於聚類分析來說,用於發現數據物件之間的關係。組內的相似性越大,組間的相似

單機環境及分散式環境下K-Means演算法的執行例項

  單機環境下的K-Means聚類演算法執行例項 參考書籍《Mahout in Action》:要資源的可以找我~(中英文都有) 在eclipse平臺上實現K-Means例項 程式碼如下: package kmeans; import java.io.File; im

Python實現K-Means演算法

       宣告:程式碼的執行環境為Python3。Python3與Python2在一些細節上會有所不同,希望廣大讀者注意。本部落格以程式碼為主,程式碼中會有詳細的註釋。相關文章將會發布在我的個人部落格專欄《Python從入門到深度學習》,歡迎大家關注~

深入理解K-Means演算法

概述 什麼是聚類分析 聚類分析是在資料中發現數據物件之間的關係,將資料進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。 不同的簇型別 聚類旨在發現有用的物件簇,在現實中我們用到很多的簇的型別,使用不同的簇型別劃分資料的結果是不同的,如下的

java實現K-means演算法k-means演算法原理

/** * 需要所有point 以及族中心list * * @author:Yien * @when:2018年5月20日下午3:14:09 * @Description:TOD

【無監督學習】1:K-means演算法原理

前言:粗略研究完神經網路基礎——BP、CNN、RNN、LSTM網路後自己算是鬆懈了很多,好長的時間都沒有堅持再更新部落格了。“腐敗”生活了這麼久,還是要找到自己一點樂趣吧,於是想了一想,決定把《機器學習》的演算法研究過得都重新梳理一遍,於是就從無監督學習——聚類

【機器學習】K-means演算法初探

資料聚類是對於靜態資料分析的一門技術,在許多領域內都被廣泛地應用,包括機器學習、資料探勘、模式識別、影象分析、資訊檢索以及生物資訊等。聚類是把相似的物件通過靜態分類的方法分成不同的組別或者更多的子集,這樣讓在同一個子集中的成員物件都有相似的一些屬性,常見的包括在座標系中

K-Means演算法原理

    K-Means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。K-Means演算法有大量的變體,本文就從最傳統的K-Means演算法講起,在其基礎上講述K-Means的優化變體方法。包括初始化優化K-Means++, 距離計算優化elkan K-Means演算法和大資料