1 引例
在上一篇文章中,笔者介绍了什么是聚类算法,并且同时还介绍了聚类算法中应用最为广泛的 K m e a n s Kmeans Kmeans聚类算法。从 K m e a n s Kmeans Kmeans聚类算法的原理可知, K m e a n s Kmeans Kmeans在正式聚类之前首先需要完成的就是初始化 k k k个簇中心。同时,也正是因为这个原因,使得 K m e a n s Kmeans Kmeans聚类算法存在着一个巨大的缺陷——收敛情况严重依赖于簇中心的初始化状况。试想一下,如果在初始化过程中很不巧的将 k k k个(或大多数)簇中心都初始化了到同一个簇中,那么在这种情况下 K m e a n s Kmeans Kmeans聚类算法很大程度上都不会收敛到全局最小值。也就是说,当簇中心初始化的位置不得当时,聚类结果将会出现严重的错误。
如图所示的数据集仍旧是在上一篇文章中我们所用到的人造数据集,不同的是在进行聚类时我们人为的将三个簇中心初始化了到一个簇中。其中iter=0
时的情况为未开始聚类前根据每个样本的真实簇标签所展示的情况,其中蓝色、绿色和橙色分别表示三个簇的分布情况,三个黑色圆点为初始化的簇中心。从上图中可以发现, K m e a n s Kmeans Kmeans在进行完第10次迭代后,将最上面的一个簇分为了两个簇,将下面的两个簇划分成了一个簇。同时,当进行完第30次迭代后,可以发现算法已经开始收敛,后续簇中心并没有发生任何变化。最终的结果仍旧是将上面一个簇分为两个,下面两个簇划分为一个。
通过上面这个例子我们知道,初始簇中心的位置会严重影响到 K m e a n s Kmeans Kmeans聚类算法的最终结果,那么我们该怎么最大可能的避免这种情况呢?此时就开始轮到 K m e a n s + + Kmeans++ Kmeans++算法登场了。
2 Kmeans++聚类算法
K m e a n s +