Mahout Canopy聚类

读过孟岩的《理解矩阵》系列博文[1]~[3],其中的一段论述让我很受用:学习一门学问,最重要的是把握主干内容,迅速建立对于这门学问的整体概念,不必一开始就考虑所有的细枝末节和特殊情况,自乱阵脚[2]。


本着这样的学习思路,我们按以下步骤来快速了解Mahout中怎么使用Canopy聚类。

* Canopy Clustering是什么?

* 输入数据的格式是什么?

* 输出结果如何查看?


Canopy Clustering是什么?

Canopy Clustering是一种小而美的聚类方法,其算法流程如下:

(1)设样本集合为S,确定两个阈值t1和t2,且t1>t2。

(2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p。

(3)计算S中所有点到p的距离dist。

(4)若dist<t1,则将相应点归到C。

(5)若dist<t2,则将相应点移出S。

(6)重复(2)~(5),直至S为空。


算法的细节我们先不深究,这里只需记住两点:

(1)经过canopy clustering之后,初始样本被聚合成若干类,每一类称为一个canopy;

(2)一个样本点可能分属于几个不同的canopy。

好了,这就是canopy clustering算法的主线,接下来我们要在mahout中把程序run起来。


Mahout Canopy Clustering输入数据格式

以下约定:

* $LOCAL表示本地数据存放目录

* $HADOOP_MAHOUT表示hadoop集群的mahout输出目录

* $MAHOUT_HOME表示本地mahout的安装目录


我们准备的输入数据包含60个样本,每一行数据表示一个样本点。9个字段分别表示9个指标,字段之间以空格分开,形式如下(只列出4个样本):

1 -0.213  -0.956  -0.003  0.056  0.091  0.017  -0.024  1
1 3.147  2.129  -0.006  -0.056  -0.063  -0.002  0.109  0
1 -2.165  -2.718  -0.008  0.043  -0.103  -0.156  -0.024  1
1 -4.337  -2.686  -0.012  0.122  0.082  -0.021  -0.042  1

数据位置见[5]。


把数据从本地上传到HDFS中:

hadoop fs -put $LOCAL/test-data.csv $HADOOP_MAHOUT/


运行以下命令即可启动canopy clustering:

hadoop jar $MAHOUT_HOME/mahout-examples-0.5-job.jar \
     org.apache.mahout.clustering.syntheticcontrol.canopy.Job \
     -i $HADOOP_MAHOUT/test-data.csv \
     -o $HADOOP_MAHOUT \
     -t1 10 \

     -t2 1


Mahout Canopy Clustering输出结果查看

Canopy Clustering的输出结果就保存在$HADOOP_MAHOUT文件夹下,包含三个子文件:
../clusteredPoints
../clusters-0
../data


clusteredPoints是最后的聚类结果,里面记录了每个向量及其对应所分的类。

clusters-0记录每个类的中心点。
data是原始数据的sequence file格式文件。
clusteredPoints、clusters-0、data文件夹下的数据都是sequence file的形式,不能直接查看。
我们使用下面的命令,将数据转化为可阅读的文本:
mahout seqdumper \
     -s $HADOOP_MAHOUT/clusteredPoints/part-m-00000 \
     -o $LOCAL/clusteredPoints


mahout seqdumper \

     -s $HADOOP_MAHOUT/clusters-0/part-r-00000 \
     -o $LOCAL/clusters-0


clusteredPoints将按照原始数据样本的顺序,展示每个样本分别属于哪个类别,其中key后面的值是类别编号,value后面的值是数据点,如果某个样本的所有指标值都非零,那么会原样列出每个指标的值,如下面样例的第一行;如果存在值为零的指标,那么该指标的值不会列出,同时每个值前面会加上列标签,如下面样例的第二行。

Key: 4: Value: 1.0: [1.000, -0.213, -0.956, -0.003, 0.056, 0.091, 0.017, -0.024, 1.000]
Key: 3: Value: 1.0: [0:1.000, 1:3.147, 2:2.129, 3:-0.006, 4:-0.056, 5:-0.063, 6:-0.002, 7:0.109]
Key: 0: Value: 1.0: [1.000, -2.165, -2.718, -0.008, 0.043, -0.103, -0.156, -0.024, 1.000]
Key: 0: Value: 1.0: [1.000, -4.337, -2.686, -0.012, 0.122, 0.082, -0.021, -0.042, 1.000]


clusters-0给出了每个类别的中心点,如下所示:

Key: C-0: Value: C-0: {8:0.9903846153846154,7:0.03641560060121199,6:-0.011104891601517057,5:-0.018746460252920098,4:0.0018451485029808527,3:0.02659166333809029,2:-2.0914853859015725,1:-2.2735344078494943,0:1.0}
Key: C-1: Value: C-1: {8:0.005681818181818182,7:-0.005705937927015517,6:0.018373023001902314,5:-0.02408518413578759,4:-0.0649238556654074,3:-0.003042417008279087,2:2.5123232537912283,1:2.0664589339683306,0:1.0}
Key: C-2: Value: C-2: {8:0.006493506493506494,7:-0.01019964334516059,6:0.023497740573602648,5:-0.03181163901232867,4:-0.05941297790332273,3:-0.017834190866604666,2:2.382976575761404,1:2.1735244959638065,0:1.0}
Key: C-3: Value: C-3: {8:0.007575757575757576,7:-0.011551099054202508,6:0.023459485214657627,5:-0.02978024551438345,4:-0.05926968634175531,3:-0.016503525708008473,2:2.2626847929337592,1:2.1570361543820167,0:1.0}
Key: C-4: Value: C-4: {8:0.9230769230769231,7:0.04076923076923077,6:-0.011730769230769232,5:-0.019307692307692307,4:0.024653846153846155,3:0.013730769230769239,2:-1.6028076923076924,1:-1.595076923076923,0:1.0}


我们还可以使用clusterdump将clusteredPoints和clusters-0的结果整合在一起,命令行如下:

mahout clusterdump \
     -s $HADOOP_MAHOUT/clusters-0 \
     -p $HADOOP_MAHOUT/clusteredPoints \
     -o $LOCAL/clusters-0-dump


样例为:

C-0{n=8 c=[1.000, -2.274, -2.091, 0.027, 0.002, -0.019, -0.011, 0.036, 0.990] r=[1:0.311, 2:0.264, 3:0.039, 4:0.014, 5:0.004, 6:0.009, 7:0.013, 8:0.025]}
     Weight:  Point:
     1.0: [1.000, -2.165, -2.718, -0.008, 0.043, -0.103, -0.156, -0.024, 1.000]
     1.0: [1.000, -4.337, -2.686, -0.012, 0.122, 0.082, -0.021, -0.042, 1.000]
     1.0: [1.000, -1.647, -2.577, -0.055, -0.035, -0.083, 0.107, -0.059, 1.000]
     1.0: [1.000, -2.652, -4.169, -0.057, -0.029, -0.256, 0.040, 0.018, 1.000]
     1.0: [1.000, -2.882, -3.167, -0.136, -0.155, 0.106, -0.092, 0.198, 1.000]
     1.0: [1.000, -2.650, -1.811, -0.145, 0.069, 0.075, -0.067, 0.124, 1.000]
     1.0: [1.000, -3.843, -2.356, -0.180, -0.092, 0.027, 0.102, -0.086, 1.000]
     1.0: [1.000, -2.056, -1.738, 0.006, -0.135, 0.071, 0.074, -0.004, 1.000]
     1.0: [1.000, -3.038, -1.432, 0.025, 0.146, 0.014, -0.202, 0.044, 1.000]
     1.0: [1.000, -1.853, -2.228, 0.035, 0.160, 0.011, 0.005, -0.094, 1.000]
     1.0: [1.000, -2.003, -2.989, 0.038, 0.143, -0.086, -0.044, 0.015, 1.000]
     1.0: [1.000, -1.883, -2.000, 0.047, -0.037, -0.021, -0.089, 0.054, 1.000]
     1.0: [1.000, -1.817, -2.721, 0.055, -0.256, -0.218, 0.145, 0.063, 1.000]
     1.0: [1.000, -2.384, -1.402, 0.075, 0.069, 0.047, 0.093, 0.008, 1.000]
     1.0: [1.000, -3.550, -4.024, 0.083, -0.019, 0.055, 0.027, -0.093, 1.000]
     1.0: [1.000, -2.859, -2.076, 0.090, 0.125, 0.067, 0.023, 0.087, 1.000]
     1.0: [1.000, -3.173, -2.867, 0.111, -0.094, 0.093, -0.007, -0.066, 1.000]
     1.0: [1.000, -3.201, -1.680, 0.123, -0.002, -0.176, -0.084, 0.056, 1.000]

     1.0: [1.000, -1.899, -2.924, 0.148, 0.008, 0.005, -0.012, 0.210, 1.000]


参考资料:

[1] 理解矩阵(一),http://blog.csdn.net/myan/article/details/647511#
[2] 理解矩阵(二),http://blog.csdn.net/myan/article/details/649018
[3] 理解矩阵(三),http://blog.csdn.net/myan/article/details/1865397
[4] http://micahlabrams.blogspot.com/2011/10/canopy-clustering.html
[5] http://pan.baidu.com/share/link?shareid=418190220&uk=1258687326


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值