4.K均值算法--应用

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

读取一张图片

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

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

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

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

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

源代码:

 1 from sklearn.cluster import KMeans
 2 import matplotlib.pyplot as plt
 3 import matplotlib.image as mpimg
 4 import sys
 5 
 6 #读取文件
 7 shy = mpimg.imread('D:\机器学习\img\shy.png')
 8 print("原图片大小为:",shy.size)
 9 print("原图片占用内存为:",sys.getsizeof(shy))
10 #压缩图片
11 image = shy[::4,::4]
12 X = image.reshape(-1,4)
13 
14 #模型构建
15 model = KMeans(n_clusters = 64)
16 #模型训练并预测
17 labels = model.fit_predict(X)
18 #聚类中心
19 colors = model.cluster_centers_
20 new_image = colors[labels].reshape(image.shape)
21 print("压缩后图片大小为:",new_image.size)
22 print("压缩后图片占用内存为:",sys.getsizeof(new_image))
23 
24 #展示图片
25 plt.imshow(shy)
26 plt.axis('off')
27 plt.show()
28 plt.imshow(new_image)
29 plt.axis('off')
30 plt.show()

结果:

4.K均值算法--应用_第1张图片

 

 压缩前:4.K均值算法--应用_第2张图片压缩后:4.K均值算法--应用_第3张图片

 

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

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

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

 对中国城市按经纬度进行聚类:

部分数据:

4.K均值算法--应用_第4张图片

源代码:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 from sklearn.cluster import KMeans
 4 from pylab import *
 5 
 6 # 读取原始数据
 7 X = []
 8 f = open('D:\机器学习\data\City.txt',encoding='UTF-8')
 9 for i in f:
10     X.append([float(i.split()[2][2:6]), float(i.split()[3][2:8])])
11 # 转化为numpy array
12 X = np.array(X)
13 
14 # 模型训练
15 n_clusters = 4
16 x = KMeans(n_clusters).fit(X)
17 
18 # 画图
19 mpl.rcParams['font.sans-serif'] = ['SimHei']
20 markers = ['o','*', 's', '+']
21 for i in range(n_clusters):
22     members = x.labels_ == i  # members是布尔数组
23     plt.scatter(X[members, 0], X[members, 1], s=60, marker=markers[i], color = 'red')  # 画与menbers数组中匹配的点
24 plt.xlabel("纬度")
25 plt.ylabel("经度")
26 plt.show()

结果:

 4.K均值算法--应用_第5张图片

 

 

你可能感兴趣的:(4.K均值算法--应用)