mahout

preface

运行自带的例子来进行测试

第1章 使用kmeans算法实例

(1)http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data
点击链接,下载数据集synthetic_control.data。
将数据集synthetic_control.data放到MAHOUT_HOME目录下面,(注意:这里一定要放到此目录下,否则会异常报错)
(2)启动Hadoop
hadoop@master:~$ start-all.sh
(3)创建测试目录testdata(这里的目录的名字只能是testdata)
hadoop@master:~$ hadoop dfs -mkdir testdata     (创建后的路径为:/user/hadoop/testdata)
(4)并把数据导入到这个tastdata目录中
hadoop@master:~$ hadoop fs -put /home/hadoop/mahout/mahout-distribution-0.7/synthetic_control.data testdata
(5)使用kmeans算法
hadoop@master:~$ hadoop jar $MAHOUT_HOME/mahout-examples-0.7-job.jar org.apache.mahout.clustering.syntheticcontrol.kmeans.Job

(方法有:kmeans canopy fuzzykmeans dirichlet meanshift)
(6)查看运行结果。依次运行下列命令:                (运行结果保存在:/user/hadoop/output)
hadoop@master:~$ hadoop dfs -ls output
hadoop@master:~$ hadoop dfs -get output $MAHOUT_HOME/examples    (从hdfs上下载到本地)
hadoop@master:~$ cd $MAHOUT_HOME/examples/output
hadoop@master:~/mahout/mahout-distribution-0.7/examples/output$ ls
如果看到以下结果,那么算法运行成功,你的安装也就成功了:
canopies    clusters-1  clusters-3  clusters-5  clusters-7  points
clusters-0  clusters-2  clusters-4  clusters-6  data
(这些文件都是sequenceFile的方式,直接打开会出现乱码!)
(7)对测试结果进行分析:
<1>数据类型分析:
<a>clusteredPoints:存放的是最后聚类的结果,将cluster-id和documents-id都展示出来了,用mahout seqdumper读clusteredPoints结果的key-value类型是(IntWritable,WeightedVectorWritable)
<b>clusters-N:是第N次聚类的结果,其中n为某类的样本数目,c为各类各属性的中心,r为各类属性的半径。 clusters-N结果类型是(Text,Cluster)
<c>data:存放的是原始数据,这个文件夹下的文件可以用mahout vectordump来读取,原始数据是向量形式的,其它的都只能用mahout seqdumper来读取,向量文件也可以用mahout seqdumper来读取,只是用vectordump读取出来的是数字结果,没有对应的key,用seqdumper读出来的可以看到key,即对应的url,而value读出来的是一个类描述,而不是数组向量
<2>命令类型分析:
mahout seqdumper:将SequenceFile文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.SequenceFileDumper.java
mahout vectordump:将向量文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.vectors.VectorDumper.java
mahout clusterdump:分析最后聚类的输出结果,对应的源文件是org.apache.mahout.utils.clustering.ClusterDumper.java
<3>实际命令如下(-i <hdfs上的路径> -o <本地路径>):
hadoop@master:~$ mahout seqdumper -i /user/hadoop/output/clusteredPoints/part-m-00000 -o /home/hadoop/data/result_points.txt
hadoop@master:~$ mahout vectordump -i /user/hadoop/output/data/part-m-00000 -o /home/hadoop/data/result_data.txt
hadoop@master:~$ mahout seqdumper -i /user/hadoop/output/clusters-2/part-r-00000 -o /home/hadoop/data/result_clusters2.txt
hadoop@master:~$ mahout clusterdump --input /user/hadoop/output/clusters-0 --pointsDir /user/hadoop/output/clusteredPoints --output /home/hadoop/data/result_clusters0.txt
(这个命令会将每一类的点列出来,input指向的目录存放的是某类有几个点和该类的质心点及半径,即clusters-N目录,pointsDir指向的是所有输入点归于哪一类,即clusteredPoints目录,两者联合起来,就可以列举出属于同一类的所有点)
(注意input指向的目录,要是最后一次迭代的结果目录,最后一次迭代的结果才是最终的结果)

第2章 mahout杂记

(1)SequenceFile介绍

SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将<key, value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。
这种文件格式有以下好处:
    支持压缩,且可定制为基于Record或Block压缩(Block级压缩性能较优)
    本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况应该是非常好的。
    难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。
坏处是需要一个合并文件的过程,且合并后的文件将不方便查看。

(2)mahout与SequenceFile

首先简单说明下,mahout下处理的文件必须是SequenceFile格式的,所以需要把txtfile转换成sequenceFile。
SequenceFile是hadoop中的一个类,允许我们向文件中写入二进制的键值对,
具体介绍请看eyjian写的http://www.hadoopor.com/viewthread.php?tid=144&highlight=sequencefile
输入命令(--input和--output的路径必须一样):

<1>把txt文本文件转换成sequenceFile

hadoop@master:~$ mahout seqdirectory --input /test/ --output /test/ --charset UTF-8
结果可以看到:在test目录下多了1个文件(chunk-0), 这就是我们要的SequenceFile格式文件


问题:在我的测试中并没有用到这个命令??????????

<2>将SequenceFile文件转成文本形式:

hadoop@master:~$ mahout seqdumper -s /test/chunk-0 -o test.txt

注意1:mahout-0,5中-s:表示输入文件路径, mahout-0.8中-i:表示输入文件路径。输入路径是指HDFS上的路径

注意2:输出路径test.txt----存放在/home/hadoop中,也就是本地路径

(3)mahout中的测试数据下载

数据源:http://kdd.ics.uci.edu/databases/里面有大量经典数据提供下载

 

(4)maven编译mahout的源文件

下载mahout-0.7的源文件(src文件:mahout-distribution-0.7-src.tar.gz):http://apache.etoak.com//mahout/0.7/ 解压,我放在/home/hadoop/mahout-src下,

<1>进入mahout-0.7源文件目录:cd $MAHOUT_HOME,

<2>编译mahout源文件的命令:mvn install   或  mvn install -Dmaven.test.skip=true

注意1:因为maven是编译mahout的源文件,所以要下载mahout-distribution-0.7-src.tar.gz版本,如果下载的是mahout-distribution-0.7.tar.gz版本,在mahout的安 装目录下执行命令:mvn install时,会提示错误,找不到pom.xml。

注意2使用mvn install:会比较慢,因为测试过程会比较慢,而且容易失败!!

注意3使用mvn install -Dmaven.test.skip=true:Maven 提供了跳过单元测试的能力,只需要使用 Surefire 插件的 skip 参数。 在命令行,只要简单的给任何目标添加 maven.test.skip 属性就能跳过测试

第3章 mahout聚类算法

(1)kmeans算法简介

同一聚类中的对象相似度较高,而不同聚类中的对象相似度较小。
以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
首先从n个数据对象任意选择 k个 对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后 再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
对于每一个 cluster,我们可以选出一个中心点 (center),使得该 cluster中的所有的点到该中心点的距离小于到其他 cluster的中心的距离

(2)canopy算法简介

Canopy 算法首先会要求输入两个阀值 T1和T2,T1>T2;算法有一个集群这里叫Canopy的集合(Set),当然一开始它是空的;然后会将读取到的第一个点作为集合中的一个 Canopy,接着读取下一个点,若该点与集合中的每个Canopy计算距离,若这个距离小于T1,则这个点会分配给这个Canopy(一个点可以分配给 多个Canopy),而当这个距离小于T2时这个点不能作为一个新的Canopy而放到集合中。也就是说当一个点只要与集合中任意一个Canopy的距离 小于T2了,即表示它里那个Canopy太近不能作为新的Canopy。若都没有则生成一个新的Canopy放入集合中。以此循环,直到没有点了。

首先通过Canopy算法进行聚类,以确定簇数以及初始簇心的,接着通过K-means算法进行迭代运算,收敛出最后的聚类结果。

第4章 mahout运行bayes(贝叶斯)算法

折腾死了,总结下:
1.运行kmeans算法的时候下载的是mahout-distribution-0.8.tar.gz,是编译后的版本(安装版),运行的很顺利!当运行bayes(贝叶斯)算法时出问题了,按照mahout官网上的步骤,执行mvn install是报错:说找不到pom.xml!!发现:这个是在源码上运行的!!这才又下载了mahout-distribution-0.8-src.tar.gz,直接编译(mvn install)的时候并没成功,又把源码导入到eclipse中,修修改改,终于编译成功了!!
2.但是当运行命令:mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups .......的时候,就报错:说找不到PrepareTwentyNewsgroups!!经过一番折腾,终于发现mahout-distribution-0.7-src里面bayes的文件夹为空(或者就没有这个文件夹)!!然后就去找mahout前几个版本,把mahout-distribution-0.4-src到mahout-distribution-0.8-src都下载下来了,0.7和0.8里面没有bayes的文件夹,0.4和0.6里面虽然bayes的文件夹不为空,但是总编译不成功,最后只有0.5没有问题!!

bayes(贝叶斯)算法简介

 

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率哪个最大,就认为此待分类项属于哪个类别。

这二十个新闻组数据集合是收集大约20,000新闻组文档,均匀的分布在20个不同的集合。这20个新闻组集合采集最近流行的数据集合到文本程序中作为实验,根据机器学习技术。例如文本分类,文本聚集。我们将使用MahoutBayes Classifier创造一个模型,它将一个新文档分类到这20个新闻组集合范例演示

mahout运行bayes(贝叶斯)算法的前提条件:

(1)启动hadoop
hadoop@master:~$ start-all.sh
(2)成功编译mahout源码
hadoop@master:~$ cd $MAHOUT_HOME
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ mvn install -Dmaven.test.skip=true

mahout运行bayes(贝叶斯)算法的步骤:

(1)生成input的数据
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups -p /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-data/20news-bydate/20news-bydate-train -o /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-result/bayes-train-input -a org.apache.mahout.vectorizer.DefaultAnalyzer -c UTF-8  
运行结果:
Running on hadoop, using HADOOP_HOME=/home/hadoop/cloud/hadoop-1.0.4
HADOOP_CONF_DIR=/home/hadoop/cloud/confDir/hadoop/conf
Warning: $HADOOP_HOME is deprecated.

13/08/09 14:07:09 WARN driver.MahoutDriver: No org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups.props found on classpath, will use command-line arguments only
13/08/09 14:07:14 INFO driver.MahoutDriver: Program took 5202 ms
(2)生成test的数据
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups -p /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-data/20news-bydate/20news-bydate-test -o /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-result/bayes-test-input -a org.apache.mahout.vectorizer.DefaultAnalyzer -c UTF-8  
运行结果:
Running on hadoop, using HADOOP_HOME=/home/hadoop/cloud/hadoop-1.0.4
HADOOP_CONF_DIR=/home/hadoop/cloud/confDir/hadoop/conf
Warning: $HADOOP_HOME is deprecated.

13/08/09 14:13:35 WARN driver.MahoutDriver: No org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups.props found on classpath, will use command-line arguments only
13/08/09 14:13:38 INFO driver.MahoutDriver: Program took 3428 ms
(3)将训练文本集上传到HDFS上
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ hadoop dfs -put /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-result/bayes-train-input/ bayes-train-input
(4)模型训练:依据训练文本集来训练贝叶斯分类器模型
解释一下命令:-i:表示训练集的输入路径,HDFS路径; -o:分类模型输出路径; -type:分类器类型,这里使用bayes,可选cbayes;
-ng:(n-gram)建模的大小,默认为1; -source:数据源的位置,HDFS或HBase
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ mahout trainclassifier -i bayes-train-input -o bayes-newsmodel -type bayes -ng 1 -source hdfs
(5)将测试文本集上传到HDFS上
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ hadoop dfs -put /home/hadoop/mahout-0.5-src/mahout-distribution-0.5/my-test-result/bayes-test-input/ bayes-test-input
(6)模型测试:依据训练的贝叶斯分类器模型来进行分类测试
hadoop@master:~/mahout-0.5-src/mahout-distribution-0.5$ mahout testclassifier -m bayes-newsmodel -d bayes-test-input -type bayes -ng 1 -source hdfs -method mapreduce
运行结果(与apache官网里面的一致):
13/08/09 14:56:34 INFO bayes.BayesClassifierDriver: =======================================================
Confusion Matrix
-------------------------------------------------------
a        b        c        d        e        f        g        h        i        j        k        l        m        n        o        p        q        r        s        t        u        <--Classified as
381      0        0        0        0        9        1        0        0        0        1        0        2        0        0        1        0        0        3        0        0         |  398       a     = rec.motorcycles
1        284      0        0        0        0        1        0        6        3        11       0        3        66       0        1        6        0        4        9        0         |  395       b     = comp.windows.x
2        0        339      2        0        3        5        1        0        0        0        0        1        1        12       1        7        0        2        0        0         |  376       c     = talk.politics.mideast
4        0        1        327      0        2        2        0        0        2        1        1        5        0        1        4        12       0        2        0        0         |  364       d     = talk.politics.guns
7        0        4        32       27       7        7        2        0        12       0        0        0        6        100      9        7        31       0        0        0         |  251       e     = talk.religion.misc
10       0        0        0        0        359      2        2        0        1        3        0        6        1        0        1        0        0        11       0        0         |  396       f     = rec.autos
0        0        0        0        0        1        383      9        1        0        0        0        0        0        0        0        0        0        3        0        0         |  397       g     = rec.sport.baseball
1        0        0        0        0        0        9        382      0        0        0        0        1        1        1        0        2        0        2        0        0         |  399       h     = rec.sport.hockey
2        0        0        0        0        4        3        0        330      4        4        0        12       5        0        0        2        0        12       7        0         |  385       i     = comp.sys.mac.hardware
0        3        0        0        0        0        1        0        0        368      0        0        4        10       1        3        2        0        2        0        0         |  394       j     = sci.space
0        0        0        0        0        3        1        0        27       2        291      0        25       11       0        0        1        0        13       18       0         |  392       k     = comp.sys.ibm.pc.hardware
8        0        1        109      0        6        11       4        1        18       0        98       3        1        11       10       27       1        1        0        0         |  310       l     = talk.politics.misc
6        0        1        0        0        4        2        0        5        2        12       0        321      8        0        4        14       0        8        6        0         |  393       m     = sci.electronics
0        11       0        0        0        3        6        0        10       7        11       0        13       298      0        2        13       0        7        8        0         |  389       n     = comp.graphics
2        0        0        0        0        0        4        1        0        3        1        0        1        3        372      6        0        2        1        2        0         |  398       o     = soc.religion.christian
4        0        0        1        0        2        3        3        0        4        2        0        12       7        6        342      1        0        9        0        0         |  396       p     = sci.med
0        1        0        1        0        1        4        0        3        0        1        0        4        8        0        2        369      0        1        1        0         |  396       q     = sci.crypt
10       0        4        10       1        5        6        2        2        6        2        0        1        2        86       15       14       152      0        1        0         |  319       r     = alt.atheism
4        0        0        0        0        9        1        1        8        1        12       0        6        3        0        2        0        0        341      2        0         |  390       s     = misc.forsale
8        5        0        0        0        1        6        0        8        5        50       0        2        39       1        0        9        0        3        257      0         |  394       t     = comp.os.ms-windows.misc
0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0         |  0         u     = unknown
Default Category: unknown: 20


13/08/09 14:56:34 INFO driver.MahoutDriver: Program took 118128 ms

参考文章:
(1)mahout官网:https://cwiki.apache.org/confluence/display/MAHOUT/Twenty+Newsgroups
(2)http://blog.csdn.net/crazyzhb2012/article/details/9795609

(3)http://blog.csdn.net/zc55803903/article/details/7933126

 

http://www.360doc.com/content/14/0609/10/5205831_385026662.shtml

你可能感兴趣的:(机器学习)