4.K均值算法--应用
1. 应用K-means算法进行图片压缩
一开始我是看直播回放把老师的代码放进去尝试运行,然后发现出现了一些问题,在百度后得到解决。
关于PIL的缺失的解决办法
https://blog.csdn.net/jacabe/article/details/80040338
然后在进行自己的图片压缩时,想给图片加标题,发现中文无法显示
关于标题中文显示乱码的问题
https://blog.csdn.net/weixin_45092662/article/details/102477032
以下为源代码:
import matplotlib.pyplot as plt import matplotlib.image as ig import numpy as np import sys from sklearn.cluster import KMeans # 读取一张图片 pd = ig.imread('C:/Users/86186/Desktop/大三下/机器学习/pd.jpg') # 观察图片文件大小,占内存大小,图片数据结构,线性化 print("原图片的文件大小", pd.size) print("原图片的内存大小", sys.getsizeof(pd)) # 用kmeans对图片像素颜色进行聚类 # 获取每个像素的颜色类别,每个类别的颜色 # 压缩图片生成:以聚类中收替代原像素颜色,还原为二维 X = pd.reshape(-1, 3) # 把二维的变成线性的 n_colors = 64 # 将图片分成64种颜色 model = KMeans(n_colors) # 构建模型 labels = model.fit_predict(X) colors = model.cluster_centers_ # 聚类中心 # 观察压缩图片的文件大小,占内存大小 # 解决中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False new_image = colors[labels].reshape(pd.shape) plt.imshow(pd) plt.title("原图片") plt.show() plt.title("最终压缩后的图片") plt.imshow(new_image.astype(np.uint8)[::3, ::3]) plt.show() print("最终压缩的图片的文件大小", new_image.size) print("最终压缩的图片的内存大小", sys.getsizeof(new_image))
结果如下:
2. 观察学习与生活中可以用K均值解决的问题。
现在的电商平台很多,我们需要选择值得依赖的电商平台进行网购,所以我认为可以对电商平台的数据进行K均值来分类判断。
这是我做的一份假数据
以下为源代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans path = r'C:\Users\86186\Desktop\大三下\机器学习\fake.xlsx' df = pd.read_excel(path) data = np.array(df.iloc[:, 1:3].fillna(value=0).astype(int)) model = KMeans(n_clusters=3) model.fit(data) y = model.predict(data) p0 = np.array(df[y == 0]['平台名称']) print(p0) p1 = np.array(df[y == 1]['平台名称']) print(p1) p2 = np.array(df[y == 2]['平台名称']) print(p2) # 解决中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 绘制散点图查看分类情况 plt.title('各电商平台分类情况') plt.scatter(df.iloc[:, 1], df.iloc[:, 1], c=y, s=50, cmap='gist_rainbow') plt.show() # 绘制条形图 plt.bar(x=range(df.shape[0]), height=df.iloc[:, 3]) # 添加y轴的标签 plt.xlabel('电商名称') plt.ylabel('月销售量') # 添加条形图的标题 plt.title('各电商平台销售量') # 显示图形 plt.show()
结果如下:
我把它们分成3类
散点图
直方图
直方图这里的X轴,想显示中文的,但是总是报错,百度无果,因为时间的原因,就只能这样了。
通过机器学习的模型训练预测,可以知道什么样的电商平台是更好的一个档次的,这样子就可以帮助我们在购物中得到一个好的平台的保障服务。