(三)聚类KMeans讲解和图片压缩

本文讲解KMeans算法,主要分为原理讲解,代码实现以及用KMeans来实现图片压缩

原理讲解

1.KMeans目的

如果你拿到一堆数据,但是这堆数据没有特征或者说是标签,那么,你该如何来处理这批数据?聚类算法的目的就是处理这样的无监督问题,聚类就是把相似的东西聚到一起,因此衍生出了许多聚类算法,他们按照不同的聚类方式对数据进行分类,KMeans只是其中一种。

2.KMeans基本概念

簇:指定K值,聚成多少份
质心:均值,即向量各维取平均即可
距离的度量:常用欧几里得距离和余弦相似度(先标准化)
优化目标:
在这里插入图片描述

3.KMeas的问题

KMeans的有点是快捷,简单,一般对规则的图形效果比较不错,但不仅K值难以确定,切计算量和样本复杂度呈线性关系,对于复杂图形的效果比较差。在这里为你提示一种叫做DBSCAN的算法,这种算法在聚类中算效果比较好的一种算法。言归正传,我们继续讨论KMeans。

代码实现

下面我使用的数据是我在学习过程中得到的一个很小的数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

beer=pd.read_csv('data.txt',sep=' ')
X=beer[['calories','sodium','alcohol','cost']]
print(beer)

#使用KMeans
km2=KMeans(n_clusters=2).fit(X)
km3=KMeans(n_clusters=3).fit(X)
beer['cluster2']=km2.labels_
beer['cluster3']=km3.labels_
print(beer)
colors = np.array(['red', 'green', 'blue', 'yellow'])
#画图显示效果
for i in range(2):
    centers=beer.groupby('cluster'+str(2+i)).mean().reset_index()
    plt.scatter(beer['calories'],beer['alcohol'],c=colors[beer["cluster"+str(2+i)]])
    plt.scatter(centers['calories'],centers['alcohol'],marker='x',c='purple')
    plt.xlabel('calories')
    plt.ylabel('alcohol')
    plt.show()
    

数据我放在后面了,有兴趣的可以复制使用

现在展示散点图:

在这里插入图片描述
在这里插入图片描述

这个就是第一个print的结果,也是数据,读者可以把这个数据复制到文本文件,按照我的读取方式就可以读出来,这个标题是由我们添加,只需读取数据即可。
name calories sodium alcohol cost
0 Budweiser 144 15 4.7 0.43
1 Schlitz 151 19 4.9 0.43
2 Lowenbrau 157 15 0.9 0.48
3 Kronenbourg 170 7 5.2 0.73
4 Heineken 152 11 5.0 0.77
5 Old_Milwaukee 145 23 4.6 0.28
6 Augsberger 175 24 5.5 0.40
7 Srohs_Bohemian_Style 149 27 4.7 0.42
8 Miller_Lite 99 10 4.3 0.43
9 Budweiser_Light 113 8 3.7 0.40
10 Coors 140 18 4.6 0.44
11 Coors_Light 102 15 4.1 0.46
12 Michelob_Light 135 11 4.2 0.50
13 Becks 150 19 4.7 0.76
14 Kirin 149 6 5.0 0.79
15 Pabst_Extra_Light 68 15 2.3 0.38
16 Hamms 139 19 4.4 0.43
17 Heilemans_Old_Style 144 24 4.9 0.43
18 Olympia_Goled_Light 72 6 2.9 0.46
19 Schlitz_Light 97 7 4.2 0.47

效果图:

在这里插入图片描述

第二个print的结果:

在这里插入图片描述
KMeans到了这里就结束了,KMeans的难点在于K的选定,可以多试记住K看看效果,同时,即使是一样的K也有可能产生不同的效果,有时候我们需要多试几次,或者使用交叉验证。

图片压缩

聚类算法的压缩就是把原来的图片数据按照相似度化为不同的类,但是用聚类进行图片压缩,压缩图片不能回到原来的图片。
不多说,直接上代码

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

#导入图片
img=Image.open('Laugh.jpg')
image=np.array(img)

#显示图片
plt.imshow(img)
plt.show()

#获取图片的数据
row=image.shape[0]
clumns=image.shape[1]

#原有数据为三维,我们只使用了二维,即三维图片压缩为二维
data=image.reshape(row*clumns,3)
km=KMeans(n_clusters=2,n_init=5, max_iter=100)
img_data=km.fit(data)

#拿出聚类后的数据
end_data=np.array(img_data.labels_)
end_data=end_data.reshape(row,clumns)

#显示图片并保存
plt.imshow(end_data)
plt.show()
np.save('compress.jpg',end_data)

原图片:

在这里插入图片描述

压缩后:
在这里插入图片描述
一般来说,这个K比较小的时候,你更能看出原图像是什么样,当K比较大的时候,图片就比较鬼畜了

如果本文出现错误,请评论指正。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值