1. 程式人生 > >機器學習學習筆記 第十九章 聚類演算法-K-MEANS

機器學習學習筆記 第十九章 聚類演算法-K-MEANS

聚類演算法

聚類的概念:

  • 主要用來處理無監督問題,因為我們手上沒有標籤了,靠電腦自己進行分類
  • 聚類是指把相似的東西分到一組
  • 難點
    • 如何評估呢(因為沒有了標籤,難以對比正確與否,很多評估方法失效了)
    • 如何調參呢

K-MEANS的概念

  • K是指要得到的簇的數量,如下圖所示應該要得到三個簇,K值需要我們自己指定
    1
  • 質心
    • 其實是均值,如上圖中的小紅點,取向量各位的平均值
  • 距離的度量
    • 常常使用歐氏距離和預先相似度,不過要先進行標準化,令不同座標的取值都在0~1之間
  • 優化目標
    • 說白了就是想讓每個簇中所有的點到中心點的距離越小越好
    • 公式如下:
      mini=1KxCidist(ci,
      x)2min\sum_{i=1}^{K}\sum_{x\in C_i}^{}dist(c_i,x)^2

K-MEANS演算法的工作流程

2.png

優勢

  • 簡單快速,比較適合於常規的資料集

劣勢

  • K值很難確定,有時候需要大量的嘗試
  • 複雜度於樣本呈線性關係(其實我感覺複雜度也不是很高,不知道是不是我理解上出了問題)
  • 很難發現任意形狀的簇,比如兩個簇呈環形的關係
    3.png

推薦一個視覺化展示K-MEANS的網站,大家通過嘗試可以更加直觀地理解聚類K-MEANS演算法的工作流程

  1. 一開啟網站如下
    4
  2. 隨機選一個型別進入,這裡我試試Gaussian Mixture
    5
  3. 他給隨機分好了三堆,那我們嘗試一下新增中心點,比如此處我們新增三個中心點吧
    6
  4. 我們再點選Go就好,就能模擬出上述講過的流程了

通過K-MEANS聚類演算法實現影象的壓縮

  • 這個壓縮很暴力
  • 壓縮出來是一個面目全非的灰度圖,而且建議大家拿個小圖去試,大圖要跑好久好久
from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image = io.imread('1.jpg')
io.imshow(image)
io.show()

output_1_1

row = image.shape[0]
col = image.
shape[1] print(row) print(col) image = image.reshape(row*col, 3)#壓縮影象,壓縮到一列,和三個顏色維度
1080
1920
kmeans = KMeans(n_clusters=128, n_init=10, max_iter=200)#分成128個簇了,因為一開始影象的rgb顏色通道數值取值範圍是0~255,此處想壓縮一到原來的一半,因此分成128個簇,原本畫素靠近哪個就歸類於哪個簇中,歸類到的簇當成是最後的rgb值,其餘兩個引數都沒那麼重要,max_iter是最大的迭代次數
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8)
labels = labels.reshape(row, col)
io.imshow(labels)
io.show()

對唐宇迪老師的機器學習教程進行筆記整理
編輯日期:2018-10-12
小白一枚,請大家多多指教