樸素貝葉斯

2021-08-03 06:52:35 字數 3224 閱讀 6338

1.準備資料:從文字中構建詞向量

2.訓練演算法:從詞向量計算概率

3.測試演算法(儲存為 bayes.py 檔案)

參考

#coding=utf-8

from numpy import *

#文字轉化為詞向量

def loaddataset():

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 #詞條切分後的分檔和類別標籤

#包含所有文件 不含重複詞的list

def createvocablist(dataset):

vocabset=set()#建立空集,set是返回不帶重複詞的list

for document in dataset:

vocabset=vocabset|set(document) #建立兩個集合的並集

return list(vocabset)

#判斷某個詞條在文件中是否出現

def setofwords2vec(vocablist, inputset):#引數為詞彙表和某個文件

returnvec = [0]*len(vocablist)

for word in inputset:

if word in vocablist:

returnvec[vocablist.index(word)] = 1

else: print("the word: %s is not in my vocabulary!" % word)#返回文件向量 表示某個詞是否在輸入文件中出現過 1/0

return returnvec

def trainnb0(trainmatrix,traincategory):

numtraindocs=len(trainmatrix) #文件數目

numwords=len(trainmatrix[0])

pabusive=sum(traincategory)/float(numtraindocs) #文件中屬於侮辱類的概率,等於1才能算,0是非侮辱類

#p0num=zeros(numwords); p1num=zeros(numwords)

#p0denom=0.0;p1denom=0.0

p0num = ones(numwords)

p1num = ones(numwords)

p0denom = 2.0

p1denom = 2.0

for i in range(numtraindocs):#遍歷每個文件

#if else潛在遍歷類別,共2個類別

if traincategory[i]==1: #一旦某個詞出現在某個文件中出現(出現為1,不出現為0)

p1num+=trainmatrix[i] #該詞數加1

p1denom+=sum(trainmatrix[i]) #文件總詞數加1

else: #另乙個類別

p0num+=trainmatrix[i]

p0denom+=sum(trainmatrix[i])

# p1vect = p1num / p1denom

# p0vect = p0num / p0denom

p1vec = log(p1num / p1denom)

p0vec = log(p0num / p0denom)

return p0vec, p1vec, pabusive #返回p0vec,p1vec都是矩陣,對應每個詞在文件總體中出現概率,pab對應文件屬於1的概率

#給定詞向量 判斷類別

def classifynb(vec2classify,p0vec,p1vec,pclass1): #第乙個引數為0,1組合二分類矩陣,對應詞彙表各個詞是否出現

p1=sum(vec2classify*p1vec)+log(pclass1)

p0=sum(vec2classify*p0vec)+log(1.0-pclass1)

if p1>p0:

return 1

else: return 0

#封裝的bayes測試函式

def testingnb():

listoposts,listclasses=loaddataset() #匯入資料,第乙個儲存文件,第二個儲存文件標記類別

myvocablist=createvocablist(listoposts) #所有詞彙總list,不含重複的

trainmat=

for postindoc in listoposts:#生成文件對應詞的矩陣 每個文件一行,每行內容為詞向量

p0v,p1v,pab=trainnb0(array(trainmat),array(listclasses)) #根據現有資料輸出詞對應的類別判定和概率

testentry=['love','my','dalmation']

thisdoc=array(setofwords2vec(myvocablist,testentry)) #判斷測試詞條在詞彙list中是否出現,生成詞向量

print(testentry,'classified as:',classifynb(thisdoc,p0v,p1v,pab)) #根據貝葉斯返回的概率,將測試向量與之乘,輸出結果

testentry=['stupid','garbage']

thisdoc=array(setofwords2vec(myvocablist,testentry))

print(testentry,'classified as:',classifynb(thisdoc,p0v,p1v,pab))

在python命令列輸入測試命令

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...

樸素貝葉斯

機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...

樸素貝葉斯

樸素貝葉斯分類器 x1,x2,xn 氣壓,濕度,溫度,y1,y2 晴,雨 假設通過氣壓,濕度,溫度,的情況去推測天氣是否下雨,上述問題可以表示為 已知x 氣壓,濕度,溫度,時天氣為y 晴,雨 的概率。這個問題實際上就是乙個條件概率 由條件概率公式可得,p y x p x,y p x 根據貝葉斯定律 ...