K-Means:非监督,聚类。
过程:
1、随机抽取K个中心点;
2、所有点就近(常用欧式距离)分配成K个类,再重新计算每个类的中心点(平均值);
3、重复2,直至类不发生变化,或是达到设定的最大迭代次数。
使用sklearn的K-Means:
from sklearn.cluster import KMeans
K-Means类构造函数:
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')
eg:给亚洲球队做聚类分析
如图为各国球队排名情况
将这些国家分成三个梯队。
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
data=pd.read_csv('E:\\data exp\\kmeans-master\\kmeans-master\\data.csv',encoding='gbk')
train_x=data[["2019年国际排名","2018世界杯","2015亚洲杯"]]
kmeans=KMeans(n_clusters=3)
mms=preprocessing.MinMaxScaler()
train_mms_x=mms.fit_transform(train_x)
kmeans.fit(train_mms_x)
predict_y=kmeans.predict(train_mms_x)
result=pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename(columns={0:u'聚类'},inplace=True) #将列标题为0的列,重命名为聚类
print(result)
K-Means实战:进行图像分割
图像分割可以看成是图像纹理,颜色,形状等信息的聚类。
1、进行二聚类
(图片来自祁连山PS素材)
from PIL import Image
from sklearn import preprocessing
import numpy as np
from sklearn.cluster import KMeans
def load_data(filePath):
data=[]
f=open(filePath,'rb')#读取路径
img=Image.open(f)#读取图像
width,height=img.size
for x in range(width):
for y in range(height):
c1,c2,c3=img.getpixel((x,y))#得到RGB
data.append([c1,c2,c3])
f.close()#关闭图像
mm=preprocessing.MinMaxScaler()#加速聚类,MinMax规范化
data=mm.fit_transform(data)
return np.mat(data),width,height
img,width,height=load_data("E:\\data exp\\kmeans-master\\kmeans-master\\mountain.jpg")
kmeans=KMeans(n_clusters=2)
kmeans.fit(img)
label=kmeans.predict(img)
label=label.reshape([width,height])
pic_mark=Image.new("L",(width,height))
for x in range(width):
for y in range(height):
pic_mark.putpixel((x,y),int(256/(label[x][y]+1))-1)
pic_mark.save("bw_mountain.jpg","JPEG")
2、分割成16部分
对16个类进行颜色分配需要skimage工具包
pip install scikit-image
#颜色空间转换函数
from skimage import color
#将聚类标识矩阵转化为不同颜色的矩阵
label_color = (color.label2rgb(label)*255).astype(np.uint8)
label_color = label_color.transpose(1,0,2)
images = Image.fromarray(label_color)#通过矩阵生成图片
images.save('color.jpg')