机器学习专题 --k-mean

309 阅读3分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

K-means介绍

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

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

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

  1. 指定需要划分的簇的个数K值(类的个数) ;
  2. 随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点);
  3. 计算其余的各个数据对象到这K个初始聚类中心的距离,把数据对象划归到距离它最近的那个中心所处在的簇类中;
  4. 调整新类并且重新计算出新类的中心;
  5. 循环步骤三和四,看中心是否收敛,如果收敛或达到迭代次数则停止循环;
  6. 结束。
    K-Means的过程可以用如下的图来表示:

Image Name
K-Means算法简洁且快速,在处理大数据集的时候也有较高的效率。但是K-Means同时也存在一些缺点,参数K需要人为设定,不同的K得到的结果也不相同。K-Means对初始值和异常值较为敏感。K-Means不适合多分类的任务,也不太适合离散或样本内心不平衡的分类和非凸形状的分类。

K-Means代码实现

在sklearn中已经实现了K-means算法,其使用方法如下:
sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
其中n_clusters是“K”的值,表示了要生成簇的个数默认为8个。Init参数表示了选择的初始化方法,可选的参数有‘k-means++’和‘random’(k-means++可解决K-means算法中对异常值和初值敏感的问题)。n_init表示k-means算法使用不同的质心种子运行的次数其默认值为10。Max_iter表示最大的迭代次数,其默认值为300. tol表示收敛的范围其默认值为0.0001。其余参数的用法就不在此赘述了,感兴趣可以阅读【参考链接2】

K-means应用

在sklearn中提供了一个鸢尾花的数据集,我们将尝试使用K-means对数据进行分类。