K-means聚類算法原理
k-means算法以k為參數,吧n個對象分成k個簇,使簇内具有較高的相似度,而簇間的相似度較低。
- 随機選k個點作為初始的聚類中心。
- 對剩下的點,根據距離,将其歸入最近的簇。
- 對每個簇,計算所有點的均值作為新的聚類中心。
- 重複前兩步,直到中心不再改變。
參數: class sklearn.cluster.KMeans( n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
init:聚類中心的初始化方法; max_inter:最大疊代次數; 一般給出n_cluster即可。
擴充:K-means預設用歐氏距離,還有餘弦相似度 、馬氏距離等 使用自定義距離方法:更改def euclidean_distance() 處源碼。(歐幾裡得距離) 使用scipy.spatial.distance.cdist方法:scipy.spatial.distance.cdist(A,B,metric='cosine')#餘弦距離。
K-means執行個體:圖像分割
圖像分割常用方法:
- 門檻值分割
- 邊緣分割
- 直方圖法
- 特定理論:小波變換、聚類分析等。
目标:利用K-means 算法對圖像像素顔色進行聚類實作簡單的圖像分割。 輸出:同一聚類中的點使用相同顔色标記,不同聚類顔色不同。
import numpy as np import PIL.Image as image from sklearn.cluster import KMeans
def loadData(filePath): f = open(filePath,'rb') data = [] img = image.open(f) r,c = img.size for i in range(m): for j in range(n): x,y,z = img.getpixel((i,j)) data.append([x/256.0,y/256.0,z/256.0]) f.close() return np.mat(data),r,c
imgData,row,col = loadData('jiafeimao.jpg') #相對路徑 label = KMeans(n_clusters=5).fit_predict(imgData)
label = label.reshape([row,col]) pic_new = image.new("L", (row, col)) for i in range(row): for j in range(col): pic_new.putpixel((i,j), int(256/(label[i][j]+1))) pic_new.save("new-jiafeimao.jpg", "JPEG")