机器学习之K均值算法应用
1. 应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
观察压缩图片的文件大小,占内存大小
# -*- coding:utf-8 -*- # 开发时间:2020/4/1815:59 # 文件名称:K均值算法应用压缩照片.py from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib.pyplot as plt import matplotlib.image as img import sys import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] #中文显示 china = load_sample_image("china.jpg") img.imsave('E://china.jpg',china)#存储图片在E盘 print("原图片文件大小:",china.size)#文件大小 print("原图片占内存大小:",sys.getsizeof(china))#内存空间大小 print("原图片的数据结构:",china.shape)#图片数据结构 plt.title("原图片") plt.imshow(china) plt.show() image = china[::3, ::3] print("我不是药神") x=image.reshape(-1,3)#线性化 print("线性化结构变化前",china.shape) print("线性化结构变化后",x.shape) n_colors=64#将数据分为64个聚类中心 model=KMeans(n_colors) labels = model.fit_predict(x) # 每个像素的颜色类别 colors = model.cluster_centers_ # 每个类别的颜色 new_img=colors[labels].reshape(image.shape) new_image = new_img.astype(np.uint8)#转换为整型 print("压缩后文件大小:",new_image.size) print("压缩后占内存大小:",sys.getsizeof(new_image)) plt.title("压缩图片") plt.imshow(new_image) plt.show() img.imsave('E://china2.jpg',new_image)#存储图片在E盘
原图文件大小,所占内存,数据结构如下图:
原图如下:
压缩图后的文件大小和所占内存如下图:
压缩后的图如下:
图片存储如下图:
2. 观察学习与生活中可以用K均值解决的问题。
从数据-模型训练-测试-预测完整地完成一个应用案例。
这个案例会作为课程成果之一,单独进行评分。
利用K均值算法将软考测试成绩(包括签到,答题等)的同学进行分类
# -*- coding:utf-8 -*- # 开发时间:2020/4/1823:17 # 文件名称:分数分类.py import pandas as pd import numpy as np from sklearn.cluster import KMeans path = r'.\test.xls' df =pd.read_excel(path)#读取文件 df score =np.array(df.iloc[:,3:5].fillna(value=0).astype(int))#将空值填充0,转换为整型 ests = KMeans(n_clusters=4)#分成4类优良中差 ests.fit(score)#训练模型 y_kmeanss= ests.predict(score)#预测 g0 =np.array(df[y_kmeanss==0]['name']) print("第一类:",end=" ") for list in g0: print(list,end=" ") print("") print("第二类:",end=" ") g1 =np.array(df[y_kmeanss==1]['name']) for list in g1: print(list,end=" ") print("") print("第三类:",end=" ") g2 =np.array(df[y_kmeanss==2]['name']) for list in g2: print(list,end=" ") print("") print("第四类:",end=" ") g3 =np.array(df[y_kmeanss==3]['name']) for list in g3: print(list,end=" ")
结果如下图: