一:kMeans算法介绍
聚类分析是一种静态数据分析方法,常被用于机器学习,模式识别,数据挖掘等领域。通常认为,聚类是一种无监督式的机器学习方法,它的过程是这样的:在未知样本类别的情况下,通过计算样本彼此间的距离(欧式距离,马式距离,汉明距离,余弦距离等)来估计样本所属类别。从结构性来划分,聚类方法分为自上而下和自下而上两种方法,前者的算法是先把所有样本视为一类,然后不断从这个大类中分离出小类,直到不能再分为止;后者则相反,首先所有样本自成一类,然后不断两两合并,直到最终形成几个大类。
常用的聚类方法主要有以下四种: //照搬的wiki,比较懒...
Connectivity based clustering (如hierarchical clustering 层次聚类法)
Centroid-based clustering (如kmeans)
Distribution-based clustering
Density-based clustering
Kmeans聚类是一种自下而上的聚类方法,它的优点是简单、速度快;缺点是聚类结果与初始中心的选择有关系,且必须提供聚类的数目。Kmeans的第二个缺点是致命的,因为在有些时候,我们不知道样本集将要聚成多少个类别,这种时候kmeans是不适合的,推荐使用hierarchical 或meanshift来聚类。第一个缺点可以通过多次聚类取最佳结果来解决。
Kmeans的计算过程大概表示如下
随机选择k个聚类中心. 最终的类别个数<= k
计算每个样本到各个中心的距离
每个样本聚类到离它最近的中心
重新计算每个新类的中心
重复以上步骤直到满足收敛要求。(通常就是中心点不再改变或满足一定迭代次数).
二:Mahout实现
1.数据准备
仿造数据1.txt
8 8
7 7
6.1 6.1
9 9
2 2
1 1
0 0
2.9 2.9
2.txt
8.1 8.1
7.1 7.1
6.2 6.2
7.1 7.1
2.1 2.1
1.1 1.1
0.1 0.1
3.0 3.0
2.将数据转换为序列文件
方法1:命令行转换,具体参考:点击打开链接
方法2:代码转换,可借用canopy算法中的代码,具体参考:点击打开链接
3.运行
bin/mahout kmeans -i /yourFilePath -o /yourFileOutputPath -c /yourStartCenter -k 2 -x 5 -cl
参数意义说明:
-i 设置文件输入路径, -o 为文件输出路径 -c 为初始输入聚类中心 -k 表示聚类的数目 -x 表示最大的循环次数 -cl 表示算法完成后进行原始数据的分类
4.结果分析
因为k值为2,所以在clusters-0中有两个聚类中心文件
初始化聚类中心为[2.0,2.0] [2.1,2.1]
clueters-1和cluster-2的输出为[1.033,1.033] [5.725,5.725] , [1.525,1.525] [7.325,7.325]
最后的聚类中心是[1.525,1.525] [7.325,7.325]
使用此聚类中心对数据进行聚类,得到clusteredPoints文件夹下边的文件