mahout 聚类实例

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值、迭代次数、不同的收敛值都直接影响到了最终的聚类结果。需要多次尝试才能得到较好的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值