概要
K-means算法是最普及的聚类算法,也是一个比较简单的聚类算法,所以刚接触的同学不要感到害怕。算法接受一个未标记的数据集,然后将数据聚类成不同的组,同时,k-means算法也是一种无监督学习。
算法思想
k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤:
- 随机选取k个点,作为聚类中心;
- 计算每个点分别到k个聚类中心的聚类,然后将该点分到最近的聚类中心,这样就行成了k个簇;
- 再重新计算每个簇的质心(均值);
- 重复以上2~4步,直到质心的位置不再发生变化或者达到设定的迭代次数。
算法流程图解
下面我们通过一个具体的例子来理解这个算法(我这里用到了Andrew Ng的机器学习教程中的图):
假设我们首先拿到了这样一个数据,要把它分成两类:
我们人眼当然可以很快的分辨出来,可以在两个聚类间找到一条合理的分界线,那么用k-means算法来解决这个问题会是怎样的呢?
首先我们随机选取两个点作为聚类中心(因为已经明确是分为两类):
接下来就可以开始计算每个点到红点和蓝点的距离了,离红点近就标记为红色,离蓝点近就标记为蓝色。结果为下图:
很明显,这样完全不是我们想要的结果,接下来我们进行第三步,重新计算聚类中心的位置。
红X和蓝X都向中间靠拢了一点。我们可以看到,聚类中心发生改变后,其他点离两个聚类中心的距离也跟随着发生了变化。然后我们重复第二步,根据每个点到两个聚类中心的距离远近来进行重新分类,离红X近的归为红类,离蓝X近的归为蓝类。