K-Means聚类
k-means算法
方法概述
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。 其处理过程如下:
① 随机选择k个点作为初始的聚类中心;
② 对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
③ 对每个簇,计算所有点的均值作为新的聚类中心
④ 重复2、3直到聚类中心不再发生改变
实现过程
- 导入相关包numpy\matplotl\math
1 |
|
- 读取数据
依次遍历数据的每一行,以“,”分割并将数据保存到**数组dataMat[]**中
- 向量距离计算
使用欧式距离计算样本到中心的距离。对于样本 d 维样本 x 到中心 c 的欧式距离计算公式为:
- 构建一个包含k个随机质心的集合
1 |
|
- K均值聚类算法
dataSet:数据集
k:簇的个数
distMeas:距离计算
createCent:创建k个随机质心
关于距离计算方式与随机生成k个质心可以选择其他方法
1 |
|
调参的参数仅仅是簇数k取不同k值,观察结果:
- 聚成两类:
- 聚成三类:
- 聚成四类:
- 聚成五类
- 聚成六类
- 聚成7类
- 设置簇的个数为8,观察发现数据还是分成7类,且分类效果并不好,有些数据密切分布。
综上,可以看到分类效果最好的是聚成7类,k的取值应为7。
总结
K-Means的主要优点有:
- 原理比较简单,实现也是很容易,收敛速度快。
- 聚类效果较优。
- 算法的可解释度比较强。
- 主要需要调参的参数仅仅是簇数k。K-Means的主要缺点有:
- K值的选取不好把握(改进:可以通过在一开始给定一个适合的数值给k,通过一次K-means算法得到一次聚类中心。对于得到的聚类中心,根据得到的k个聚类的距离情况,合并距离最近的类,因此聚类中心数减小,当将其用于下次聚类时,相应的聚类数目也减小了,最终得到合适数目的聚类数。可以通过一个评判值E来确定聚类数得到一个合适的位置停下来,而不继续合并聚类中心。重复上述循环,直至评判函数收敛为止,最终得到较优聚类数的聚类结果)。
- 对于不是凸的数据集比较难收敛(改进:基于密度的聚类算法更加适合,比如DBSCAN算法)
- 如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
- 采用迭代方法,得到的结果只是局部最优。
- 对噪音和异常点比较的敏感(改进1:离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响;改进2:改成求点的中位数,这种聚类方式即K-Mediods聚类(K中值))。
- 初始聚类中心的选择(改进1:k-means++;改进2:二分K-means)