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")