1、应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
观察压缩图片的文件大小,占内存大小
from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans from pylab import mpl import matplotlib.pyplot as plt import matplotlib.image as img import numpy as np import sys #1、读取一张图片 plt.rcParams['font.sans-serif'] = ['SimHei']#指定中文字体 image = img.imread("./1.jpeg") #读取图片 plt.imshow(image) plt.title("原图片") plt.show() #显示原图片 #2、观察图片文件大小,占内存大小,图片数据结构,线性化 image = image[::3,::3] #降低原图片的分辨率 x = image.reshape(-1,3) print('原图片文件大小为:',image.size) #查看原图片文件大小 print('原图片占内存大小为:',sys.getsizeof(image)) #查看原图片占内存大小 print('原图片线性化为:',x.shape) #查看原图片线性化的结构 print('原图片的数据结构为:',image) #查看原图片的数据结构 #3、用kmeans对图片像素颜色进行聚类、压缩图片 n_colors = 64 model = KMeans(n_colors) #设定64类聚类中心 labels = model.fit_predict(x) #获取每个像素的颜色类别 colors = model.cluster_centers_ # 获取每个类别的颜色 new_image = colors[labels].reshape(image.shape) #以聚类中收替代原像素颜色,还原为二维 print('压缩图片文件大小为:',new_image.size) #查看压缩图片文件大小 print('压缩图片占内存大小为:',sys.getsizeof(new_image)) #查看压缩图片占内存大小 print('压缩图片的数据结构为:',new_image) #查看压缩图片的数据结构 new_image = new_image.astype(np.uint8) #把颜色平均值转换为整数 plt.imshow(new_image) plt.title('压缩图片') plt.show() #显示图片 img.imsave('D://大三下/机器学习/2.jpeg',new_image) #保存到本地
(1) 关于原图:
(2)关于压缩图片:
(3)原图和压缩图片的大小比较:
2、观察学习与生活中可以用K均值解决的问题。
本题主要研究的数据是瓜子网二手车(之前的课程用过),研究的内容是预测车的总价和车的表显公里之间的关系,给想购车的用户有了一定的参考。
#201706120001 温嘉文 软件工程1701班 from sklearn.model_selection import train_test_split from sklearn.cluster import KMeans import matplotlib.pyplot as plt import pandas as pd import numpy as np #1、读取所需的数据文件(二手车) filename = open('201706120001温嘉文.csv') data = pd.read_csv(filename) #2、划分训练集和测试集 x = data.iloc[: ,[3]] #获取“总价” y = data.iloc[:,1] # 获取“表显公里” x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=5) #划分成功 #3、对数据进行kmeans聚类计算 km_model = KMeans(n_clusters=3) #构造模型 km_model.fit(x_train,y_train) #训练模型 pre = km_model.predict(x_test) #预测模型 print('模型的预测值:',pre) #输出预测值 #4、对测试好的值进行绘图,总价与表显公里的关系 plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示 plt.scatter(x_test,y_test,s=60,c='pink') plt.xlabel('总价/万') plt.ylabel('表显公里/万') plt.title("总价与表显公里的关系如下:") plt.show()
运行结果:
(1)读取数据
(2)输出预测值
(3)绘图