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