(1)http://archive.ics./ml/databases/synthetic_control/synthetic_control.data
點擊鏈接,下載數(shù)據(jù)集synthetic_control.data。
將數(shù)據(jù)集synthetic_control.data放到MAHOUT_HOME目錄下面,(注意:這里一定要放到此目錄下,否則會異常報錯)
(2)啟動Hadoop
hadoop@master:~$ start-all.sh
(3)創(chuàng)建測試目錄testdata(這里的目錄的名字只能是testdata)
hadoop@master:~$ hadoop dfs -mkdir testdata (創(chuàng)建后的路徑為:/user/hadoop/testdata)
(4)并把數(shù)據(jù)導(dǎo)入到這個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)查看運行結(jié)果。依次運行下列命令: (運行結(jié)果保存在:/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
如果看到以下結(jié)果,那么算法運行成功,你的安裝也就成功了:
canopies clusters-1 clusters-3 clusters-5 clusters-7 points
clusters-0 clusters-2 clusters-4 clusters-6 data
(這些文件都是sequenceFile的方式,直接打開會出現(xiàn)亂碼!)
(7)對測試結(jié)果進行分析:
<1>數(shù)據(jù)類型分析:
<a>clusteredPoints:存放的是最后聚類的結(jié)果,將cluster-id和documents-id都展示出來了,用mahout seqdumper讀clusteredPoints結(jié)果的key-value類型是(IntWritable,WeightedVectorWritable)
<b>clusters-N:是第N次聚類的結(jié)果,其中n為某類的樣本數(shù)目,c為各類各屬性的中心,r為各類屬性的半徑。 clusters-N結(jié)果類型是(Text,Cluster)
<c>data:存放的是原始數(shù)據(jù),這個文件夾下的文件可以用mahout vectordump來讀取,原始數(shù)據(jù)是向量形式的,其它的都只能用mahout seqdumper來讀取,向量文件也可以用mahout seqdumper來讀取,只是用vectordump讀取出來的是數(shù)字結(jié)果,沒有對應(yīng)的key,用seqdumper讀出來的可以看到key,即對應(yīng)的url,而value讀出來的是一個類描述,而不是數(shù)組向量
<2>命令類型分析:
mahout seqdumper:將SequenceFile文件轉(zhuǎn)成可讀的文本形式,對應(yīng)的源文件是org.apache.mahout.utils.SequenceFileDumper.java
mahout vectordump:將向量文件轉(zhuǎn)成可讀的文本形式,對應(yīng)的源文件是org.apache.mahout.utils.vectors.VectorDumper.java
mahout clusterdump:分析最后聚類的輸出結(jié)果,對應(yīng)的源文件是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指向的目錄存放的是某類有幾個點和該類的質(zhì)心點及半徑,即clusters-N目錄,pointsDir指向的是所有輸入點歸于哪一類,即clusteredPoints目錄,兩者聯(lián)合起來,就可以列舉出屬于同一類的所有點)
(注意input指向的目錄,要是最后一次迭代的結(jié)果目錄,最后一次迭代的結(jié)果才是最終的結(jié)果)
(1)SequenceFile介紹
SequeceFile是Hadoop API提供的一種二進制文件支持。這種二進制文件直接將<key, value>對序列化到文件中。一般對小文件可以使用這種文件合并,即將文件名作為key,文件內(nèi)容作為value序列化到大文件中。
這種文件格式有以下好處:
支持壓縮,且可定制為基于Record或Block壓縮(Block級壓縮性能較優(yōu))
本地化任務(wù)支持:因為文件可以被切分,因此MapReduce任務(wù)時數(shù)據(jù)的本地化情況應(yīng)該是非常好的。
難度低:因為是Hadoop框架提供的API,業(yè)務(wù)邏輯側(cè)的修改比較簡單。
壞處是需要一個合并文件的過程,且合并后的文件將不方便查看。
(2)mahout與SequenceFile
首先簡單說明下,mahout下處理的文件必須是SequenceFile格式的,所以需要把txtfile轉(zhuǎn)換成sequenceFile。
SequenceFile是hadoop中的一個類,允許我們向文件中寫入二進制的鍵值對,
具體介紹請看eyjian寫的http://www./viewthread.php?tid=144&highlight=sequencefile
輸入命令(--input和--output的路徑必須一樣):
<1>把txt文本文件轉(zhuǎn)換成sequenceFile
hadoop@master:~$ mahout seqdirectory --input /test/ --output /test/ --charset UTF-8
結(jié)果可以看到:在test目錄下多了1個文件(chunk-0), 這就是我們要的SequenceFile格式文件
問題:在我的測試中并沒有用到這個命令??????????
<2>將SequenceFile文件轉(zhuǎn)成文本形式:
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中的測試數(shù)據(jù)下載
數(shù)據(jù)源:http://kdd.ics./databases/里面有大量經(jīng)典數(shù)據(jù)提供下載
(4)maven編譯mahout的源文件
下載mahout-0.7的源文件(src文件:mahout-distribution-0.7-src.tar.gz):http://apache.//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的安 裝目錄下執(zhí)行命令:mvn install時,會提示錯誤,找不到pom.xml。
注意2:使用mvn install:會比較慢,因為測試過程會比較慢,而且容易失?。?!
注意3:使用mvn install -Dmaven.test.skip=true:Maven 提供了跳過單元測試的能力,只需要使用 Surefire 插件的 skip 參數(shù)。 在命令行,只要簡單的給任何目標添加 maven.test.skip 屬性就能跳過測試
(1)kmeans算法簡介
同一聚類中的對象相似度較高,而不同聚類中的對象相似度較小。
以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結(jié)果。
首先從n個數(shù)據(jù)對象任意選擇 k個 對象作為初始聚類中心;而對于所剩下其它對象,則根據(jù)它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然后 再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復(fù)這一過程直到標準測度函數(shù)開始收斂為止。一般都采用均方差作為標準測度函數(shù). k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。
對于每一個 cluster,我們可以選出一個中心點 (center),使得該 cluster中的所有的點到該中心點的距離小于到其他 cluster的中心的距離
(2)canopy算法簡介
Canopy 算法首先會要求輸入兩個閥值 T1和T2,T1>T2;算法有一個集群這里叫Canopy的集合(Set),當(dāng)然一開始它是空的;然后會將讀取到的第一個點作為集合中的一個 Canopy,接著讀取下一個點,若該點與集合中的每個Canopy計算距離,若這個距離小于T1,則這個點會分配給這個Canopy(一個點可以分配給 多個Canopy),而當(dāng)這個距離小于T2時這個點不能作為一個新的Canopy而放到集合中。也就是說當(dāng)一個點只要與集合中任意一個Canopy的距離 小于T2了,即表示它里那個Canopy太近不能作為新的Canopy。若都沒有則生成一個新的Canopy放入集合中。以此循環(huán),直到?jīng)]有點了。
首先通過Canopy算法進行聚類,以確定簇數(shù)以及初始簇心的,接著通過K-means算法進行迭代運算,收斂出最后的聚類結(jié)果。
折騰死了,總結(jié)下:
1.運行kmeans算法的時候下載的是mahout-distribution-0.8.tar.gz,是編譯后的版本(安裝版),運行的很順利!當(dāng)運行bayes(貝葉斯)算法時出問題了,按照mahout官網(wǎng)上的步驟,執(zhí)行mvn install是報錯:說找不到pom.xml??!發(fā)現(xiàn):這個是在源碼上運行的!!這才又下載了mahout-distribution-0.8-src.tar.gz,直接編譯(mvn install)的時候并沒成功,又把源碼導(dǎo)入到eclipse中,修修改改,終于編譯成功了?。?BR>2.但是當(dāng)運行命令:mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups .......的時候,就報錯:說找不到PrepareTwentyNewsgroups??!經(jīng)過一番折騰,終于發(fā)現(xiàn)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(貝葉斯)算法簡介
樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素貝葉斯分類是因為這種方法的思想真的很樸素,樸素貝葉斯的思想基礎(chǔ)是這樣的:對于給出的待分類項,求解在此項出現(xiàn)的條件下各個類別出現(xiàn)的概率哪個最大,就認為此待分類項屬于哪個類別。
這二十個新聞組數(shù)據(jù)集合是收集大約20,000新聞組文檔,均勻的分布在20個不同的集合。這20個新聞組集合采集最近流行的數(shù)據(jù)集合到文本程序中作為實驗,根據(jù)機器學(xué)習(xí)技術(shù)。例如文本分類,文本聚集。我們將使用Mahout的Bayes Classifier創(chuàng)造一個模型,它將一個新文檔分類到這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的數(shù)據(jù)
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
運行結(jié)果:
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的數(shù)據(jù)
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
運行結(jié)果:
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)將訓(xùn)練文本集上傳到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)模型訓(xùn)練:依據(jù)訓(xùn)練文本集來訓(xùn)練貝葉斯分類器模型
解釋一下命令:-i:表示訓(xùn)練集的輸入路徑,HDFS路徑; -o:分類模型輸出路徑; -type:分類器類型,這里使用bayes,可選cbayes;
-ng:(n-gram)建模的大小,默認為1; -source:數(shù)據(jù)源的位置,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)模型測試:依據(jù)訓(xùn)練的貝葉斯分類器模型來進行分類測試
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
運行結(jié)果(與apache官網(wǎng)里面的一致):
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官網(wǎng):https://cwiki./confluence/display/MAHOUT/Twenty+Newsgroups
(2)http://blog.csdn.net/crazyzhb2012/article/details/9795609
(3)http://blog.csdn.net/zc55803903/article/details/7933126