1. K-Means原理解析
2. K-Means的优化
3. sklearn的K-Means的使用
4. K-Means和K-Means++实现
1. 前言
我们在一开始的时候应该就说过,机器学习按照有无标签可以分为“监督学习”和“非监督学习”。
监督学习里面的代表算法就是:SVM、逻辑回归、决策树、各种集成算法等等。
非监督学习主要的任务就是通过一定的规则,把相似的数据聚集到一起,简称聚类。我们今天讲的K-Means算法是在非监督学习比较容易理解的一个算法,也是聚类算法中最著名的算法。
2. K-Means原理
K-Means是典型的聚类算法,K-Means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。
2.1 K-Means步骤
- 创建k个点作为起始质心。
- 计算每一个数据点到k个质心的距离。把这个点归到距离最近的哪个质心。
- 根据每个质心所聚集的点,重新更新质心的位置。
- 重复2,3,直到前后两次质心的位置的变化小于一个阈值。
整个变化的过程如果用图呈现出来会形象很多,下面的图就是k=2的K-Means的过程:
2.2 K值的确定
K-Means算法一般都只有一个超参数,就是K。那我们拿到一个数据后,要吧数据分成几类呢?我们就来讨论下这个问题。
- 首先一个具体的问题肯定有它的具体的业务场景,K值需要根据业务场景来定义。
- 如果业务场景无法确定K值,我们也有技术手段来找一个合适的K。这个方法就是手肘法。
2.3 手肘法
K-Means算法中每一步都可以计算出loss值又称为SSE。loss值的计算方式就是每个聚类的点到它们质心的距离的平方。
指定一个Max值,即可能的最大类簇数。然后将类簇数K从1开始递增,一直到Max,计算出Max个SSE。根据数据的潜在模式,当设定的类簇数不断逼近真实类簇数时,SSE呈现快速下降态势,而当设定类簇数超过真实类簇数时,SSE也会继续下降,当下降会迅速趋于缓慢。通过画出K-SSE曲线,找出下降途中的拐点,即可较好的确定K值。
这样手肘图的拐点应该是k=4的时候,所以我们可以定k=4的时候聚类效果比较好。
3. K-Means与KNN
初学者很容易把K-Means和KNN搞混,两者其实差别还是很大的。
K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。
当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。
4. 总结
K-Means的原理是很简单,但是我们仔细想想我们处理K-Means的思想好想和别的方法不太一样。我们是先去猜想我们想要的结果,然后根据这个猜想去优化损失函数,再重新调整我们的猜想,一直重复这两个过程。
其实这个猜想就是我们要求出的隐藏变量,优化损失函数的过程,就是最大化释然函数的过程。K-Means的算法就是一个EM算法的过程。