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

2021-07-05 03:06:19 字數 3266 閱讀 1070

4. 樸素貝葉斯的優缺點:

優點:在資料較少的情況下仍然有效,可以處理多類別問題。

缺點:對於輸入資料的準備方式較為敏感。

適用資料型別:標稱型資料。

5.使用python進行文字分類

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

我們將把文字看成單詞向量或者詞條向量。考慮出現在所有文件中的所有單詞,再決定將哪些詞納入詞彙表或者說所要的詞彙集合,所以必須將每一篇文件轉化成詞彙表上的向量。比如機器學習實戰所給出的例項。

def loaddataset():

postinglist=[

['my','dog','has','flea','problem','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

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

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

前面介紹了如何將一組單詞轉換為一組數字,接下來看看如何使用這些數字計算概率。

該函式的偽**如下:

計算每個類別中的文件數目

對每篇訓練文件:

對每個類別:

如果詞條出現在文件中,則增加該詞條的計數值

增加所有詞條的計數值

對每個類別:

對每個詞條:

將該詞條的數目除以總詞條數目得到條件概率

返回每個類別的條件概率

def trainnb0(trainmatrix,traincategory):

numtraindocs = len(trainmatrix)#計算資料總量

numwords = len(trainmatrix[0])#每一條資料的詞彙量

pabusive = sum(traincategory)/float(numtraindocs)#侮辱性文件的比例

p0num = ones(numwords);p1num = ones(numwords)#將所有詞的出現數初始化為1

p0denom = numtraindocs - sum(traincategory) + 2.0;#非侮辱性文件的總數量

p1denom = sum(traincategory) + 2.0;#侮辱性文件的總數量

for i in range(numtraindocs):

if traincategory[i] == 1:

p1num += trainmatrix[i]#侮辱性文件對應詞彙的數量加1

else:

p0num += trainmatrix[i]#非侮辱性文件對應詞彙的數量加1

p1vec = log(p1num/p1denom)#取log

p0vec = log(p0num/p0denom)#取log

return p0vec,p1vec,pabusive

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

p1 = sum(vec2classify*p1vec) + log(pclass1)#計算侮辱性文件的概率

p0 = sum(vec2classify*p0vec) + log(1.0 - pclass1)#計算非侮辱性文件的概率

if p1 > p0:

return 1

else:

return 0

def testingnb():#計算測試資料

listoposts,listclasses = loaddataset()#獲取詞向量

myvocablist = createvocablist(listoposts)#獲取去重詞匯集

trainmat =

for postindoc in listoposts:

p0v,p1v,pab = trainnb0(array(trainmat),array(listclasses))#訓練樣本資料

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

thisdoc = array(setofwords2vec(myvocablist,testentry))

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

樸素貝葉斯 機器學習實戰

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

機器學習之樸素貝葉斯

寫在前面 本文寫自初學時,若後續學習過程中有新的理解,將不定期進行更新 若文中敘述有誤,望不吝賜教,也將及時修改 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。在理解樸素貝葉斯之前,需要對兩個數...

機器學習之樸素貝葉斯

樸素貝葉斯 1 樸素貝葉斯 2 一 高斯樸素貝葉斯 gaussiannb實現了高斯樸素貝葉斯分類演算法,設假設特徵的可能性是高斯的 p x i y 12 y 2exp xi y 22 y 2 p x i y frac exp frac p xi y 2 y2 exp 2 y2 xi y 2 1 引數...