K-Means聚类算法原理
聚类分析是一个无监督的学习的过程,一般用来对数据对象按照其特征属性
进行分组。
适用场景:客户分群、欺诈检测、图像分析等领域
K-Means算法是一个迭代式算法,主要步骤如下:
- 第一步,选K个点作为初始聚类中心。
- 第二步,计算其余所有点到聚类中心的距离,并把每个点划分到离它最近的聚类中心所在的聚类中去。
- 第三步,重新计算每个聚类中所有点的平均直,并将其作为新的聚类中心点。
- 最后,重复 (二),(三) 步的过程,直至聚类中心不再发生改变,或者算法达到预定的迭代次数,又或聚类中心的改变小于预先设定的阀值。
在实际应用中,K-means算法必须面对的两个问题:
- 聚类个数K的选择
- 初始中心点的选择。选择不同的聚类中心可能会导致聚类结果的差异
Spark MLlib K-means 算法的实现在初始聚类点的选择上,借鉴了一个叫 K-means||的类 K-means++ 实现。K-means++ 算法在初始点选择上遵循一个基本原则: 初始聚类中心点相互之间的距离应该尽可能的远。基本步骤如下:
- 第一步,从数据集X中随即选择一个点作为第一个初始点
- 第二步,计算数据集中所以点与最新选择的中心点的距离D(X)
- 第三步,选择下一个中心点,使得
最大 第四部,重复 (二),(三) 步过程,直到 K 个初始点选择完成。
如何选择K
前面提到 K 的选择是 K-means 算法的关键,Spark MLlib 在 KMeansModel 类里提供了 computeCost 方法,该方法通过计算所有数据点到其最近的中心点的平方和来评估聚类的效果。一般来说,同样的迭代次数和算法跑的次数,这个值越小代表聚类的效果越好。