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轴,想显示中文的,但是总是报错,百度无果,因为时间的原因,就只能这样了。

 

 通过机器学习的模型训练预测,可以知道什么样的电商平台是更好的一个档次的,这样子就可以帮助我们在购物中得到一个好的平台的保障服务。

 

posted @ 2020-04-18 18:15  Seraooo  阅读(180)  评论(0编辑  收藏  举报