Kmeans算法的應用實例(Matlab版本)


K-means是一種經典的聚類算法,是十大經典數據挖掘算法之一。K-means算法的基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。

假設要把樣本集分為c個類別,算法描述如下:
  (1)適當選擇c個類的初始中心;
  (2)在第k次迭代中,對任意一個樣本,求其到c個中心的距離,將該樣本歸到距離最短的中心所在的類;
  (3)利用均值等方法更新該類的中心值;
  (4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新后,值保持不變,則迭代結束,否則繼續迭代。
  該算法的最大優勢在於簡潔和快速。算法的關鍵在於初始中心的選擇和距離公式。

K-means算法的應用之一就是圖像的壓縮。假設有一張1600*2400大小的RGB圖,那么需要1600*2400*3字節的空間來存放每個像素的三個通道值。如果這是一張顏色單調的圖片,我們就可以把顏色相近的像素點歸類,用同一組RGB值來表示他們,把這組RGB值放入調色板的x位置,原圖片中屬於這一聚類的像素點只需要保存x值,然后根據x值到調色板查找RGB值。如果把一張圖片的所有顏色聚成256個類,那么只需要1600*2400*1個字節來保存每個像素的調色板索引值,和256*3個字節保存調色板。盡管這一過程會使照片的色彩略有失真,但是它可以大大節省存儲空間。

下面是k-means算法的Matlab代碼。圖片的像素按照RGB值被歸為10個聚類,分別是原圖像和聚類后的圖像。如果增加聚類的個數,圖像的效果會有所改善。

 

K-Means主要有兩個最重大的缺陷——都和初始值有關:

K 是事先給定的,這個 K 值的選定是非常難以估計的。很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適。( ISODATA 算法通過類的自動合並和分裂,得到較為合理的類型數目 K)
K-Means算法需要用初始隨機種子點來搞,這個隨機種子點太重要,不同的隨機種子點會有得到完全不同的結果。(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)
我在這里重點說一下 K-Means++算法步驟:

先從我們的數據庫隨機挑個隨機點當“種子點”。
對於每個點,我們都計算其和最近的一個“種子點”的距離D(x)並保存在一個數組里,然后把這些距離加起來得到Sum(D(x))。
然后,再取一個隨機值,用權重的方式來取計算下一個“種子點”。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,然后用Random -= D(x),直到其<=0,此時的點就是下一個“種子點”。
重復第(2)和第(3)步直到所有的K個種子點都被選出來。
進行K-Means算法。
相關的代碼你可以在這里找到“implement the K-means++ algorithm”(牆) 另,Apache 的通用數據學庫也實現了這一算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM