26、27 K-Means

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值