非監督學習演算法--K均值聚類

本文介紹最常見的非監督學習演算法「K均值(K-means)」,思路和模擬主要參考Ng的課程「Machine Learning」以及課程作業的Matlab的實現。

猛戳下載本文Matlab實現,其中ex7.m包含了k-means的代碼,ex7_pca.m包含了PCA的代碼。

以下是正文。

K-means的意義和使用場景:

在無任何先驗分類知識的情況下,自動發現數據集的分類。例如:

  1. 在大量文本中發現隱含的話題;

  2. 發現圖像中包含的顏色種類;
  3. 從銷售數據中發現不同特徵顧客的分類。

??下面簡述演算法步驟、模擬以及演算法中的問題 ??

1.1 演算法步驟

  • 假設希望將訓練數據集x^{(i)} (i = 1, 2, 3,..., m)分為K類;
  • x^{(i)} (i = 1, 2, 3,..., m)中,隨機選擇K個作為初始分類的圖心(centroids) mu _{1}, mu _{2}, mu _{3},..., mu _{K}
  • 遍歷x^{(i)},計算出和每個x距離最近的圖心mu ^{(i)},記錄當前x屬於第i類;
  • 遍歷K種分類,分別計算上一步中,劃歸其中的所有x點的中心點,將該點設置為本分類中心的圖心;
  • 迭代上兩步,直到圖心位置收斂。

1.2 Matlab模擬:K-means過程

(我做了個gif動圖,可能需要戳一下它才會動起來)

1.3 隨機初始化 Random Initialisation

由於初始的圖心是隨機選擇的,K-means可能陷入局部最優而導致最終的圖心無法收斂到合適的位置。可以使用隨機初始化來解決這個問題:

  • 多次運行K-means演算法,計算c^{(1)},..., c^{(m)}, mu _{1},..., mu _{k}
  • 計算Cost Function J = (c^{(1)},..., c^{(m)}, mu _{1},..., mu _{k}),函數代表了聚類的失真程度;
  • 選擇J最小的那一組初始化以及最終的計算結果。

1.4 選擇聚類數量

  • 使用「肘方法」Elbow Method
    • 逐漸增加K,並分別計算Cost Function J,尋找J較小的K,如圖:
    • 理論上,當分類數量K增大時,J將逐漸變小;
    • 但也可能陷入局部最優的問題,導致k增大時,J反而增大。此時需要重新隨機初始化後再次計算。
  • Ng推薦的辦法:向自己提問「我為什麼要使用K-means」?充分理解聚類的需求以及聚類後能向下游貢獻什麼東西,往往能從中發現真正合適的聚類數量。例如下圖:
  • 橫軸為衣服店顧客的身高,縱軸為顧客的體重。當你理解了顧客可能分為「S、M、L」三類,或者「XS、S、M、L、XL」五類時,最終選擇的分類數量可能比較make sense,而不是完全依賴Cost Function算出一個10類或者4類,最終並沒有太大實際意義。

1.5 實踐:使用K-means壓縮圖像

思路:

  • 對一個RGB圖像執行K-means演算法,尋找能描述圖像的16種主要顏色分類;
  • 將每個像素點聚類到這16種顏色分類中,並分別替換為對應分類的顏色;
  • 對每個像素使用顏色的索引來代替3維的RGB亮度值,由此可以將圖像的大小壓縮到frac{1}{6}

模擬圖:

代碼在文章開始處的Github鏈接中,執行ex7即可觀測到結果。

如需轉載,請附上原鏈接,謝謝。


推薦閱讀:

視頻有哪幾種——大量高維稀疏數據聚類分析實戰
機器學習筆記24 —— 推薦系統
本期最新 9 篇論文,每一篇都想推薦給你 | PaperDaily #14
深度學習在計算機視覺領域的前沿進展

TAG:无监督学习 | 机器学习 | 聚类 |