非監督學習演算法--K均值聚類
01-28
本文介紹最常見的非監督學習演算法「K均值(K-means)」,思路和模擬主要參考Ng的課程「Machine Learning」以及課程作業的Matlab的實現。
推薦閱讀:
猛戳下載本文Matlab實現,其中ex7.m包含了k-means的代碼,ex7_pca.m包含了PCA的代碼。
以下是正文。
K-means的意義和使用場景:
在無任何先驗分類知識的情況下,自動發現數據集的分類。例如:
- 在大量文本中發現隱含的話題;
- 發現圖像中包含的顏色種類;
- 從銷售數據中發現不同特徵顧客的分類。
??下面簡述演算法步驟、模擬以及演算法中的問題 ??
1.1 演算法步驟
- 假設希望將訓練數據集分為K類;
- 在中,隨機選擇K個作為初始分類的圖心(centroids) ;
- 遍歷,計算出和每個距離最近的圖心,記錄當前屬於第類;
- 遍歷K種分類,分別計算上一步中,劃歸其中的所有點的中心點,將該點設置為本分類中心的圖心;
- 迭代上兩步,直到圖心位置收斂。
1.2 Matlab模擬:K-means過程
(我做了個gif動圖,可能需要戳一下它才會動起來)
1.3 隨機初始化 Random Initialisation
由於初始的圖心是隨機選擇的,K-means可能陷入局部最優而導致最終的圖心無法收斂到合適的位置。可以使用隨機初始化來解決這個問題:
- 多次運行K-means演算法,計算;
- 計算Cost Function ,函數代表了聚類的失真程度;
- 選擇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亮度值,由此可以將圖像的大小壓縮到
模擬圖:
代碼在文章開始處的Github鏈接中,執行ex7即可觀測到結果。如需轉載,請附上原鏈接,謝謝。
推薦閱讀:
※視頻有哪幾種——大量高維稀疏數據聚類分析實戰
※機器學習筆記24 —— 推薦系統
※本期最新 9 篇論文,每一篇都想推薦給你 | PaperDaily #14
※深度學習在計算機視覺領域的前沿進展