1. 对数据集 p04-17.csv 进行K-means, canopy, fuzzy kmeans 聚类,注意数据转换。
将p04-17.csv数据集中的逗号替换为空格,以满足org.apache.mahout.clustering.conversion.InputDriver的要求
hadoop fs -mkdir /user/kevin/mahout6
hadoop fs -copyFromLocal /home/kevin/dataguru/p04-17.txt /user/kevin/mahout6
数据转换
mahout org.apache.mahout.clustering.conversion.InputDriver -i /user/kevin/mahout6/p04-17.txt -o /user/kevin/mahout6/vecfile -v org.apache.mahout.math.RandomAccessSparseVector
Kmeans聚类
mahout kmeans -i /user/kevin/mahout6/vecfile -o /user/kevin/mahout6/result1 -c /user/kevin/mahout6/clu1 -x 20 -k 2 -cd 0.1 -dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure –cl
Canopy聚类
mahout canopy -i /user/kevin/mahout6/vecfile -o /user/kevin/mahout6/result2 -t1 2 -t2 1 -ow
Fuzzy Kmeans聚类
mahout fkmeans -i /user/kevin/mahout6/vecfile -o /user/kevin/mahout6/result3 -c /user/kevin/mahout6/clu2 -m 2 -x 20 -k 2 -cd 0.1 -dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -ow -cl
2 针对 kmeans 聚类,相同的初始质心,分析不同 k 值、不同迭代次数、不同收敛阈值对聚类结果的影响
设置K值为3,使最终聚类结果为3类
mahout kmeans -i /user/kevin/mahout6/vecfile -o /user/kevin/mahout6/resultKmeans1 -c /user/kevin/mahout6/cluKmeans1 -x 20 -k 3 -cd 0.1 -dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cl
mahout clusterdump -s /user/kevin/mahout6/resultKmeans1/clusters-1-final -p /user/kevin/mahout6/resultKmeans1/clusteredPoints -o /home/kevin/dataguru/cluster1.csv -of CSV
结果有三行,分别代表一个聚类
可以用另外的方式导出为TXT文件,更易于阅读,但是后续程序处理使用csv文件更方便。
mahout clusterdump -s /user/kevin/mahout6/resultKmeans1/clusters-1-final -p /user/kevin/mahout6/resultKmeans1/clusteredPoints -o /home/kevin/dataguru/cluster1.txt
将cluster1.csv文档分为K个单独文档用于R语言绘图
使用附件中程序进行处理,每一个聚类生成一个csv文件
有3个中心,
Cluster1包含594个结果 中心为0.728, 0.604
VL-1792{n=594 c=[0.728, 0.604] r=[0.096, 0.094]}
Cluster2包含690个结果 中心为0.390, 0.622
VL-1794{n=690 c=[0.390, 0.622] r=[0.126, 0.120]}
Cluster3包含516个结果 中心为0.593, 0.365
VL-1799{n=516 c=[0.593, 0.365] r=[0.221, 0.119]}
在RStudio中进行调试:
> c1<-read.csv(file=”/Users/kevin/k-means0.csv”,sep=”,”,header=FALSE)
> c2<-read.csv(file=”/Users/kevin/k-means1.csv”,sep=”,”,header=FALSE)
> c3<-read.csv(file=”/Users/kevin/k-means2.csv”,sep=”,”,header=FALSE)
> y<-rbind(c1,c2,c3)
> cols<-c(rep(1,nrow(c1)),rep(2,nrow(c2)),rep(3,nrow(c3)))
> plot(y, col=c(“red”,”green”,”yellow”)[cols])
> center<-matrix(c(0.728, 0.604,0.390, 0.622,0.593, 0.365),ncol=2,byrow=TRUE)
> points(center, col=”violetred”, pch = 19)
迭代次数 20 K值 3 收敛值 0.1
由上图可见,聚类效果不是很好,下面通过调整参数重新计算。目测点分为了4个圆状区域,K值取4,实际应用中大部分场景都超过了平面或者三维空间,无法通过目测来调整参数。
K=4 迭代次数:20 收敛值:0.1
VL-1799{n=172 c=[0.331, 0.260] r=[0.132, 0.111]}
VL-1780{n=382 c=[0.374, 0.724] r=[0.165, 0.094]}
VL-1796{n=1129 c=[0.625, 0.540] r=[0.154, 0.089]}
VL-1798{n=117 c=[0.871, 0.390] r=[0.058, 0.127]}
> c1<-read.csv(file=”/Users/kevin/k-means0.csv”,sep=”,”,header=FALSE)
> c2<-read.csv(file=”/Users/kevin/k-means1.csv”,sep=”,”,header=FALSE)
> c3<-read.csv(file=”/Users/kevin/k-means2.csv”,sep=”,”,header=FALSE)
> c4<-read.csv(file=”/Users/kevin/k-means3.csv”,sep=”,”,header=FALSE)
> y<-rbind(c1,c2,c3,c4)
> cols<-c(rep(1,nrow(c1)),rep(2,nrow(c2)),rep(3,nrow(c3)) ,rep(4,nrow(c4)))
> plot(y, col=c(“red”,”green”,”yellow”,”blue”)[cols])
> center<-matrix(c(0.331, 0.260, 0.374, 0.724, 0.625, 0.540, 0.871, 0.390),ncol=2,byrow=TRUE)
> points(center, col=”violetred”, pch = 19)
迭代次数 20 K值 4 收敛值 0.1
迭代次数 30 K值 4 收敛值 0.1
迭代次数 50 K值 4 收敛值 0.01
迭代次数 50 K值 4 收敛值 0. 0000001
最后总结一下:
对于相同的初始质心,分析不同 k 值、不同迭代次数、不同收敛阈值对聚类结果的影响,但是初始质心是随机生成的,所以暂时没有找到方式将其固定。对于k值、迭代次数、不同的收敛值都直接影响到了最终的聚类结果。需要多次尝试才能得到较好的效果。