K均值算法--应用
1. 应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
观察压缩图片的文件大小,占内存大小
代码如下:
from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib.pyplot as plt from pylab import mpl import sys import numpy as np import matplotlib.image as img mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示 china = load_sample_image("china.jpg") # 读取图片 img.imsave('C://mrj//china.jpg', china) # 保存图片 print("原图内存为", sys.getsizeof(china)) print("原图数据结构为", china.shape) plt.imshow(china) plt.show() image = china[::3, ::3] print("处理后数据结构为", image.shape) X = image.reshape(-1, 3) # 线性化处理 print("线性化后数据结构为", X.shape) n_colors = 64 model = KMeans(n_colors) # 聚类为64个聚类中心 labels = model.fit_predict(X) #一维数组,30602个元素的类别 colors = model.cluster_centers_ # 二维数组(64,3) new_image = colors[labels] # 聚类中心代替 new_image = new_image.reshape(image.shape) # 还原为二维数组 print("压缩后图片内存为", sys.getsizeof(new_image)) plt.imshow(new_image.astype(np.uint8)) plt.show() img.imsave('C://mrj//new_china.jpg', new_image) # 保存图片
运行过程截图:
原图片:
处理后的图片:
对比两图可看出明显差异。
2. 观察学习与生活中可以用K均值解决的问题。
将软考上午考试成绩的数据进行k均值训练,根据成绩分数分为四种层次的学生。
代码如下:
import pandas as pd import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt path = r'C:\mrj\grade.xls' df= pd.read_excel(path) # 导入软考上午题测试考试成绩表 df=df.iloc[1:51] #切掉第一行没用数据 df score = np.array(df.iloc[:,7].fillna(value=0))#选第七列成绩 X =score.reshape(-1,1) ests=KMeans(n_clusters=4) #分为四种层次的学生 ests.fit(X) y_kmeans = ests.predict(X) y_kmeans ests.cluster_centers_ #查看聚类中心 g0 = np.array(df[(y_kmeans==0)]['Unnamed: 1']) g1 = np.array(df[(y_kmeans==1)]['Unnamed: 1']) g2 = np.array(df[(y_kmeans==2)]['Unnamed: 1']) g3 = np.array(df[(y_kmeans==3)]['Unnamed: 1']) g=[g0,g1,g2,g3] g for list in g0: print(list,end=" ") print("\n") for list in g1: print(list,end=" ") print("\n") for list in g2: print(list,end=" ") print("\n") for list in g3: print(list,end=" ")
运行过程截图: