读过孟岩的《理解矩阵》系列博文[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