1. 应用K-means算法进行图片压缩
读取一张图片
观察图片文件大小,占内存大小,图片数据结构,线性化
用kmeans对图片像素颜色进行聚类
获取每个像素的颜色类别,每个类别的颜色
压缩图片生成:以聚类中收替代原像素颜色,还原为二维
观察压缩图片的文件大小,占内存大小
实验代码如下:
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from sklearn.cluster import KMeans 4 from sklearn.datasets import load_sample_image 5 import sys 6 7 img = load_sample_image("flower.jpg") # 读取一张图片 8 9 print("原图片的大小:", img.size) # 查看图片大小 10 print("原图片占内存大小:", sys.getsizeof(img)) # 查看图片占内存大小 11 print("原图片的维度内的数据个数:", img.shape) # 查看图片维度内的数据个数 12 13 x = img.reshape(-1,3) # 将图片线性化 14 print("原图片线性化后的对比:", img.shape, x.shape) 15 16 n = 64 # 定义64个聚类中心 17 model = KMeans(n) # 构建模型 18 pre = model.fit_predict(x) # 训练、预测模型 19 colors = model.cluster_centers_ # 以聚类中收替代原像素颜色,还原为二维 20 21 new_img = colors[pre].reshape(img.shape) # 将训练后的数据与原数据进行匹配 22 23 plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示 24 plt.figure(1) # 定义1号画布 25 plt.title("压缩前") # 标题 26 plt.imshow(img) 27 plt.show() 28 plt.figure(2) 29 plt.title("压缩后") 30 plt.imshow(new_img.astype(np.uint8)) 31 plt.show() 32 33 print("压缩后图片的大小:", new_img.size) # 查看图片大小 34 print("压缩后的图片占内存大小:", sys.getsizeof(new_img)) # 查看压缩后的图片占内存大小
实验结果如下:
2. 观察学习与生活中可以用K均值解决的问题。
从数据-模型训练-测试-预测完整地完成一个应用案例。
这个案例会作为课程成果之一,单独进行评分。
我这次选择的数据是某赛季NBA 球员上场次数、上场时间、助攻、失误、抢断、盖帽、犯规和得分的数据,这些数据可以使用K-means算法进行球员综合能力的分类(2是综合能力强,1是综合能力中等,0是综合能力弱),通过结果就可以知道这赛季每个球员综合能力的情况。
数据为:
实验代码如下:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 import numpy as np 4 from sklearn.cluster import KMeans 5 6 data = pd.read_csv(r'C:Users23625Desktop机器学习项目data/NBA球员数据.csv', encoding='gbk') # 在路径前加个‘r’,是因为在Python中是转义符,u表示其后是UNICODE编码,因此User在这里会报错 7 8 x = data.iloc[:, 4:] # 根据球员的场次、助攻、失误、抢断、盖帽、犯规、得分数据,对球员的综合能力进行分类 9 x['场次'] = data.iloc[:, 2] 10 11 n = 3 # 将球员分为3类 12 model = KMeans(n) # 构建模型 13 pre = model.fit_predict(x) # 训练、预测模型 14 15 x['综合能力'] = pre # 将训练,预测的球员综合能力结果加进数据 16 x['姓名'] = data.iloc[:,1] # 将球员姓名加进数据 17 18 19 plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示 20 plt.title("球员综合能力散点图") # 标题 21 plt.xticks(rotation=90) # 将x轴的标签旋转90度 22 plt.xlabel("姓名") 23 plt.ylabel("得分能力") 24 plt.scatter(x.iloc[30:70,8], x.iloc[30:70,7]) # 取出30-70行的数据进行散点图的绘画 25 plt.show()
实验结果如下: