【机器学习】K-Means(非监督学习)学习及实例使用其将图片压缩

非监督学习之k-means

K-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。

1、从数据中选择k个对象作为初始聚类中心;

2、计算每个聚类对象到聚类中心的距离来划分;

3、再次计算每个聚类中心

4、2~3步for循环,直到达到最大迭代次数,则停止,否则,继续操作。

5、确定最优的聚类中心

欧氏距离:
在这里插入图片描述

步骤图:在这里插入图片描述

K-Means主要最重大的缺陷——都和初始值有关

  • K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K)
    K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)

看到这里,你会说,K-Means算法看来很简单,而且好像就是在玩坐标点,没什么真实用处。而且,这个算法缺陷很多,还不如人工呢。是的,前面的例子只是玩二维坐标点,的确没什么意思。但是你想一下面的代码实例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用K-Means图片压缩 代码案例

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#需是二维

from sklearn.cluster import KMeans
import warnings
warnings.filterwarnings('ignore') 
bird = plt.imread('./bird_small.png')
bird.shape# (128, 128, 3)
 
#转为二维
X = bird.reshape(-1,3) 
kmeans =KMeans(4)
kmeans.fit(X)
y_ = kmeans.predict(X)
y_

array([0, 0, 0, …, 1, 1, 1])

#图片像素被分成了四类 ,四个聚类中心
#对图片中像素进行聚类,聚类中心就是这些像素的中心,当然也是像素值
colors = kmeans.cluster_centers_
colors

array([[0.79367614, 0.6389619 , 0.41842377],
[0.12838763, 0.13014919, 0.12066123],
[0.9112854 , 0.8586482 , 0.74024725],
[0.48819345, 0.40055096, 0.3231333 ]], dtype=float32)

colors

array([[0.79367614, 0.6389619 , 0.41842377],
[0.12838763, 0.13014919, 0.12066123],
[0.9112854 , 0.8586482 , 0.74024725],
[0.48819345, 0.40055096, 0.3231333 ]], dtype=float32)

bird2 = colors[y_]
plt.imshow(bird2.reshape(128,128,3))

在这里插入图片描述

kmeans =KMeans(256)
kmeans.fit(X)

y_ = kmeans.predict(X)

colors = kmeans.cluster_centers_
# plt.figure(figsize=(8,8))
bird3 = colors[y_]
plt.imshow(bird3.reshape(128,128,3))

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页

打赏

网络毒刘

授人玫瑰,手有余香。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者