樸素貝葉斯

2021-10-22 21:36:20 字數 3999 閱讀 7487

常用於文字分類的樸素貝葉斯演算法基於貝葉斯假設而來。和邏輯回歸是概率判別式模型不同,樸素貝葉斯演算法是概率生成式模型,不需要直接計算生成的概率值。樸素貝葉斯演算法對小規模資料處理效果較好,但是若樣本屬性有關聯時分類效果不好。

其最優化目標是是使得後驗概率最大,通過貝葉斯假設使得聯合概率可以分開乘積(否則則要通過極大似然方法估計引數,再轉化成最優化的極值問題求解),這也就大大簡化了計算,演算法因此也十分簡潔。

**實現如下:

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 ...