1. 程式人生 > >樸素貝葉斯Naïve Bayes分類演算法在Hadoop上的實現

樸素貝葉斯Naïve Bayes分類演算法在Hadoop上的實現

1. Naïve Bayes演算法介紹

Naïve Bayes是一個簡單有效的分類演算法,已經得到廣泛使用。本文討論了海量資料(TB級)下Naïve Bayes演算法的實現方法,並給出了Hadoop上的實現方案。

2. Naïve Bayes演算法介紹

樸素貝葉斯分類器基於一個簡單的假定: 在給定目標值時屬性值之間相互獨立, 即特徵對於給定類的影響獨立於其它特徵。利用該假設,文件d 屬於類c 的概率可以表示為:

3. Naïve Bayes演算法在Hadoop上實現

分兩個階段進行,首先是訓練獲取分類器,然後是預測。

(1) 訓練

訓練階段要計算兩種概率:[1] 每種類別的先驗概率 [2] 每個term(單詞)在每個類別中得條件概率。

[1] 計算類別的先驗概率

由一個Hadoop Job實現,虛擬碼如下:

該作業主要統計了每種類別文件的總數目,具體概率的計算放在了後面。假設該作業計算得到的資料彙總在了檔案dict1.txt中。

[2] 計算term的條件概率

由一個Hadoop job實現,虛擬碼如下:

其中,c表示種類,w表示word,該作業只統計了每個<c,w>對出現的總次數,具體條件概率計算放在了後面。假設該作業得到的資料彙總在檔案dict2.txt中。

(2) 預測

預測時,需要把檔案dict1.txt和dict2.txt作為字典載入到記憶體中,一般而言,dict1.txt很小,而dict2.txt很大,如種類數是100,term總數為10000,0000,則dict2需要儲存的記錄總數為100*10000 0000=10^10。為了解決該問題,提出以下解決方案:

(1)將種類分片儲存到多個檔案中。比如,共有100個種類,每10個種類為一組存放到10個字典中(即:某個字典只儲存與某10個種類相關的<c,w>對,這個可以通過將同一種類的<c,w>將給相同reduce task處理做到),分批計算。

(2)dict2.txt中實際上存放的是一個稀疏矩陣,稀疏矩陣很適合用HashTable儲存,在C++中,很容易想到STL map,實際上,這種方案非常浪費記憶體。STL map是紅黑樹,每個節點的資料結構如下:

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; }

每個節點大約需要8+4*3=20個位元組。為了改進該方案,採用vector+二分查詢的方案:

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

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

然後,將(<c,w>, 次數)儲存到vector中,並事先按照<c,w>(實際上是一個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

相關推薦

樸素Naïve Bayes分類演算法Hadoop實現

1. Naïve Bayes演算法介紹 Naïve Bayes是一個簡單有效的分類演算法,已經得到廣泛使用。本文討論了海量資料(TB級)下Naïve Bayes演算法的實現方法,並給出了Hadoop上的實現方案。 2. Naïve Bayes演算法介紹

演算法樸素法之分類演算法

樸素貝葉斯法之分類演算法 說明         本文只是對於樸素貝葉斯法的其中的一個分類演算法的學習。參考來源《統計學習方法》。 一、 輸入 訓練資料 T={(x1,y1),(x2,y2),...(

(三)樸素運用——文字分類

1、貝葉斯理論 當我們有樣本(包含特徵和類別)的時候,我們非常容易通過 p(x)p(y|x)=p(y)p(x|y) p ( x

機器學習之樸素(Naive Bayes)

貝葉斯概率以18世紀的一位神學家托馬斯·貝葉斯(Thomas Bayes)的名字命名。 一、為什麼叫樸素貝葉斯? 樸素貝葉斯是經典機器學習演算法之一,是基於概率論的分類演算法,其原理簡單,易於實現,多使用於文字分類,如垃圾郵件過濾、新聞分類等。 樸素貝葉斯中的樸素是來源

sklearn——樸素分文字分類2

使用sklearn中的tf-idf向量選擇器對向量進行選擇,是一個特徵選擇的過程 程式碼: # 從sklearn.feature_extraction.text裡分別匯入TfidfVectorizer。 from sklearn.feature_extraction.tex

樸素Naive Bayes-機器學習ML

參考: 1.《統計學習方法》李航 2.先驗概率與後驗概率的區別:http://blog.csdn.net/ouyang_linux007/article/details/7566339 3.樸素貝葉斯方法(Naive Bayes)原理和實現:http://blog.

2.樸素Naive Bayes

在屬性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。但這點有待驗證,因為具體的問題不同,演算法得出的結果不同,同一個演算法對於同一個問題,只要模式發生變化,也存在不同的識別效能。這點在很多國外論文中已經得到公認,在機器學習一書中也提到過演算法對於屬性的識別情況決定於很多因素,例如訓

基於樸素的新聞分類

貝葉斯理論 在我們有一大堆樣本(包含特徵和類別)的時候,我們非常容易通過統計得到 p(特徵|類別) . 大家又都很熟悉下述公式: #coding: utf-8 import os import time import random import

基於的樸素的文字分類(附完整程式碼(spark/java)

本文主要包括以下內容: 1)模型訓練資料生成(demo) 2 ) 模型訓練(spark+java),資料儲存在hdfs上 3)預測資料生成(demo) 4)使用生成的模型進行文字分類。 一、訓練資料生成 spark mllib模型訓練的輸入資料格

sklearn+python:樸素及文字分類

樸素貝葉斯 貝葉斯定理用來計算條件概率,即: 然後進行一種樸素(naive)的假設-每對特徵之間都相互獨立: 在給定的輸入中 P(x_1, \dots, x_n) 是一個常量,我們使用下面的分類規則: 可以使用最大後驗概率(Maximum A

樸素-新聞分類

樸素貝葉斯分類器的構造基礎是基於貝葉斯定理與特徵條件獨立假設的分類方法,與基於線性假設的模型(線性分類器和支援向量機分類器)不同。最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBM

(資料探勘-入門-8)基於樸素的文字分類

主要內容: 1、動機 2、基於樸素貝葉斯的文字分類器 3、python實現 一、動機 之前介紹的樸素貝葉斯分類器所使用的都是結構化的資料集,即每行代表一個樣本,每列代表一個特徵屬性。 但在實際中,尤其是網頁中,爬蟲所採集到的資料都是非結構化的,如新聞、微博、帖子等,如果要對對這一類資料進行分類,應該怎麼辦

樸素】實戰樸素_文字分類

【文字分類】 文字分類是經典的NLP問題,就是把一個文字自動分到若干個類別之一當中。類別可以是政治、經濟、女性、財經等,既可以用字串形式表示,也可以內部用整數形式來表示。對於我的文字過濾問題,則類別只有兩個:不應該過濾 和 應該過濾。接下來是文字表示問題,即用什麼量來代表一

樸素的概率理論及其python程式碼實現文字分類的例項

一:樸素貝葉斯是一種基於概率分佈進行分類的方法,概率論是樸素貝葉斯的基礎,之所以被稱為樸素,而不是貝葉斯就是因為它在貝葉斯的基礎上,增添了兩個條件,一個是各特徵之間相互獨立,第二是每個特徵同等重要。樸素貝葉斯在資料很小的情況下仍然有效,可以處理多分類問題,但是對輸入資料的準

機器學習基礎——帶你實戰樸素模型文字分類

本文始發於個人公眾號:TechFlow 上一篇文章當中我們介紹了樸素貝葉斯模型的基本原理。 樸素貝葉斯的核心本質是假設樣本當中的變數服從某個分佈,從而利用條件概率計算出樣本屬於某個類別的概率。一般來說一個樣本往往會含有許多特徵,這些特徵之間很有可能是有相關性的。為了簡化模型,樸素貝葉斯模型假設這些變數是獨

資料探勘入門系列教程(七)之樸素進行文字分類

資料探勘入門系列教程(七)之樸素貝葉斯進行文字分類 貝葉斯分類演算法是一類分類演算法的總和,均以貝葉斯定理為基礎,故稱之為貝葉斯分類。而樸素貝葉斯分類演算法就是其中最簡單的分類演算法。 樸素貝葉斯分類演算法 樸素貝葉斯分類演算法很簡單很簡單,就一個公式如下所示: P(B|A) = \frac{P(A|B) P

樸素算法資料整理和PHP 實現版本

樸素貝葉斯樸素貝葉斯算法簡潔http://blog.csdn.net/xlinsist/article/details/51236454 引言先前曾經看了一篇文章,一個老外程序員寫了一些很牛的Shell腳本,包括晚下班自動給老婆發短信啊,自動沖Coffee啊,自動掃描一個DBA發來的郵件啊, 等等。於是我也想

李航統計學習方法之樸素法(含python及tensorflow實現

樸素貝葉斯法 樸素貝葉斯法數學表示式 後驗概率最大化的含義        樸素貝葉斯是一個生成模型。有一個強假設:條件獨立性。我們先看下樸素貝葉斯法的思想,然後看下條件獨立性具體數學表示式是什麼樣的。

從爬取豆瓣影評到基於樸素的電影評論情感分析()

一、爬取豆瓣影評     基本思路:先獲取每個電影的評論區連結,然後依次進入其評論區爬取評論。選取10部電影,每部200條評論。     用到的包為:BeautifulSoup,urllib     這裡選取的連結為:豆瓣電影,開啟後內容如下: