1. 应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
import sys import numpy as np from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib.pyplot as plt import matplotlib.image as img yellow = img.imread("E://yellow.jpg") print("图片的大小:", yellow.size) print("图片占用的内存:", sys.getsizeof(yellow)) print("图片的数据结构: ", yellow)
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
# 用kmeans对图片像素颜色进行聚类 # 降低图片3倍的分辨率 image = yellow[::3, ::3] plt.imshow(image) plt.show() S = image.reshape(-1, 3) # reshape()里面的数组形状第一个为-1,第二个为第二维元素的数目 print(image.shape, S.shape) n_colors = 64 model = KMeans(n_colors) # 对颜色进行聚类 labels = model.fit_predict(S) # 获取每个像素的颜色类别 colors = model.cluster_centers_ # 每个类别的颜色 # 以聚类中收替代原像素颜色,还原为二维 new_yellow = colors[labels].reshape(image.shape) print("每个像素的颜色类别:", labels) print("每个类别的颜色", colors) # 压缩图片 plt.imshow(new_yellow.astype(np.uint8)) plt.show() # 二次压缩图片 plt.imshow(new_yellow.astype(np.uint8)[::3, ::3]) plt.show()
观察压缩图片的文件大小,占内存大小
# 观察压缩图片的文件大小,占内存大小 print("压缩图片大小:", new_yellow.size) print("压缩图片内存", sys.getsizeof(new_yellow))
2. 观察学习与生活中可以用K均值解决的问题。
从数据-模型训练-测试-预测完整地完成一个应用案例。
这个案例会作为课程成果之一,单独进行评分。
import pandas as pd import numpy as np from sklearn.cluster import KMeans import warnings import matplotlib.pyplot as plt from pylab import mpl warnings.filterwarnings("ignore") df=pd.read_csv("二手车数据1.csv") #加载文件 data = np.array(df.iloc[:,0:2].fillna(value=0).astype(int)) #提取数据 model = KMeans(n_clusters=5) #构造模型,聚类中心为5 model.fit(data) #训练 model.cluster_centers_ #查看聚类中心 yc = model.predict(data) #预测值 #查看预测后数据 car0 = np.array(df[yc==0]['newcarprice']) print("第一类新车预测价格",car0) car1 = np.array(df[yc==1]['newcarprice']) print("第二类新车预测价格",car1) car2 = np.array(df[yc==2]['newcarprice']) print("第三类新车预测价格",car2) car3 = np.array(df[yc==3]['newcarprice']) print("第四类新车预测价格",car2) car4 = np.array(df[yc==4]['newcarprice']) print("第五类新车预测价格",car4) #可视化 mpl.rcParams['font.sans-serif'] = ['SimHei'] plt.scatter(df.iloc[:,2],yc,c=yc,s=50,cmap='rainbow') plt.xlabel("新车价格预测/万元") plt.ylabel("预测值") plt.show()