朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战
基于樸素貝葉斯的文本分類方法
一、樸素貝葉斯原理的介紹
二、樸素貝葉斯分類器的代碼實(shí)現(xiàn)
分類器有時(shí)會(huì)產(chǎn)生錯(cuò)誤結(jié)果,這時(shí)可以要求分類器給出一個(gè)最優(yōu)的類別猜測(cè)結(jié)果,同時(shí)會(huì)給出這個(gè)猜測(cè)的概率估計(jì)值。樸素貝葉斯分類是使用概率論進(jìn)行分類的方法。所謂“樸素”,是因?yàn)檎麄€(gè)形式化過(guò)程只做最原始、最簡(jiǎn)單的假設(shè)。
一、樸素貝葉斯原理的介紹
優(yōu)點(diǎn):在數(shù)據(jù)較少的情況下仍然有效,可以處理多類別問(wèn)題。
缺點(diǎn):對(duì)于輸入數(shù)據(jù)的準(zhǔn)備方式較為敏感。
適用數(shù)據(jù)類型:標(biāo)稱型數(shù)據(jù)。
1.貝葉斯決策理論
在學(xué)習(xí)樸素貝葉斯分類之前,我們先回顧一下貝葉斯決策理論和條件概率。貝葉斯決策理論的核心思想是選擇最高概率對(duì)應(yīng)的類別,也就是選擇具有最高概率的決策。貝葉斯準(zhǔn)則是計(jì)算條件概率的有效方法,可以告訴我們?nèi)绾谓粨Q條件概率中的條件與結(jié)果,即如果已知P(x|C),要求P(C|x),那么就可以使用下面的計(jì)算方法:
2.使用條件概率分類
假設(shè)我們有一個(gè)二維數(shù)據(jù)集,由兩類數(shù)據(jù)組成,現(xiàn)在我們結(jié)合貝葉斯決策理論使用條件概率來(lái)給這些數(shù)據(jù)點(diǎn)分類。即給定數(shù)據(jù)點(diǎn)(x,y),判斷是屬于類別1還是類別2的方法是,分別計(jì)算該數(shù)據(jù)點(diǎn)來(lái)自類別1和來(lái)自類別2的概率。所以真正需要比較的是P(C1|x,y)和P(C2|x,y)。若已知從給定類別中取出該數(shù)據(jù)的概率,即P(x,y|Ci) ,應(yīng)用貝葉斯準(zhǔn)則可以得到:
當(dāng)
,那么屬于類別1,當(dāng)
,則屬于類別2。以上是貝葉斯準(zhǔn)則的簡(jiǎn)要理論,我們?cè)趯?duì)文檔進(jìn)行分的類常用算法樸素貝葉斯分類器中“樸素”一詞基于兩個(gè)假設(shè):
a.特征之間相互獨(dú)立,在上述二維數(shù)據(jù)中的體現(xiàn)就是x與y相互獨(dú)立。
b.每個(gè)特征同等重要。即x與y有同樣的重要性。
在應(yīng)用于文檔分類時(shí),盡管很多情況下特征難以完全符合上述假設(shè),但樸素貝葉斯的實(shí)際效果卻很好。
下面我們將其付諸實(shí)踐,使用Python構(gòu)建基于這些理論的分類器。
二、樸素貝葉斯分類器的實(shí)現(xiàn)
在文檔分類中,整個(gè)文檔(如一封電子郵件)是實(shí)例,文檔中的某些元素構(gòu)成特征。我們把每個(gè)詞的出現(xiàn)或不出現(xiàn)作為一個(gè)特征。整個(gè)文本分類的過(guò)程分為三步:
a.拆分文本,獲取特征。在英文文檔分類中,特征來(lái)自文本的詞條(token),一個(gè)詞條可以是單詞,也可以是URL、IP地址等任意其他字符串。
b.將文本數(shù)字化,構(gòu)建詞向量。每一個(gè)文本片段表示為一個(gè)詞條向量,其中值為1表示詞條出現(xiàn)在文檔中,0表示詞條未出現(xiàn)。
c.計(jì)算條件概率并分類。應(yīng)用樸素貝葉斯分類原理,通過(guò)詞向量計(jì)算條件概率。這里w是一個(gè)向量,由多個(gè)數(shù)值組成,它代表著由多個(gè)單詞組成的一段文本或者一組單詞。
計(jì)算上面的概率值,然后比較大小。
下面是在線社區(qū)留言板的案例,我們要留言分為侮辱類和非侮辱類。如果留言中使用了負(fù)面或者侮辱性詞語(yǔ),那么該留言就識(shí)別為侮辱類留言,記為1,否則0。
1.準(zhǔn)備數(shù)據(jù),從文本中構(gòu)建詞向量
先將所有文檔中出現(xiàn)過(guò)的詞構(gòu)建詞匯表,然后把每篇文檔中的詞轉(zhuǎn)換成詞匯表上的向量。由于這里我們用的是將一個(gè)詞出現(xiàn)與否作為特征的詞集模型(對(duì)應(yīng)的還有詞袋模型),不計(jì)數(shù)每個(gè)詞出現(xiàn)的次數(shù),所以詞向量中只需將出現(xiàn)在詞匯表的詞記為1即可。具體實(shí)現(xiàn)如下:
#準(zhǔn)備數(shù)據(jù):從文本中構(gòu)建詞向量測(cè)試下:
postingList得到詞表:
print得到第一個(gè)文檔的詞向量:
2.從詞向量計(jì)算概率
上面我們已經(jīng)探討了,要得到類別概率值,首先要計(jì)算P(w|Ci)和P(Ci)。P(Ci)容易獲得,用侮辱類文檔數(shù)除以總文檔數(shù)即可。接下來(lái)計(jì)算P(w|Ci)。樸素貝葉斯中假設(shè)特征相互獨(dú)立,這里體現(xiàn)為每個(gè)詞條相互獨(dú)立。將P(w|Ci)展開成P(w0,w1,w2,...,wn|Ci),根據(jù)假設(shè)P(w0,w1,w2,...,wn|Ci)=P(w0|Ci)P(w1|Ci)P(w2|Ci)...P(wn|Ci)成立,我們可以以此計(jì)算上述概率。
偽代碼如下:
計(jì)算每個(gè)類別文檔數(shù)目
對(duì)每篇訓(xùn)練文檔:
對(duì)每個(gè)類別:
如果詞條出現(xiàn)在文檔中,則增加該詞的計(jì)數(shù)值
增加該類文檔所有詞的計(jì)數(shù)值
對(duì)每個(gè)類別:
將該詞的計(jì)數(shù)值除以該類文檔總詞數(shù)得到條件概率
返回每個(gè)類別的條件概率
實(shí)戰(zhàn)代碼如下:
#trainMatrix已轉(zhuǎn)換為向量的文檔矩陣,trainCategory每篇文檔類別標(biāo)簽所構(gòu)成的向量準(zhǔn)備好概率向量和侮辱類文檔概率后,按照貝葉斯準(zhǔn)則公式將上述概率進(jìn)行計(jì)算,得到樸素貝葉斯分類函數(shù):
#樸素貝葉斯分類函數(shù)在上述代碼中,我們用Numpy數(shù)組來(lái)計(jì)算兩個(gè)向量即vec2Classify和p1Vect、vec2Classify和p0Vect的相乘的結(jié)果,也就是包含待分類文檔所有詞條的條件概率向量p0VectClassify和p1VectClassify,這里的相乘是指對(duì)應(yīng)元素的相乘,具體就是先將兩個(gè)向量的第一個(gè)元素相乘,再將第二個(gè)元素相乘,以此類推。接下來(lái)要通過(guò)將條件概率向量中的各元素相乘P(w0|Ci)P(w1|Ci)P(w2|Ci)...P(wn|Ci)得到概率值P(w|Ci),如果其中一個(gè)概率值為0,那么最后的乘積也會(huì)是0。為避免這種影響,我們將p0VectClassify和p1VectClassify中的0元素去掉,得到新的列表p0Cond和p1Cond。若p0VectClassify或p1VectClassify全為0,對(duì)應(yīng)的新列表為空,在應(yīng)用reduce()函數(shù)時(shí),會(huì)得到結(jié)果為1,顯然不正確,所以這里我們用了if語(yǔ)句,將空列表的條件概率值pCi置為0。最后比較p0和p1的大小,也就是P(C0|w)和P(C1|w)的大小,得到分類結(jié)果。
——分割線——————————————————————————
感謝評(píng)論區(qū)提醒,用平滑處理方式比直接將條件概率計(jì)算時(shí)的0元素去掉更有效。這里我采用的方式是將所有詞的出現(xiàn)數(shù)初始化為1,相當(dāng)于所有詞頻加1,并將分母初始化為2。相應(yīng)地在trainNB()函數(shù)中要修改
p0Num=zeros(numWords) #初始化概率p1Num=zeros(numWords) p0Denom=0p1Denom=0為:
p0Num=ones(numWords) #初始化概率p1Num=ones(numWords) p0Denom=2p1Denom=2另外為避免很多非常小的因子相乘會(huì)造成下溢出,即用Python計(jì)算很多非常小的數(shù)時(shí)會(huì)四舍五入得到0的問(wèn)題,采用對(duì)上述乘積取自然對(duì)數(shù)的方法。相應(yīng)地在trainNB()函數(shù)中要修改
#對(duì)p1Num的每個(gè)元素做除法,即侮辱性文檔中出現(xiàn)每個(gè)詞語(yǔ)的概率p1Vect=p1Num/p1Denom #對(duì)p0Num的每個(gè)元素做除法,即正常文檔中出現(xiàn)每個(gè)詞語(yǔ)的概率p0Vect=p0Num/p0Denom為:
#對(duì)p1Num的每個(gè)元素做除法,即侮辱性文檔中出現(xiàn)每個(gè)詞語(yǔ)的概率p1Vect=log(p1Num/p1Denom) #change to log()#對(duì)p0Num的每個(gè)元素做除法,即正常文檔中出現(xiàn)每個(gè)詞語(yǔ)的概率p0Vect=log(p0Num/p0Denom) #change to log()此處,分類函數(shù)中不需要再進(jìn)行去掉0元素等操作,取了自然對(duì)數(shù)后計(jì)算條件概率也更加容易,重新改寫分類函數(shù)為:
def classifyNB(vec2Classify,trainMatrix,trainCategory):p0Vect,p1Vect,pAb=trainNB(trainMatrix,trainCategory)p1=sum(vec2Classify*p1Vect)+log(pAb)p0=sum(vec2Classify*p0Vect)+log(1-pAb)if p1>p0:return 1else:return 03.測(cè)試運(yùn)行結(jié)果
代入上面的數(shù)據(jù)
#加載數(shù)據(jù)看看結(jié)果:
測(cè)試結(jié)果沒(méi)有問(wèn)題,和預(yù)期一致。上述代碼簡(jiǎn)單實(shí)踐了基于樸素貝葉斯理論的文檔分類,下面我們對(duì)代碼做些簡(jiǎn)單改進(jìn),使分類效果更好。
4.簡(jiǎn)單應(yīng)用詞袋模型
在上面的模型中,我們是將一個(gè)詞出現(xiàn)與否作為特征,采用的是詞集模型。如果一個(gè)詞在文檔中出現(xiàn)不止一次,可能包含比一個(gè)詞出現(xiàn)與否更多的信息,這種方法稱為詞袋模型。詞袋模型計(jì)數(shù)每個(gè)詞出現(xiàn)的次數(shù),而詞集模型中詞向量中只需將出現(xiàn)在詞匯表的詞記為1即可。因此,采用詞袋模型,我們只需將setofWords2Vec()函數(shù)稍作改動(dòng)即可。下面是基于詞袋模型的樸素貝葉斯分類代碼:
def我們?cè)俅芜\(yùn)行前面的測(cè)試用例,會(huì)得到與詞集模型相同的結(jié)果:
這里,我們只是通過(guò)簡(jiǎn)單應(yīng)用來(lái)介紹詞袋模型。在更復(fù)雜的文檔分類工作中,詞袋模型會(huì)更好地表現(xiàn)出模型優(yōu)越性。
本文通過(guò)實(shí)現(xiàn)簡(jiǎn)單的基于樸素貝葉斯的文檔分類器,初步了解了貝葉斯決策理論和文檔分類工作。在實(shí)際項(xiàng)目中,我們還會(huì)遇到很多實(shí)際問(wèn)題。比如在實(shí)現(xiàn)樸素貝葉斯時(shí)會(huì)存在下溢出的問(wèn)題,通常對(duì)概率取對(duì)數(shù)來(lái)解決。在文檔分類中還有移除停用詞等問(wèn)題,在這里就不逐一解釋實(shí)現(xiàn)了。
文章主要參考書目:機(jī)器學(xué)習(xí)實(shí)戰(zhàn)。
若文中有錯(cuò)誤疏漏之處,望請(qǐng)讀者指正,謝謝!
總結(jié)
以上是生活随笔為你收集整理的朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WinForm 之 应用程序开机自启动设
- 下一篇: numpy 转存为matlab_Nump