1. 应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
观察压缩图片的文件大小,占内存大小
2. 观察学习与生活中可以用K均值解决的问题。
从数据-模型训练-测试-预测完整地完成一个应用案例。
这个案例会作为课程成果之一,单独进行评分。
1. 应用K-means算法进行图片压缩
①读取一张图片,使用内置图片flower;
②观察图片文件大小,占内存大小,图片数据结构,线性化;
③用kmeans对图片像素颜色进行聚类;
④获取每个像素的颜色类别,每个类别的颜色;
⑤压缩图片生成:以聚类中收替代原像素颜色,还原为二维;
⑥ 观察压缩图片的文件大小,占内存大小;
⑦压缩前后可视化结果对比;
具体实现代码如下:
# -*- coding:utf-8 -*- from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib.pyplot as plt import sys import numpy as np import matplotlib.image as img from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块 ##读取一张图片 image = load_sample_image("flower.jpg") #查看图片 plt.imshow(image) plt.show() ##观察图片文件大小,数据结构 print(sys.getsizeof(image)) print(image.shape) ##数据线性化 X = image.reshape(-1,3) print(image.shape,X.shape) ###用kmeans对图片像素颜色进行聚类 n_colors = 64 K_model = KMeans(n_colors) #每个像素的颜色类别,一维数组 label = K_model.fit_predict(X) #每个类别的颜色,二维数组 colors = K_model.cluster_centers_ print(label.shape,colors.shape) ##压缩生成,还原为二维 new_image = colors[label].reshape(image.shape) new_image.shape new_image.size #对比 sys.getsizeof(image) sys.getsizeof(new_image) #生成图像 plt.figure(figsize=(10,5))#画布 plt.subplot(1, 2, 1) plt.imshow(image) plt.title("压缩前的图像") plt.subplot(1, 2, 2) plt.imshow(new_image.astype(np.uint8)) plt.title("压缩后的图像") plt.suptitle("压缩前后对比图") plt.show() #保存图像 img.imsave("./data/new_test.jpg",new_image.astype(np.uint8))
2. 观察学习与生活中可以用K均值解决的问题。
数据为某级某专业的两学期的绩点和通过率,通过该模型进行训练,分为三类学生,优等生,中等生,中等偏下生。使用sklearn库的kmeans函数进行预测
数据部分截图如下:
代码运行截图:
可视化截图:
具体实现代码如下:
# -*- coding:utf-8 -*- import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt data =np.loadtxt("./data/test.txt") kmeans_model = KMeans(n_clusters=3) kmeans_model.fit(data) y_predict1 = kmeans_model.predict(data) kmeans_model.cluster_centers_ kmeans_model.labels_ plt.scatter(data[:,2],data[:,4],c=y_predict1,s=50,cmap="rainbow") plt.show()