机器学习:k-means手写数字聚类

K-means介绍

K-means 是我们最常用的基于欧式距离的聚类算法,其认为两个目标的距离越近,相似度越大。在开始介绍K-Means具体过程开始我们先看一个著名的K-Means解释-牧师-村民模型。

有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。

通过这个例子,我们也许能大致了解这个过程。在这个例子中牧师的目的是为了让村民到其最近中心点的距离和最小,这也是K-Means的核心思想。从这个例子展开,我们可以看看算法的流程。

  1. 指定需要划分的簇的个数K值(类的个数) ;
  2. 随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点);
  3. 计算其余的各个数据对象到这K个初始聚类中心的距离,把数据对象划归到距离它最近的那个中心所处在的簇类中;
  4. 调整新类并且重新计算出新类的中心;
  5. 循环步骤三和四,看中心是否收敛,如果收敛或达到迭代次数则停止循环;
  6. 结束。
    K-Means的过程可以用如下的图来表示:
    在这里插入图片描述
from sklearn.datasets import load_digits
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
 
 
digits = load_digits()
images=digits.images
plt.figure(figsize=(10,5))
plt.suptitle('handwritten_Image')
# 前十张图片
for i in range(10):
    plt.subplot(2,5,i+1)
    plt.title('number:%d'%(digits.target[i]))
    plt.imshow(images[i])
    plt.axis('off')
plt.show()
 
# 标准化和簇心
data = scale(digits.data)
n_digits = len(np.unique(digits.target))
reduced_data = PCA(n_components=2).fit_transform(data)
kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)
kmeans.fit(reduced_data)
label_pred = kmeans.labels_
 
plt.clf()
plt.figure(figsize = (10,7))
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1],
            marker='x', s=169, linewidths=3,
            color='w', zorder=10)
color_list=[ '#000080', '#006400','#00CED1', '#800000', '#800080',
             '#CD5C5C', '#DAA520', '#E6E6FA', '#F08080', '#FFE4C4']
for i in range(n_digits):
    x = reduced_data[label_pred == i]
    plt.scatter(x[:, 0], x[:, 1], c=color_list[i], marker='.', label='label%s'%i)
plt.title('K-means')
plt.legend()
plt.axis('on')
plt.show()

运行结果:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值