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 根據貝葉斯定律 ...