1.概述
K-means算法是最为经典的基于划分的聚类算法,基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类,通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
K-means算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足同一聚类的对象相似度较高,而不同聚类中的对象相似度较小。聚类相似度是利用各个聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的
2.实现原理
基本思想是初始随机给定k个簇中心,按照最近邻原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的质心。一直迭代,直到簇心的移动距离小于某个给定的值。
步骤:
- 为待聚类的点寻找聚类中心
- 计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去
- 计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心
- 反复执行(2)(3)直到聚类中心不再进行大范围移动或聚类次数达到要求为止
3.使用该算法需要考虑的问题
- K值的选取:
- 实际情况:衣服大小(s,m,l)
- 肘部法则
- 初始聚类中心的选取:
多次尝试随机初始化不同的初始聚类中心,然后选取具有最小SSE(误差平方和)的一组。
- 距离的度量(评价个体间差异大小)
- 欧几里得距离:受到指标不同单位刻度的影响,一般需要先进行标准化。距离越大,个体间的差异性越大。
- 余弦距离:不受指标刻度的影响,取值落在[-1,1],值越大,差异越小。值为零是正交无关。
- 聚类中心:簇到中心的距离的均值
- 算法停止条件:
- 目标函数达到最优:目标函数(欧氏距离,余弦距离)
- 达到最大迭代次数
4.K-means最佳实践
(1)随机选取训练数据中的k个点作为起始点
(2)选定k值后,随机计算n次,取得误差函数值最小的k作为最终聚类结果
(3)肘部法则选取k值
5.K-means++算法
基本思想是:初始的聚类点之间的相互距离要尽可能地远,解决K-Means算法对初始簇心比较敏感的问题
步骤:
- 从输入的数据点集合中随机选取一个点作为第一个聚类中心
- 对于数据集中的每一个点x,计算他与最近聚类中心(指已选择的聚类中心)的距离D(x)
- 选择一个新的数据点作为新的聚类中心,选取的原则是:D(X)
较大的点,被选作聚类中心的概率较大
- 重复(2)(3)直到k个聚类中心被选出来
- 利用这个结果来运行标准K-means算法
Kmeans函数:
- 参数
n_clusters: 即k值,一般需要多试一些值以获得较好的聚类效果。
max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改。如果你的k值较大,则可以适当增大这个值。
init: 即初始值选择的方式,可以为完全随机选择’random’,优化过的’k-means++’(初始聚类中心离散)或者自己指定初始化的k个质心。一般建议使用默认的’k-means++’。
algorithm:有“auto”, “full” or “elkan”三种选择。”full”就是我们传统的K-Means算法, “elkan”是elkan K-Means算法。默认的”auto”则会根据数据值是否是稀疏的,来决定如何选择”full”和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是”full”。一般来说建议直接用默认的”auto”
random_state:表示产生随机数的方法。默认情况下的缺省值为None,此时的随机数产生器是np.random所使用的RandomState实例。
- 属性
label_:每个样本对应的簇类别标签
cluster_centers_:聚类中心