K-means、图像分割
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() 处源码。(欧几里得距离)
该方法用于计算余弦距离。
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")


