Mahout K-means聚类

来源:互联网 发布:stussy淘宝正品 编辑:程序博客网 时间:2024/05/01 15:10
在实际工作中,我们很少有完整的时间段能够仔细研透一门学问。因此针对一门新学问、一套新知识、一种新方法,我们追求的是,先把它用起来,让其有实际的产出,尔后如有必要再慢慢研究其内在机理,以逐渐达到熟练自如地应用的境地。

为了快速掌握一种方法的使用,我们要搞清楚的无外乎以下几个问题:
  • 这个方法是做什么的?
  • 我该准备些什么数据?
  • 我该如何将该方法用于已准备好的数据?
  • 该方法的输出结果如何使用?
以上是小小的感悟。在本文中,借助K-means这个最著名的聚类方法,以及mahout系统,我们来完整研究聚类分析的相关理论。遵循从实践到理论的路径,我们先来完整走一遍使用mahout进行K-means聚类的流程,让它优雅地run起来。对于K-means聚类,我们关注如下问题:
  • K-means Clustering是什么?
  • 输入数据的格式是什么?
  • 如何提交程序执行聚类?
  • 输出结果如何查看?
下面依次展开,希望你花费的时间不会超过半小时!

K-means Clustering是什么?

K-means Clustering是最经典的聚类方法,其流程如下:
(1)从N个样本点构成的样本集中随机选取k个点,构成初始聚类中心点。
(2)对剩余的样本点,分别计算其中每一个与k个中心点的欧氏距离。
(3)计算k个类别的新的中心点。
(4)重复(2)~(3)步,直到新的中心点与原中心点相等,或者小于某个阈值。

Mahout K-means 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
数据位置见[1]。

准备好数据后,我们把存放数据的文件testdata从本地上传到HDFS中:
hf -put $MAHOUT_HOME/test-data.csv $HADOOP_MAHOUT/testdata

然后,执行以下命令行提交任务进行kmeans聚类:
hadoop jar $MAHOUT_HOME/mahout-examples-0.5-job.jar \
org.apache.mahout.clustering.syntheticcontrol.kmeans.Job \
-i $HADOOP_MAHOUT/testdata \
-o $HADOOP_MAHOUT \
-k 4 \
-x 100 \
-t1 10 \
-t2 1 \

Mahout K-means Clustering输出结果查看

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

输出结果文件可以从位置[2]下载查看。
clusteredPoints是最后的聚类结果,里面记录了每个向量及其对应所分的类。
clusters-0记录每个类的初始中心点。也就是我们算法第(1)步的输出结果。
clusters-1和clusters-2分别是第1次和第2次迭代后每个类的中心点。从中也可以看出算法迭代了2次后收敛。
data是原始数据的sequence file格式文件。
clusteredPoints、clusters-0~clusters-2、data文件夹下的数据都是sequence file的形式,不能直接查看。
我们使用下面的命令,将数据转化为可阅读的文本:
mahout seqdumper \
     -s $HADOOP_MAHOUT/clusteredPoints/part-m-00000 \
     -o $LOCAL/clusteredPoints

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-0/part-randomSeed \
     -o $LOCAL/clusters-0

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-1/part-r-00000 \
     -o $LOCAL/clusters-1

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-2/part-r-00000 \
     -o $LOCAL/clusters-2

clusteredPoints将按照原始数据样本的顺序,展示每个样本分别属于哪个类别,其中key后面的值是类别编号,value后面的值是数据点,如果某个样本的所有指标值都非零,那么会原样列出每个指标的值,如下面样例的第一行;如果存在值为零的指标,那么该指标的值不会列出,同时每个值前面会加上列标签,如下面样例的第二行。
Key: 59: Value: 1.0: [1.000, -0.213, -0.956, -0.003, 0.056, 0.091, 0.017, -0.024, 1.000]
Key: 18: 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: 58: Value: 1.0: [1.000, -2.165, -2.718, -0.008, 0.043, -0.103, -0.156, -0.024, 1.000]
Key: 21: Value: 1.0: [1.000, -4.337, -2.686, -0.012, 0.122, 0.082, -0.021, -0.042, 1.000]

clusters-0给出了每个类别的初始中心点,如下所示:
Key: 9: Value: CL-18{n=0 c=[0:1.000, 1:1.451, 2:1.882, 3:-0.108, 4:-0.006, 5:-0.144, 6:0.001, 7:-0.003] r=[]}
Key: 9: Value: CL-21{n=0 c=[1.000, -2.650, -1.811, -0.145, 0.069, 0.075, -0.067, 0.124, 1.000] r=[]}
Key: 9: Value: CL-58{n=0 c=[1.000, -1.899, -2.924, 0.148, 0.008, 0.005, -0.012, 0.210, 1.000] r=[]}
Key: 9: Value: CL-59{n=0 c=[1.000, 0.148, -1.547, 0.162, 0.113, -0.010, 0.042, 0.075, 1.000] r=[]}

我们还可以使用clusterdump将clusteredPoints和clusters-0至clusters-2的结果整合在一起,由于clusters-2代表了最后的聚类结果,我们来查看这个文件代表的类别。命令行如下:
mahout clusterdump \
     -s $HADOOP_MAHOUT/clusters-2 \
     -p $HADOOP_MAHOUT/clusteredPoints \
     -o $LOCAL/clusters-2-dump

样例为:
VL-21{n=12 c=[1.000, -2.841, -1.434, -0.002, 0.022, 0.001, -0.004, 0.019, 1.000] r=[1:0.690, 2:0.776, 3:0.094, 4:0.098, 5:0.088, 6:0.085, 7:0.076]}
     Weight:  Point:
     1.0: [1.000, -4.337, -2.686, -0.012, 0.122, 0.082, -0.021, -0.042, 1.000]
     1.0: [1.000, -2.209, -0.176, -0.047, 0.131, -0.140, 0.071, 0.061, 1.000]
     1.0: [1.000, -1.950, -0.861, -0.104, -0.010, 0.023, -0.029, -0.130, 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, -3.130, -0.029, 0.072, -0.036, -0.121, 0.038, -0.013, 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, -2.438, -0.965, 0.076, -0.123, 0.046, -0.049, 0.128, 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.201, -1.680, 0.123, -0.002, -0.176, -0.084, 0.056, 1.000]
其中,
VL-21代表这是一个cluster
n=12代表该cluster有12个点
c=[...]代表该cluster的中心点
r=[...]代表cluster的半径


参考资料:

[1] http://pan.baidu.com/share/link?shareid=418190220&uk=1258687326

[2] http://pan.baidu.com/share/link?shareid=2724595002&uk=1258687326

0 0
原创粉丝点击