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