博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

机器学习作业4--K均值算法--应用

Posted on 2020-04-18 17:12  马淳丰  阅读(172)  评论(0编辑  收藏  举报

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:\Users\23625\Desktop\机器学习\项目\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()

 

实验结果如下: