前言
本系列为机器学习算法的总结和归纳,目的为了清晰阐述算法原理,同时附带上手代码实例,便于理解。
目录
组合算法(Ensemble Method)
本章主要介绍无监督学习中的k-means,以及简单代码实现。
一、算法简介
k-Means算法是一种聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个蔟中。蔟内的对象越相似,聚类的效果就越好。聚类和分类最大的不同在于,分类的目标事先已知,而聚类则不一样。其产生的结果和分类相同,而只是类别没有预先定义。
1.1 算法原理
设计的目的:使各个样本与所在簇的质心的均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)。
1.2 算法特点
· 优点:容易实现
· 缺点:可能收敛到局部最小值,在大规模数据上收敛较慢
适合数据类型:数值型数据
1.3 聚类过程
1)创建k个点作为k个簇的起始质心(经常随机选择)。
2)分别计算剩下的元素到k个簇中心的相异度(距离),将这些元素分别划归到相异度最低的簇。
3)根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均值。
4)将D中全部元素按照新的中心重新聚类。
5)重复第4步,直到聚类结果不再变化。
6)最后,输出聚类结果。
三、算法总结与讨论
虽然K-Means算法原理简单,但是也有自身的缺陷:
- 首先,聚类的簇数K值需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。
- Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果,不能保证K-Means算法收敛于全局最优解。
- 针对此问题,在K-Means的基础上提出了二分K-means算法。该算法首先将所有点看做是一个簇,然后一分为二,找到最小SSE的聚类质心。接着选择其中一个簇继续一分为二,此处哪一个簇需要根据划分后的SSE值来判断。
- 对离群点敏感。
- 结果不稳定 (受输入顺序影响)。
- 时间复杂度高O(nkt),其中n是对象总数,k是簇数,t是迭代次数。
- K-Means算法K值如何选择?
《大数据》中提到:给定一个合适的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升。
簇的直径是指簇内任意两点之间的最大距离。
簇的半径是指簇内所有点到簇中心距离的最大值。
- 如何优化K-Means算法搜索的时间复杂度?
可以使用K-D树来缩短最近邻的搜索时间(NN算法都可以使用K-D树来优化时间复杂度)。
- 如何确定K个簇的初始质心?
1) 选择批次距离尽可能远的K个点
首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。
2) 选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。
聚类扩展:密度聚类、层次聚类。详见:
参考:http://www.csuldw.com/2015/06/03/2015-06-03-ml-algorithm-K-means/