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