mahout中bayes分類分析 2

2021-09-01 14:01:50 字數 3448 閱讀 5388

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 指數主要是度量資料劃...