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()
结果:

压缩前:
压缩后:
2. 观察学习与生活中可以用K均值解决的问题。
从数据-模型训练-测试-预测完整地完成一个应用案例。
这个案例会作为课程成果之一,单独进行评分。
对中国城市按经纬度进行聚类:
部分数据:

源代码:
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()
结果:


浙公网安备 33010602011771号