聚类
“类”指的是具有相似性的集合,聚类是指将数据集划分为若干类,使得各个类之内的数据最为相似,而各个类之间的数据相似度差别尽可能的大。聚类分析就是以相似性为基础,在一个聚类中的模式之间比不在同一个聚类中的模式之间具有更多的相似性。对数据集进行聚类划分,属于无监督学习。
K-Means聚类算法
是无监督学习的一种。
K-Means算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有数值的均值得到的,每个类的中心用聚类中心来描述。
算法流程
- 随机选取k个点作为聚类中心
- 计算各样本点到各聚类中心的距离,把样本点归结到距离最近的聚类中心,形成了k个簇
- 根据归结的样本点,重新计算每个簇的质心(均值)作为新的聚类中心
- 判断:聚类中心不再发生变化或变化较小或达到指定迭代次数,算法结束,否则重复第2、3步。
算法流程图解
(Andrew Ng的机器学习教程中的图):
假设我们首先拿到了这样一个数据,要把它分成两类:
图中的点为样本点,要把它分成两类。k=2
首先我们随机选取两个点作为聚类中心:
接下来就可以开始计算每个点到红点和蓝点的距离了,离红点近就标记为红色,离蓝点近就标记为蓝色。结果为下图:
很明显,这样完全不是我们想要的结果,接下来我们进行第三步,重新计算聚类中心的位置。
红X和蓝X都向中间靠拢了一点。我们可以看到,聚类中心发生改变后,其他点离两个聚类中心的距离也跟随着发生了变化。然后我们重复第二步,根据每个点到两个聚类中心的距离远近来进行重新分类,离红X近的归为红类,离蓝X近的归为蓝类。
之前站错了队伍的一些点重新进行了调整,现在的分类离我们的目标越来越近了,但还没有达到最佳的分类效果。接下来继续重复上面的步骤,重新计算聚类中心的位置,再重新分类,不断迭代,直至聚类中心的位置不再变化(变化范围达到设定值)或达到迭代次数为止。
这样我们就利用k-means算法把这个数据很好的分为两类啦。
我们可以看到,在整个过程中,我们都没有去监督算法,告诉他具体是分错了还是对了,只是在开始的时候告诉他要把这个数据分成多少类,然后后面的操作都是由他自己完成,完全没有人为的让他进行分类的学习,也没有帮助他纠正错误,所以k-means算法也是一种无监督学习方法。
优缺点
- 优点: 算法简单易实现;
- 缺点: 需要用户事先指定类簇个数; 聚类结果对初始类簇中心的选取较为敏感; 容易陷入局部最优; 只能发现球形类簇;
-
K值的选择主要还是根据经验以及利用k-means聚类的目的来决定。
-
初始的聚类中心选择在这不同的位置,最后导致的分类结果和迭代次数可能会不一样。聚类中心的选取主要还是以随机为主,并且初始的时候最好是选择数据中的点。对于聚类数目K值较小(K<10)的情况下,我们可以多次随机选取不同聚类中心,最后比较各自迭代完成后的畸变函数值,畸变函数越小,则说明聚类效果更优。但是在k值较大的情况下,比如上百类甚至上千万类,这时候重新选取不同的聚类中心可能就没有很好的效果了。