非监督学习之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))

在这里插入图片描述

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://wakemeupnow.cn/article/kmeans/