基于概率論的分類方法:樸素貝葉斯

姓名:唐來賓? 學(xué)號:17101223417

轉(zhuǎn)載http://mp.weixin.qq.com/s/6gCVebMxHrneuLEeT67BCA

【嵌牛導(dǎo)讀】貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎(chǔ),故統(tǒng)稱為貝葉斯分類巨坊。本章首先介紹貝葉斯分類算法的基礎(chǔ)——貝葉斯定理匾效。最后溯革,我們通過實例來討論貝葉斯分類的中最簡單的一種: 樸素貝葉斯分類坎藐。

【嵌牛鼻子】貝葉斯理論? ?條件概率

【嵌牛提問】如何使用貝葉斯理論蟆淀?

【嵌牛正文】基于概率論的分類方法:樸素貝葉斯

1. 概述

貝葉斯分類是一類分類算法的總稱鹦聪,這類算法均以貝葉斯定理為基礎(chǔ),故統(tǒng)稱為貝葉斯分類充坑。本章首先介紹貝葉斯分類算法的基礎(chǔ)——貝葉斯定理减江。最后染突,我們通過實例來討論貝葉斯分類的中最簡單的一種: 樸素貝葉斯分類。

2. 貝葉斯理論 & 條件概率

2.1 貝葉斯理論

我們現(xiàn)在有一個數(shù)據(jù)集辈灼,它由兩類數(shù)據(jù)組成份企,數(shù)據(jù)分布如下圖所示:

我們現(xiàn)在用 p1(x,y) 表示數(shù)據(jù)點 (x,y) 屬于類別 1(圖中用圓點表示的類別)的概率,用 p2(x,y) 表示數(shù)據(jù)點 (x,y) 屬于類別 2(圖中三角形表示的類別)的概率巡莹,那么對于一個新數(shù)據(jù)點 (x,y)司志,可以用下面的規(guī)則來判斷它的類別:

如果p1(x,y)>p2(x,y),那么類別為1

如果p2(x,y)>p1(x,y)降宅,那么類別為2

也就是說骂远,我們會選擇高概率對應(yīng)的類別。這就是貝葉斯決策理論的核心思想腰根,即選擇具有最高概率的決策激才。

2.1.2 條件概率

如果你對 p(x,y|c1) 符號很熟悉,那么可以跳過本小節(jié)额嘿。

有一個裝了 7 塊石頭的罐子瘸恼,其中 3 塊是白色的,4 塊是黑色的册养。如果從罐子中隨機取出一塊石頭东帅,那么是白色石頭的可能性是多少?由于取石頭有 7 種可能球拦,其中 3 種為白色靠闭,所以取出白色石頭的概率為 3/7 。那么取到黑色石頭的概率又是多少呢坎炼?很顯然阎毅,是 4/7 。我們使用 P(white) 來表示取到白色石頭的概率点弯,其概率值可以通過白色石頭數(shù)目除以總的石頭數(shù)目來得到。

如果這 7 塊石頭如下圖所示矿咕,放在兩個桶中抢肛,那么上述概率應(yīng)該如何計算?

計算 P(white) 或者 P(black) 碳柱,如果事先我們知道石頭所在桶的信息是會改變結(jié)果的捡絮。這就是所謂的條件概率(conditional probablity)。假定計算的是從 B 桶取到白色石頭的概率莲镣,這個概率可以記作 P(white|bucketB) 福稳,我們稱之為“在已知石頭出自 B 桶的條件下,取出白色石頭的概率”瑞侮。很容易得到的圆,P(white|bucketA) 值為 2/4 鼓拧,P(white|bucketB) 的值為 1/3 。

條件概率的計算公式如下:

P(white|bucketB) = P(white and bucketB) / P(bucketB)

首先越妈,我們用 B 桶中白色石頭的個數(shù)除以兩個桶中總的石頭數(shù)季俩,得到 P(white and bucketB) = 1/7 .其次,由于 B 桶中有 3 塊石頭梅掠,而總石頭數(shù)為 7 酌住,于是 P(bucketB) 就等于 3/7 。于是又 P(white|bucketB) = P(white and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 阎抒。

另外一種有效計算條件概率的方法稱為貝葉斯準(zhǔn)則酪我。貝葉斯準(zhǔn)則告訴我們?nèi)绾谓粨Q條件概率中的條件與結(jié)果,即如果已知 P(x|c)且叁,要求 P(c|x)都哭,那么可以使用下面的計算方法:

使用條件概率來分類

上面我們提到貝葉斯決策理論要求計算兩個概率 p1(x, y) 和 p2(x, y):

如果p1(x,y)>p2(x,y),那么屬于類別1;

如果p2(x,y)>p1(X,y),那么屬于類別2.

這并不是貝葉斯決策理論的所有內(nèi)容。使用 p1() 和 p2() 只是為了盡可能簡化描述谴古,而真正需要計算和比較的是 p(c1|x, y) 和 p(c2|x, y) .這些符號所代表的具體意義是: 給定某個由 x质涛、y 表示的數(shù)據(jù)點,那么該數(shù)據(jù)點來自類別 c1 的概率是多少掰担?數(shù)據(jù)點來自類別 c2 的概率又是多少汇陆?注意這些概率與概率 p(x, y|c1) 并不一樣,不過可以使用貝葉斯準(zhǔn)則來交換概率中條件與結(jié)果带饱。具體地毡代,應(yīng)用貝葉斯準(zhǔn)則得到:

使用上面這些定義,可以定義貝葉斯分類準(zhǔn)則為:

如果P(c1|x,y)>P(c2|x,y),那么屬于類別c1;

如果P(c2|x,y)>P(c1|x,y),那么屬于類別c2.

在文檔分類中勺疼,整個文檔(如一封電子郵件)是實例教寂,而電子郵件中的某些元素則構(gòu)成特征。我們可以觀察文檔中出現(xiàn)的詞执庐,并把每個詞作為一個特征酪耕,而每個詞的出現(xiàn)或者不出現(xiàn)作為該特征的值,這樣得到的特征數(shù)目就會跟詞匯表中的詞的數(shù)目一樣多轨淌。

我們假設(shè)特征之間 相互獨立 迂烁。所謂 獨立(independence) 指的是統(tǒng)計意義上的獨立,即一個特征或者單詞出現(xiàn)的可能性與它和其他單詞相鄰沒有關(guān)系递鹉,比如說盟步,“我們”中的“我”和“們”出現(xiàn)的概率與這兩個字相鄰沒有任何關(guān)系。這個假設(shè)正是樸素貝葉斯分類器中 樸素(naive) 一詞的含義躏结。樸素貝葉斯分類器中的另一個假設(shè)是却盘,每個特征同等重要化借。

Note: 樸素貝葉斯分類器通常有兩種實現(xiàn)方式: 一種基于伯努利模型實現(xiàn)校套,一種基于多項式模型實現(xiàn)。這里采用前一種實現(xiàn)方式。該實現(xiàn)方式中并不考慮詞在文檔中出現(xiàn)的次數(shù)鳖悠,只考慮出不出現(xiàn)琴许,因此在這個意義上相當(dāng)于假設(shè)詞是等權(quán)重的凫佛。

2.2 樸素貝葉斯場景

機器學(xué)習(xí)的一個重要應(yīng)用就是文檔的自動分類井辆。

在文檔分類中,整個文檔(如一封電子郵件)是實例描孟,而電子郵件中的某些元素則構(gòu)成特征驶睦。我們可以觀察文檔中出現(xiàn)的詞,并把每個詞作為一個特征匿醒,而每個詞的出現(xiàn)或者不出現(xiàn)作為該特征的值场航,這樣得到的特征數(shù)目就會跟詞匯表中的詞的數(shù)目一樣多。

樸素貝葉斯是上面介紹的貝葉斯分類器的一個擴展廉羔,是用于文檔分類的常用算法溉痢。下面我們會進行一些樸素貝葉斯分類的實踐項目。

2.3 樸素貝葉斯 原理

樸素貝葉斯 工作原理

提取所有文檔中的詞條并進行去重

獲取文檔的所有類別

計算每個類別中的文檔數(shù)目

對每篇訓(xùn)練文檔:

對每個類別:

如果詞條出現(xiàn)在文檔中-->增加該詞條的計數(shù)值(for循環(huán)或者矩陣相加)

增加所有詞條的計數(shù)值(此類別下詞條總數(shù))

對每個類別:

對每個詞條:

將該詞條的數(shù)目除以總詞條數(shù)目得到的條件概率(P(詞條|類別))

返回該文檔屬于每個類別的條件概率(P(類別|文檔的所有詞條))

2.4 樸素貝葉斯開發(fā)流程

收集數(shù)據(jù): 可以使用任何方法憋他。

準(zhǔn)備數(shù)據(jù): 需要數(shù)值型或者布爾型數(shù)據(jù)孩饼。

分析數(shù)據(jù): 有大量特征時,繪制特征作用不大竹挡,此時使用直方圖效果更好镀娶。

訓(xùn)練算法: 計算不同的獨立特征的條件概率。

測試算法: 計算錯誤率揪罕。

使用算法: 一個常見的樸素貝葉斯應(yīng)用是文檔分類梯码。可以在任意的分類場景中使用樸素貝葉斯分類器好啰,不一定非要是文本轩娶。

2.5 樸素貝葉斯算法特點

優(yōu)點: 在數(shù)據(jù)較少的情況下仍然有效,可以處理多類別問題框往。

缺點: 對于輸入數(shù)據(jù)的準(zhǔn)備方式較為敏感鳄抒。

適用數(shù)據(jù)類型: 標(biāo)稱型數(shù)據(jù)。

2.6 樸素貝葉斯 項目案例

2.6.1 項目案例1

屏蔽社區(qū)留言板的侮辱性言論

2.6.1.1 項目概述

構(gòu)建一個快速過濾器來屏蔽在線社區(qū)留言板上的侮辱性言論椰弊。如果某條留言使用了負面或者侮辱性的語言嘁酿,那么就將該留言標(biāo)識為內(nèi)容不當(dāng)。對此問題建立兩個類別: 侮辱類和非侮辱類男应,使用 1 和 0 分別表示。

2.6.1.2 開發(fā)流程

收集數(shù)據(jù): 可以使用任何方法

準(zhǔn)備數(shù)據(jù): 從文本中構(gòu)建詞向量

分析數(shù)據(jù): 檢查詞條確保解析的正確性

訓(xùn)練算法: 從詞向量計算概率

測試算法: 根據(jù)現(xiàn)實情況修改分類器

使用算法: 對社區(qū)留言板言論進行分類

收集數(shù)據(jù): 可以使用任何方法

2.6.1.3 構(gòu)造詞表

defloadDataSet():

"""

創(chuàng)建數(shù)據(jù)集

:return: 單詞列表postingList, 所屬類別classVec

"""

postingList=[['my','dog','has','flea','problems','help','please'],#[0,0,1,1,1......]

['maybe','not','take','him','to','dog','park','stupid'],

['my','dalmation','is','so','cute','I','love','him'],

['stop','posting','stupid','worthless','garbage'],

['mr','licks','ate','my','steak','how','to','stop','him'],

['quit','buying','worthless','dog','food','stupid']]

classVec=[0,1,0,1,0,1]# 1 is abusive, 0 not

returnpostingList,classVec

2.6.1.4 準(zhǔn)備數(shù)據(jù): 從文本中構(gòu)建詞向量

defcreateVocabList(dataSet):

"""

獲取所有單詞的集合

:param dataSet: 數(shù)據(jù)集

:return: 所有單詞的集合(即不含重復(fù)元素的單詞列表)

"""

vocabSet=set([])# create empty set

fordocumentindataSet:

# 操作符 | 用于求兩個集合的并集

vocabSet=vocabSet|set(document)# union of the two sets

returnlist(vocabSet)

defsetOfWords2Vec(vocabList,inputSet):

"""

遍歷查看該單詞是否出現(xiàn)娱仔,出現(xiàn)該單詞則將該單詞置1

:param vocabList: 所有單詞集合列表

:param inputSet: 輸入數(shù)據(jù)集

:return: 匹配列表[0,1,0,1...]沐飘,其中 1與0 表示詞匯表中的單詞是否出現(xiàn)在輸入的數(shù)據(jù)集中

"""

# 創(chuàng)建一個和詞匯表等長的向量,并將其元素都設(shè)置為0

returnVec=[0]*len(vocabList)# [0,0......]

# 遍歷文檔中的所有單詞,如果出現(xiàn)了詞匯表中的單詞耐朴,則將輸出的文檔向量中的對應(yīng)值設(shè)為1

forwordininputSet:

ifwordinvocabList:

returnVec[vocabList.index(word)]=1

else:

print"the word: %s is not in my Vocabulary!"%word

returnreturnVec

2.6.1.5 分析數(shù)據(jù): 檢查詞條確保解析的正確性

檢查函數(shù)執(zhí)行情況借卧,檢查詞表,不出現(xiàn)重復(fù)單詞筛峭,需要的話铐刘,可以對其進行排序。

>>>listOPosts,listClasses=bayes.loadDataSet()

>>>myVocabList=bayes.createVocabList(listOPosts)

>>>myVocabList

['cute','love','help','garbage','quit','I','problems','is','park',

'stop','flea','dalmation','licks','food','not','him','buying','posting','has','worthless','ate','to','maybe','please','dog','how',

'stupid','so','take','mr','steak','my']

檢查函數(shù)有效性影晓。例如:myVocabList 中索引為 2 的元素是什么單詞镰吵?應(yīng)該是是 help 。該單詞在第一篇文檔中出現(xiàn)了挂签,現(xiàn)在檢查一下看看它是否出現(xiàn)在第四篇文檔中疤祭。

>>>bayes.setOfWords2Vec(myVocabList,listOPosts[0])

[0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1]

>>>bayes.setOfWords2Vec(myVocabList,listOPosts[3])

[0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0]

2.6.1.6 訓(xùn)練算法: 從詞向量計算概率

現(xiàn)在已經(jīng)知道了一個詞是否出現(xiàn)在一篇文檔中,也知道該文檔所屬的類別饵婆。接下來我們重寫貝葉斯準(zhǔn)則勺馆,將之前的 x, y 替換為 w. 粗體的 w 表示這是一個向量,即它由多個值組成侨核。在這個例子中草穆,數(shù)值個數(shù)與詞匯表中的詞個數(shù)相同。

我們使用上述公式搓译,對每個類計算該值悲柱,然后比較這兩個概率值的大小。

首先可以通過類別 i (侮辱性留言或者非侮辱性留言)中的文檔數(shù)除以總的文檔數(shù)來計算概率 p(ci) 侥衬。接下來計算 p(w | ci) 诗祸,這里就要用到樸素貝葉斯假設(shè)。如果將 w 展開為一個個獨立特征轴总,那么就可以將上述概率寫作 p(w0, w1, w2…wn | ci) 直颅。這里假設(shè)所有詞都互相獨立,該假設(shè)也稱作條件獨立性假設(shè)(例如 A 和 B 兩個人拋骰子怀樟,概率是互不影響的功偿,也就是相互獨立的,A 拋 2點的同時 B 拋 3 點的概率就是 1/6 * 1/6)往堡,它意味著可以使用 p(w0 | ci)p(w1 | ci)p(w2 | ci)…p(wn | ci) 來計算上述概率械荷,這樣就極大地簡化了計算的過程。

2.6.1.7 樸素貝葉斯分類器訓(xùn)練函數(shù)

def_trainNB0(trainMatrix,trainCategory):

"""

訓(xùn)練數(shù)據(jù)原版

:param trainMatrix: 文件單詞矩陣 [[1,0,1,1,1....],[],[]...]

:param trainCategory: 文件對應(yīng)的類別[0,1,1,0....]虑灰,列表長度等于單詞矩陣數(shù)吨瞎,其中的1代表對應(yīng)的文件是侮辱性文件,0代表不是侮辱性矩陣

:return:

"""

# 文件數(shù)

numTrainDocs=len(trainMatrix)

# 單詞數(shù)

numWords=len(trainMatrix[0])

# 侮辱性文件的出現(xiàn)概率穆咐,即trainCategory中所有的1的個數(shù)颤诀,

# 代表的就是多少個侮辱性文件字旭,與文件的總數(shù)相除就得到了侮辱性文件的出現(xiàn)概率

pAbusive=sum(trainCategory)/float(numTrainDocs)

# 構(gòu)造單詞出現(xiàn)次數(shù)列表

p0Num=zeros(numWords)# [0,0,0,.....]

p1Num=zeros(numWords)# [0,0,0,.....]

# 整個數(shù)據(jù)集單詞出現(xiàn)總數(shù)

p0Denom=0.0

p1Denom=0.0

foriinrange(numTrainDocs):

# 是否是侮辱性文件

iftrainCategory[i]==1:

# 如果是侮辱性文件,對侮辱性文件的向量進行加和

p1Num+=trainMatrix[i]#[0,1,1,....] + [0,1,1,....]->[0,2,2,...]

# 對向量中的所有元素進行求和崖叫,也就是計算所有侮辱性文件中出現(xiàn)的單詞總數(shù)

p1Denom+=sum(trainMatrix[i])

else:

p0Num+=trainMatrix[i]

p0Denom+=sum(trainMatrix[i])

# 類別1遗淳,即侮辱性文檔的[P(F1|C1),P(F2|C1),P(F3|C1),P(F4|C1),P(F5|C1)....]列表

# 即 在1類別下,每個單詞出現(xiàn)的概率

p1Vect=p1Num/p1Denom# [1,2,3,5]/90->[1/90,...]

# 類別0心傀,即正常文檔的[P(F1|C0),P(F2|C0),P(F3|C0),P(F4|C0),P(F5|C0)....]列表

# 即 在0類別下屈暗,每個單詞出現(xiàn)的概率

p0Vect=p0Num/p0Denom

returnp0Vect,p1Vect,pAbusive

2.6.1.8 測試算法: 根據(jù)現(xiàn)實情況修改分類器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脂男,隨后出現(xiàn)的幾起案子养叛,更是在濱河造成了極大的恐慌,老刑警劉巖疆液,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堕油,死亡現(xiàn)場離奇詭異,居然都是意外死亡卜录,警方通過查閱死者的電腦和手機眶明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門丑瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜀肘,“玉大人,你說我怎么就攤上這事西乖』竦瘢” “怎么了收捣?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵罢艾,是天一觀的道長。 經(jīng)常有香客問我球碉,道長睁冬,這世上最難降的妖魔是什么看疙? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任施禾,我火速辦了婚禮弥搞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攀例。我一直安慰自己粤铭,他們只是感情好梆惯,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布垛吗。 她就那樣靜靜地躺著抱既,像睡著了一般防泵。 火紅的嫁衣襯著肌膚如雪捷泞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天失受,我揣著相機與錄音,去河邊找鬼痪署。 笑死兄旬,一個胖子當(dāng)著我的面吹牛领铐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓢姻,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼幻碱,長吁一口氣:“原來是場噩夢啊……” “哼改艇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摔桦,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燕鸽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體御滩,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年沟娱,在試婚紗的時候發(fā)現(xiàn)自己被綠了济似。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡唉铜,死狀恐怖打毛,靈堂內(nèi)的尸體忽然破棺而出俩功,到底是詐尸還是另有隱情碰声,我是刑警寧澤胰挑,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布瞻颂,位于F島的核電站,受9級特大地震影響茬末,放射性物質(zhì)發(fā)生泄漏丽惭。R本人自食惡果不足惜辈双,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一湃望、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳浦,春花似錦檩帐、人聲如沸湃密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铺厨,卻和暖如春解滓,著一層夾襖步出監(jiān)牢的瞬間洼裤,已是汗流浹背溪王。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工腮鞍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莹菱。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓移国,卻偏偏與公主長得像,于是被迫代替她去往敵國和親道伟。 傳聞我的和親對象是個殘疾皇子迹缀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容