目录
先贴出我借鉴的博客
- https://blog.csdn.net/Katherine_hsr/article/details/79382249
- https://blog.csdn.net/qq_15738501/article/details/79036255
- https://blog.csdn.net/u011204487/article/details/59624571
k-means也叫做k均值聚类,它的原理是:
假设有n个坐标点(样本)
- 我们要在其中随机选取k个点作为初始质心(这k个点的选取可以属于这n个样本,也可以在中n个样本之外)
- 计算每个样本与这k个点之间的距离,把这个样本分配到离其最近的质心上,这样n个样本就分别分配到各个质心所对应的簇上了
- 将这k个簇的质心重新计算,得到k个新的质心
- 重复2,3步,直到质心不再发生变化(收敛)
关于k值的选取,在这里推荐的方法是手肘法(另一种是轮廓系数法)
手肘法的核心指标是SSE(sum of the squared errors,误差平方和)
其中,Ci是第i个簇,p是Ci中的样本,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。
手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。
具体做法是让k从1开始取值直到取到你认为合适的上限(一般来说这个上限不会太大,这里我们选取上限为8),对每一个k值进行聚类并且记下对于的SSE,然后画出k和SSE的关系图(毫无疑问是手肘形),最后选取肘部对应的k作为我们的最佳聚类数。
下图中 横坐标为k,纵坐标为SSE(此图并不是真实数据,只是为了大家能够方便理解k值的选取以及手肘)
·可知最佳k值的选取是在第4个点(即手肘位置)
关于初始质心的选取:
有以下三种方法:
- 随机选取k个质心
- 选择彼此距离尽可能远的K个点
- 先对数据用层次聚类算法进行聚类,得到K个簇之后,对每个簇计算质心,得到k个质心
k-means的优点:
- 是解决聚类问题的一种经典算法,简单、快速
- 对处理大数据集,该算法保持可伸缩性和高效性
- 当簇接近高斯分布时,它的效果较好。
k-means的缺点:
- 在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用;
- 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;
- 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果;
- 该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的;
- 若簇中含有异常点,将导致均值偏离严重(即:对噪声和孤立点数据敏感);
- 不适用于发现非凸形状的簇或者大小差别很大的簇。