K均值算法--应用

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

读取一张图片

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

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

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

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

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

代码如下:

from sklearn.datasets import load_sample_image
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from pylab import mpl
import sys
import numpy as np
import matplotlib.image as img

mpl.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
china = load_sample_image("china.jpg")       # 读取图片
img.imsave('C://mrj//china.jpg', china)      # 保存图片
print("原图内存为", sys.getsizeof(china))   
print("原图数据结构为", china.shape)  
plt.imshow(china)
plt.show()  

image = china[::3, ::3]
print("处理后数据结构为", image.shape)
X = image.reshape(-1, 3)    # 线性化处理
print("线性化后数据结构为", X.shape)
n_colors = 64 
model = KMeans(n_colors)          # 聚类为64个聚类中心
labels = model.fit_predict(X)     #一维数组,30602个元素的类别
colors = model.cluster_centers_   # 二维数组(64,3)
new_image = colors[labels]        # 聚类中心代替
new_image = new_image.reshape(image.shape)  # 还原为二维数组
print("压缩后图片内存为", sys.getsizeof(new_image))  
plt.imshow(new_image.astype(np.uint8))
plt.show() 
img.imsave('C://mrj//new_china.jpg', new_image)   # 保存图片

运行过程截图:

原图片:

处理后的图片:

 对比两图可看出明显差异。

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

 将软考上午考试成绩的数据进行k均值训练,根据成绩分数分为四种层次的学生。

代码如下:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
path = r'C:\mrj\grade.xls' 
df= pd.read_excel(path)   # 导入软考上午题测试考试成绩表
df=df.iloc[1:51] #切掉第一行没用数据
df
score = np.array(df.iloc[:,7].fillna(value=0))#选第七列成绩
X =score.reshape(-1,1)    
ests=KMeans(n_clusters=4) #分为四种层次的学生
ests.fit(X)
y_kmeans = ests.predict(X)
y_kmeans
ests.cluster_centers_  #查看聚类中心
g0 = np.array(df[(y_kmeans==0)]['Unnamed: 1'])
g1 = np.array(df[(y_kmeans==1)]['Unnamed: 1'])
g2 = np.array(df[(y_kmeans==2)]['Unnamed: 1'])
g3 = np.array(df[(y_kmeans==3)]['Unnamed: 1'])
g=[g0,g1,g2,g3]
g
for list in g0:
    print(list,end="  ")
print("\n")
for list in g1:
    print(list,end="  ")
print("\n")
for list in g2:
    print(list,end="  ")
print("\n")
for list in g3:
    print(list,end="  ")

运行过程截图:

 

 

 

posted @ 2020-04-19 21:38  M.R.J  阅读(297)  评论(0编辑  收藏  举报