A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、 KMeans聚类简介

需要事先指定簇的数目k

优化目标:所有点到各自质心的距离之和最小

特点:受初始值(K个随机质心的位置)的影响挺大的、受形状的影响还有点大

二、小案例

读数据、算法实例化(设置参数),训练模型、展示与分析

1. 读取数据,了解一下



  • import numpy as np



  • import pandas as pd



  • import matplotlib as plt







  • beer=pd.read_csv('data.txt',sep=' ')



  • print(beer.shape) #(20, 5)



  • print(beer.head())


2. 数据预处理

给定数据集有5列,第一列是名字,与特征没什么关系,所以将后面四列提取出来,作为接下来聚类的数据。

X=beer[['calories','sodium','alcohol','cost']]

3. KMeans聚类算法

算法实例化:指定簇的个数为3或2,然后将数据传入进行训练



  • from sklearn.cluster import KMeans







  • km_3=KMeans(n_clusters=3).fit(X) #一行完成算法的实例化和传入数据



  • km_2=KMeans(n_clusters=2).fit(X)







  • km_3.labels_


结果:array([0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 1, 0, 0, 1, 2])

输出的这个数组中有3种取值:0,1,2对应三个不同的簇的标签



  • beer['cluster_3']=km_3.labels_ #将标签值(所在的是哪个簇)作为新的特征存入csv中



  • beer['cluster_2']=km_2.labels_



  • beer.sort_values('cluster_3') #按值内容排序


4. 结果可视化

多个特征,做二维可视化时就只能选择2个特征进行可视化咯



  • from pandas.tools.plotting import scatter_matrix #散布图矩阵



  • cluster_centers3=km_3.cluster_centers_



  • cluster_centers2=km_2.cluster_centers_



  • beer.groupby('cluster_3').mean() #计算不同类别所对应的其他属性的平均值



  • beer.groupby('cluster_2').mean()







  • centers=beer.groupby('cluster_3').mean().reset_index()



  • plt.rcParams['font.size']=14



  • colors=np.array(['red','green','blue','yello'])







  • #散点图中,两个坐标分别是calories和alcohol的取值



  • plt.scatter(beer['calories'],beer['alcohol'],c=colors[beer['cluster_3']])



  • plt.scatter(centers.calories,centers.alcohol,linewidth=3,marker='+',s=300,c='black')



  • plt.xlabel('calories')



  • plt.ylabel('alcohol')


结果:centers长啥样——


四、 KMeans用于图像压缩

1. 读取图像

# -*- coding:utf-8 -*-这行太重要了,在anaconda编程时,要是忘记加上这行,可就显示不出图像了呢



  • # -*- coding:utf-8 -*-



  • from skimage import io



  • from sklearn.cluster import KMeans



  • import numpy as np







  • image=io.imread('img.jpg')



  • io.imshow(image)



  • io.show()



  • #print(image.shape) #(647, 650, 3) 原来3个通道


2. KMeans压缩



  • rows=image.shape[0]



  • cols=image.shape[1]







  • image=image.reshape(image.shape[0]*image.shape[1],3)   #一张图的像素点排成一列,3表示3个通道的值



  • kmeans=KMeans(n_clusters=128,n_init=10,max_iter=200)   #实例化kmeass,指定n为128(原来是256,并且还有3个通道呢)



  • kmeans.fit(image)  # 实例化kmeans后,传入对象image







  • clusters=np.asarray(kmeans.cluster_centers_,dtype=np.uint8)#把聚类之后的中心给取出来



  • labels=np.asarray(kmeans.labels_,dtype=np.uint8)



  • labels=labels.reshape(rows,cols)#变成二维的了,所以是灰度图形式







  • print(clusters.shape) #(128, 3)



  • np.save('codebook_test.npy',clusters)



  • io.imsave('compressed_test.jpg',labels)


3. 保存与显示



  • image=io.imread('compressed_test.jpg')



  • io.imshow(image)



  • io.show()


太吓人了!!!


2 个回复

倒序浏览
回复 使用道具 举报
奈斯,棒棒哒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马