机器学习之K均值算法应用

1. 应用K-means算法进行图片压缩

读取一张图片

观察图片文件大小,占内存大小,图片数据结构,线性化

用kmeans对图片像素颜色进行聚类

获取每个像素的颜色类别,每个类别的颜色

压缩图片生成:以聚类中收替代原像素颜色,还原为二维

观察压缩图片的文件大小,占内存大小

 

# -*- coding:utf-8 -*-
# 开发时间:2020/4/1815:59
# 文件名称:K均值算法应用压缩照片.py
from sklearn.datasets import load_sample_image
from sklearn.cluster import KMeans
import  matplotlib.pyplot as plt
import matplotlib.image as img
import sys
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei'] #中文显示
china = load_sample_image("china.jpg")
img.imsave('E://china.jpg',china)#存储图片在E盘
print("原图片文件大小:",china.size)#文件大小
print("原图片占内存大小:",sys.getsizeof(china))#内存空间大小
print("原图片的数据结构:",china.shape)#图片数据结构
plt.title("原图片")
plt.imshow(china)
plt.show()
image = china[::3, ::3]
print("我不是药神")
x=image.reshape(-1,3)#线性化
print("线性化结构变化前",china.shape)
print("线性化结构变化后",x.shape)

n_colors=64#将数据分为64个聚类中心
model=KMeans(n_colors)
labels = model.fit_predict(x)   # 每个像素的颜色类别
colors = model.cluster_centers_  # 每个类别的颜色
new_img=colors[labels].reshape(image.shape)
new_image = new_img.astype(np.uint8)#转换为整型
print("压缩后文件大小:",new_image.size)
print("压缩后占内存大小:",sys.getsizeof(new_image))
plt.title("压缩图片")
plt.imshow(new_image)
plt.show()
img.imsave('E://china2.jpg',new_image)#存储图片在E盘

 

原图文件大小,所占内存,数据结构如下图:

 

 

 

原图如下:

压缩图后的文件大小和所占内存如下图:

 

 

 压缩后的图如下:

 

 

图片存储如下图:

 

 

 

 

2. 观察学习与生活中可以用K均值解决的问题。

从数据-模型训练-测试-预测完整地完成一个应用案例。

这个案例会作为课程成果之一,单独进行评分。

 

 利用K均值算法将软考测试成绩(包括签到,答题等)的同学进行分类

# -*- coding:utf-8 -*-
# 开发时间:2020/4/1823:17
# 文件名称:分数分类.py

import pandas as pd
import  numpy as np
from sklearn.cluster import  KMeans

path = r'.\test.xls'
df =pd.read_excel(path)#读取文件
df
score =np.array(df.iloc[:,3:5].fillna(value=0).astype(int))#将空值填充0,转换为整型
ests = KMeans(n_clusters=4)#分成4类优良中差
ests.fit(score)#训练模型
y_kmeanss= ests.predict(score)#预测

g0 =np.array(df[y_kmeanss==0]['name'])
print("第一类:",end="  ")
for list in g0:
    print(list,end="  ")
print("")
print("第二类:",end="  ")
g1 =np.array(df[y_kmeanss==1]['name'])
for list in g1:
    print(list,end="  ")
print("")
print("第三类:",end="  ")
g2 =np.array(df[y_kmeanss==2]['name'])
for list in g2:
    print(list,end="  ")
print("")
print("第四类:",end="  ")
g3 =np.array(df[y_kmeanss==3]['name'])
for list in g3:
    print(list,end="  ")

 

结果如下图:

 

posted @ 2020-04-19 00:17  爱飞的大白鲨  阅读(228)  评论(0编辑  收藏  举报