日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现

發(fā)布時(shí)間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. Na?ve Bayes算法介紹

Na?ve Bayes是一個(gè)簡(jiǎn)單有效的分類算法,已經(jīng)得到廣泛使用。本文討論了海量數(shù)據(jù)(TB級(jí))下Na?ve Bayes算法的實(shí)現(xiàn)方法,并給出了Hadoop上的實(shí)現(xiàn)方案。

2. Na?ve Bayes算法介紹

樸素貝葉斯分類器基于一個(gè)簡(jiǎn)單的假定: 在給定目標(biāo)值時(shí)屬性值之間相互獨(dú)立, 即特征對(duì)于給定類的影響?yīng)毩⒂谄渌卣鳌@迷摷僭O(shè),文檔d 屬于類c 的概率可以表示為:

3. Na?ve Bayes算法在Hadoop上實(shí)現(xiàn)

分兩個(gè)階段進(jìn)行,首先是訓(xùn)練獲取分類器,然后是預(yù)測(cè)。

(1) 訓(xùn)練

訓(xùn)練階段要計(jì)算兩種概率:[1] 每種類別的先驗(yàn)概率 [2] 每個(gè)term(單詞)在每個(gè)類別中得條件概率。

[1] 計(jì)算類別的先驗(yàn)概率

由一個(gè)Hadoop Job實(shí)現(xiàn),偽代碼如下:

該作業(yè)主要統(tǒng)計(jì)了每種類別文檔的總數(shù)目,具體概率的計(jì)算放在了后面。假設(shè)該作業(yè)計(jì)算得到的數(shù)據(jù)匯總在了文件dict1.txt中。

[2] 計(jì)算term的條件概率

由一個(gè)Hadoop job實(shí)現(xiàn),偽代碼如下:

其中,c表示種類,w表示word,該作業(yè)只統(tǒng)計(jì)了每個(gè)<c,w>對(duì)出現(xiàn)的總次數(shù),具體條件概率計(jì)算放在了后面。假設(shè)該作業(yè)得到的數(shù)據(jù)匯總在文件dict2.txt中。

(2) 預(yù)測(cè)

預(yù)測(cè)時(shí),需要把文件dict1.txt和dict2.txt作為字典加載到內(nèi)存中,一般而言,dict1.txt很小,而dict2.txt很大,如種類數(shù)是100,term總數(shù)為10000,0000,則dict2需要保存的記錄總數(shù)為100*10000 0000=10^10。為了解決該問(wèn)題,提出以下解決方案:

(1)將種類分片存儲(chǔ)到多個(gè)文件中。比如,共有100個(gè)種類,每10個(gè)種類為一組存放到10個(gè)字典中(即:某個(gè)字典只保存與某10個(gè)種類相關(guān)的<c,w>對(duì),這個(gè)可以通過(guò)將同一種類的<c,w>將給相同reduce task處理做到),分批計(jì)算。

(2)dict2.txt中實(shí)際上存放的是一個(gè)稀疏矩陣,稀疏矩陣很適合用HashTable存儲(chǔ),在C++中,很容易想到STL map,實(shí)際上,這種方案非常浪費(fèi)內(nèi)存。STL map是紅黑樹(shù),每個(gè)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)如下:

1 2 3 4 5 6 7 8 9 struct node { ??T* data; // key +value=4+4=8 ??bool color,//ignore ??struct node *father, *left, *right; }

每個(gè)節(jié)點(diǎn)大約需要8+4*3=20個(gè)字節(jié)。為了改進(jìn)該方案,采用vector+二分查找的方案:

首先,將<c,w>對(duì)壓縮到一個(gè)unsigned int中,如,高7位表示種類(事先對(duì)種類進(jìn)行編號(hào),能表示2^7=128個(gè)種類),低25位表示term編號(hào)(最大可有33554432個(gè)term);

1 2 3 4 5 unsigned int FormatToCombinedNumber(unsigned int high, unsigned int low) { ??return ((high & 0x7f) << 24) + (low & 0xffffff); }

然后,將(<c,w>, 次數(shù))保存到vector中,并事先按照<c,w>(實(shí)際上是一個(gè)unsigned int)排序。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 vector<KeyValue> term_prb; class KeyValue { ?public: ??void Set(unsigned int t, float w) { ???term = t; ???weight = w; ??} ??unsigned int term; ??float weight; };

最后,當(dāng)查詢一個(gè)<c,w>出現(xiàn)的概率時(shí),只需拼湊<c,w>對(duì)應(yīng)的unsigned int,然后在vector中二分查找即可。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 struct TermCompare : public std::binary_function<KeyValue, KeyValue, bool> { ?public: ??bool operator() (const KeyValue &o, const unsigned int term) const { ???return o.term < term; ??} ??bool operator() (const unsigned int term, const KeyValue &o) const { ???return term < o.term; ??} }; float TermFind(unsigned int key) { ?vector<KeyValue>::iterator index = ?lower_bound(term_prb.begin(), term_prb.end(), key, TermCompare()); ?if(index == term_prb.end() || index->term > key ) { ??return default_term_prb; ?} else { ??return index->weight; ?} }

Hadoop程序首先要加載詞典dict1.txt和dict2.txt,并將之分別保存到map和vector兩種數(shù)據(jù)結(jié)構(gòu)中,需要注意的是,加載之前需要將對(duì)應(yīng)的概率(先驗(yàn)概率和調(diào)教概率)計(jì)算出來(lái),預(yù)測(cè)的Hadoop偽代碼如下:

(1) 多輪預(yù)測(cè)新doc在每個(gè)種類中的概率:

PredcitProbility()

1 2 3 4 5 Map(new_doc): ?for each class in dictionary: ??Emit(doc, class|probility);

該Hadoop作業(yè)可能運(yùn)行多次,主要取決于劃分的字典數(shù)目

(2) 選出最大概率,得到doc的類別

PredcitProbilityCombiner():

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Map(doc): ?Emit(doc, class|probility); //直接輸出(1)的結(jié)果,讓reducer選擇 Reduce(doc): ?max_prb=-MIN ?max_class = 0 ?for each value v(class|probility): ??if(max_prb < probility) { ???max_prb = probility; ???max_class = class; ??} Emit(doc, max_class);

該作業(yè)的輸入是上一個(gè)作業(yè)的所有輸出。

4. 總結(jié)

上面共提到4個(gè)Hadoop作業(yè),分別為:ClassPrior,ConditionalProbility,PredictProbility和PredictProbilityCombiner,它們的關(guān)系如下:

5. 參考資料

(1) 基于MapReduce 的并行貝葉斯分類算法的設(shè)計(jì)與實(shí)現(xiàn), 丁光.華. 周繼鵬. 周敏

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自董的博客

本文鏈接地址:?http://dongxicheng.org/data-mining/naive-bayes-in-hadoop/

作者:Dong,作者介紹:http://dongxicheng.org/about/


from:?http://dongxicheng.org/data-mining/naive-bayes-in-hadoop/

總結(jié)

以上是生活随笔為你收集整理的朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。