機器學習實戰筆記 貝葉斯 簡單的字元過濾

2021-08-24 23:30:08 字數 3596 閱讀 6554

本文**jack cui

先對文字內容進行處理得到字串列表,然後再進行其他處理處理,生成詞向量

import numpy as np

from functools import reduce

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']]

#0代表非侮辱類,1代表侮辱類

classvec=[0,1,0,1,0,1]

return postinglist,classvec

def createvocablist(dataset):

vocabset=set()

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)

return returnvec

def trainnb0(trainmatrix,traincategory):

numtraindocs=len(trainmatrix)

print("numtraindocs",numtraindocs)

numwords=len(trainmatrix[0])

print("numwords",numwords)

pabusive=sum(traincategory)/float(numtraindocs)#文件屬於侮辱類的概率

print("sum(traincategory)",sum(traincategory))

print("pabusive",pabusive)

# p0num=np.zeros(numwords)

# p1num=np.zeros(numwords)

# p0denom=0.0

# p1denom=0.0

#拉普拉斯平滑(加1平滑),解決0概率出現問題

p0num=np.ones(numwords)

p1num=np.ones(numwords)

p0denom=2.0

p1denom=2.0

for i in range(numtraindocs):

if traincategory[i]==1:#類別為侮辱類

p1num+=trainmatrix[i]

p1denom+=sum(trainmatrix[i])

else:#類別為非侮辱類

p0num+=trainmatrix[i]

print("p0num",p0num)

p0denom+=sum(trainmatrix[i])

print("p0denom",p0denom)

p1vect=np.log(p1num/p1denom)#侮辱類中該詞彙的概率

p0vect=np.log(p0num/p0denom)#非侮辱類中該詞彙的概率

return p0vect,p1vect,pabusive

def classifynb(vec2classify,p0vec,p1vec,pclass1):

#reduce ()對第二個引數重複作用第乙個引數函式

# p1=reduce(lambda x,y:x*y,vec2classify*p1vec)*pclass1

# p0=reduce(lambda x,y:x*y,vec2classify*p0vec)*(1.0-pclass1)

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

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

print("p0:",p0)

print("p1:",p1)

if p1>p0:

return 1

else:

return 0

if __name__=='__main__':

postinglist,classvec=loaddataset()

# print("postinglist:",postinglist)

myvocablist=createvocablist(postinglist)

print("myvocablist:",myvocablist)

trainmat=

for postindoc in postinglist:

# print("trainmat:",trainmat)

p0v,p1v,pab=trainnb0(trainmat,classvec)

print("p0v:\n",p0v)

print("p1v:\n",p1v)

print("classvec:\n",classvec)

print("pab:\n",pab)

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

thisdoc=np.array(setofwords2vec(myvocablist,testentry))

if classifynb(thisdoc,p0v,p1v,pab):

print(testentry,'屬於侮辱類')

else:

print(testentry,'屬於非侮辱類')

testentry=['stupid','garbage']

thisdoc=np.array(setofwords2vec(myvocablist,testentry))

if classifynb(thisdoc,p0v,p1v,pab):

print(testentry,'屬於侮辱類')

else:

print(testentry,'屬於非侮辱類')

樸素貝葉斯 機器學習實戰

主要引用的是機器學習實戰中第四章的例子。該例子中將所有的詞當作乙個特徵。我們已知類別下相應特徵的概率,計算出乙個特徵下屬於不同類別的概率大小,然後選取較大的為此特徵的類別。import numpy as np def loaddataset postinglist my dog has flea p...

機器學習實戰學習筆記(三) 樸素貝葉斯

之所以稱之為 樸素 是因為整個形式化過程只做最原始 最簡單的假設。優缺點 優點 在資料較少的情況下仍然有效,可以處理多類別問題。確定 對於輸入資料的準備方式比較敏感。適用資料型別 標稱型資料。入門示例 二維座標中,如果p1 x,y p2 x,y 那麼 x,y 屬於類別1,否則屬於類別2.機器學習的乙...

機器學習實戰之樸素貝葉斯

4.樸素貝葉斯的優缺點 優點 在資料較少的情況下仍然有效,可以處理多類別問題。缺點 對於輸入資料的準備方式較為敏感。適用資料型別 標稱型資料。5.使用python進行文字分類 5.1 準備資料 從文字中構建詞向量 我們將把文字看成單詞向量或者詞條向量。考慮出現在所有文件中的所有單詞,再決定將哪些詞納...