常用於文字分類的樸素貝葉斯演算法基於貝葉斯假設而來。和邏輯回歸是概率判別式模型不同,樸素貝葉斯演算法是概率生成式模型,不需要直接計算生成的概率值。樸素貝葉斯演算法對小規模資料處理效果較好,但是若樣本屬性有關聯時分類效果不好。
其最優化目標是是使得後驗概率最大,通過貝葉斯假設使得聯合概率可以分開乘積(否則則要通過極大似然方法估計引數,再轉化成最優化的極值問題求解),這也就大大簡化了計算,演算法因此也十分簡潔。
**實現如下:
import numpy as np
#載入文字
defloaddataset()
: postinglist=[[
'my'
,'dog'
,'has'
,'flea'
,'problems'
,'help'
,'please'],
#切分的詞條
['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代表侮辱性詞彙,0代表不是
return postinglist,classvec #返回實驗樣本切分的詞條和類別標籤向量
defcreatevocablist
(dataset)
: vocablist =
set(
)#建立不重複的空集
for document in dataset:
vocablist = vocablist |
set(document)
#取並集
return
list
(vocablist)
#詞集模型
defsetofwords2vec
(vocablist,inputset)
: retvec =[0
]*len(vocablist)
for word in inputset:
if word in vocablist:
retvec[vocablist.index(word)]=
1return retvec
# #詞袋模型
# def setofwords2vec(vocablist,inputset):
# retvec = [0] * len(vocablist)
# for word in inputset:
# if word in vocablist:
# retvec[vocablist.index(word)] += 1
# return retvec
#樸素貝葉斯分類器訓練函式
deftrainnb0
(trainmatrix,traincategory)
: numdocs =
len(trainmatrix)
numwords =
len(trainmatrix[0]
) p0num = np.zeros(numwords)
p1num = np.zeros(numwords)
p0demon =
0.0 p1demon =
0.0 pc1 =
sum(traincategory)
/float
(numdocs)
for i in
range
(numdocs)
:if traincategory[i]==1
: p1num += trainmatrix[i]
p1demon +=
sum(trainmatrix[i]
)else
: p0num += trainmatrix[i]
p0demon +=
sum(trainmatrix[i]
) p1vect = p1num / p1demon
p0vect = p0num / p0demon
return p0vect,p1vect,pc1
#樸素貝葉斯分類函式
defclassifynb
(vec2classify,p0vect,p1vect,pc1)
:#vec2classify為文字經過向量化後的向量
#這裡轉變成log方便數學計算
p1 =
sum(vec2classify * p1vect)
+ np.log(pc1)
p0 =
sum(vec2classify * p0vect)
+ np.log(
1.0-pc1)
if p1 > p0:
return
1else
:return
0def
testingnb()
: list0posts, listclasses = loaddataset(
) myvocabulist = createvocablist(list0posts)
trainmat =
for postindoc in list0posts:
) p0v,p1v,pcv = trainnb0(np.array(trainmat)
,np.array(listclasses)
) testentry =
['love'
,'my'
,'dalmation'
] testvec = np.array(setofwords2vec(myvocabulist, testentry)
)if classifynb(testvec, p0v, p1v, pcv)==1
:print
(testentry,
'屬於侮辱類'
)else
:print
(testentry,
'屬於非侮辱類'
) testentry =
['stupid'
,'garbage'
] testvec = np.array(setofwords2vec(myvocabulist,testentry)
)if classifynb(testvec,p0v,p1v,pcv)==1
:print
(testentry,
'屬於侮辱類'
)else
:print
(testentry,
'屬於非侮辱類'
)if __name__ ==
'__main__'
: testingnb(
)
執行結果:
參考:1、《機器學習實戰》
樸素貝葉斯
樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...
樸素貝葉斯
1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...
樸素貝葉斯
機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...