2、模型
以上訓練部分的四個job 執行完畢後,整個 bayes 模型就建立完畢了,總共生成並儲存三個目錄檔案:
trainer-tfidf
trainer-weights
trainer-thetanormalizer
我們可以將模型從分布式上sequence 檔案導成本地的 txt 檔案進行檢視。
3、測試
呼叫類:testclassifier
所在包:package org.apache.mahout.classifier.bayes;
根據命令列引數會選擇順序執行還是並行map/reduce 執行,這裡只分析並行 map/reduce ,執行時會呼叫 bayesclassifierdriver 類
分析bayesclassifierdriver 類
⑴ 首先,執行configure :
先algorithm=new bayesalgorithm()和 datastore=new inmemorydatastore ( params) , datastore 時 inmemorydatastore ( params) 方法將模型裝入到 datastore 中即裝入
sigma_j
、sigma_
k、 sigma_
ksigma_j
、thetanormalizer
、weight=tfidf 、 alpha_i=1.0 );
再classifier=new classifiercontext(algorithm,datastore), classifier.initialize() ,即初始化 classifier ,初始化 classifier 是 datastore.initialize() 和 algorithm.initialize ( this.datastore )。
datastore的初始化:
呼叫sequencefilemodelreader 的 loadmodel 方法(五個 load 方法): ①
loadfeatureweights(裝入的是
sigma_j
)生成hashmap
sigma_j
其中 0 、 1
…等是屬性的標號,weight 是
sigma_j
的value 。 ②
loadlabelweights(裝入的是
sigma_
k)生成 hashmap
sigma_
k其中 0 、 1
…等是label 即類標籤的標號, weight 是
sigma_
k的 value 。
③loadsumweight (裝入的是
sigma_
ksigma_j
)使datastore 的成員變數
sigma_
jsigma_
k=value(訓練得到的所有 tfidf 總和)。
④loadthetanormalizer (裝入的是 thetanormalizer )生成 hashmap thetanormalizerperlabel其中 weight 是傳進來的 value ,使 datastore 的成員變數 thetanormalizer=max(1.0 |weight|) 。
⑤loadweightmatrix (裝入的是 weight 即 tfidf )生成 weightmatrix 是 sparsematrix ,其中行是屬性的標號,列是 label 的標號,行列交叉的地方是 tfidf 。
algorithm的初始化:
呼叫datastore.getkeys , getkeys 返回 labeldicionary.keys 即返回乙個集合,裡面放的是所有的 label 。
其次,執行map :開始分類 classifier.classifydocument(),classifydocument() 呼叫 algorithm.classifydocument 。
先new result categories=
」label weight
」即所有的label 集合;
再開始迴圈:針對每乙個類進行迴圈,呼叫documenweight :先計算文件中每個詞的次數( frequency ),生成乙個 map 叫 wordlist ,針對 wordlist 的 each pair 計算:∑ [frequenc
y×featureweight(datastore,label,word)
]。其中
featureweight共四個,都呼叫datastore.getweight,以下分別分析:
①double result = 呼叫datastore.getweight,稀疏矩陣的getquick,取出矩陣的tfidf值;
②double vocabcount =屬性總數;
③double sumlableweight =sigma_k的值;
④double numerator =result + 1.0;
⑤double denominator = sumlableweight + vocabcount;
⑥double weight =log(numerator/denominator)也就是=log[(tfidf+1.0)/(sigma_k+屬性個數)];
返回的是result = -weight;
所以說,
documenweight返回的值是測試文件屬於某類的概率的大小,即所有屬性的在某類下的 frequenc
y×result之和與在其他類下的和值進行比較,最大值的,取出它的label,文件就屬於此類。
key=_ct 正確 label 分類 label value=1.0 ⑵
bayesclassifierreducer
只是合併map的結果。
key=_ct 正確 label 分類 label value= 正確分類的文件數
根據對以上∑(frequenc
y×result)進行分析,參照貝葉斯多項式模型,
frequency
是對weight中取對數時轉移到前面的,即log(numerator/denominator)
frequency
= frequency
×log(numerator/denominator),weight是條件概率,即log[(numerator/denominator)
frequency
×(numerator/denominator)
frequency
…] =
∑log(numerator/denominator)
frequency
因為按貝葉斯原理來說,後驗概率=先驗概率×條件概率,據我理解,此處為什麼沒有乘先驗概率,可能是因為所用的20個新聞的資料每類中的文件數大致一樣,先驗概率幾乎一樣,所以沒必要乘(個人猜測)。 ⑶
confusionmatrix函式顯示結果
key=正確 label value=
mahout 分類演算法
資料探勘有很多的領域,分類是其中之一,分類就是把一些新的資料項對映到給定類別的中的某乙個類別,比如當我們發表一篇文章的時候,就可以自動的把這篇文章劃分到某乙個文章類別,一般的過程是根據樣本的資料利用一定的分類演算法,得到分類規則,新的資料過來就依據該規則進行類別的劃分。分類在資料探勘中是一項非常重要...
樸素bayes公式分類器
理論問題 樸素貝葉斯文字分類模型分為兩種 文件型 詞頻型 都是使用下式計算進行分類 cnb arg max p cj 1c p xi cj 其中,p cj 為類別j的先驗概率,p xi cj 為特徵量 xi在類別cj的類條件概率 上次的分類模型屬於文件型的,正確率約為50 左右,理論上樸素貝葉斯分類...
mahout探索之旅 CART分類回歸演算法
cart 演算法原理與理解 cart演算法的全稱是分類回歸樹演算法,分類即劃分離散變數 回歸劃分連續變數。他與c4.5很相似,但是乙個二元分類,採用的是類似於熵的gini指數作為分類決策,形成決策樹之後還要進行剪枝,我自己在實現整個演算法的時候採用的是代價複雜度演算法。gini 指數主要是度量資料劃...