主要引用的是機器學習實戰中第四章的例子。該例子中將所有的詞當作乙個特徵。
我們已知類別下相應特徵的概率,計算出乙個特徵下屬於不同類別的概率大小,然後選取較大的為此特徵的類別。
import numpy as np
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
def createvocablist(dataset):#建立乙個包含在所有文件**現過不重複詞的列表
vocabset = set()
for document in dataset:
vocabset = vocabset | set(document)
return list(vocabset)
'''
輸入引數1:詞彙表
輸入引數2:輸入文件
輸出:文件向量,統計該文件中在詞彙表**現的詞的次數
'''def setofwords2vec(vocablist, inputset):
returnvec = [0]*len(vocablist)
for word in inputset:
if word in vocablist:
returnvec[vocablist.index(word)] += 1
return returnvec
計算每個詞在乙個類別下出現的概率。p(w|c)=乙個詞出現次數 / 該類下所有詞出現次數總和
'''
p(c|w) = p(w|c)*p(c)/p(w)
輸入引數1:各個文件組成的列表
輸入引數2:類別
輸出引數1:類別為0時的各個特徵概率
輸出引數2:類別為1時的各個特徵概率
輸出引數3:類別0的概率
'''def trainnb0(trainmatrix, traincategory):
numtraindocs = len(trainmatrix) #文件個數 [,,]
numwords = len(trainmatrix[0]) #詞彙表的總數量
pabusive = sum(traincategory)/float(numtraindocs) #二分類,計算其中一類的概率
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] #每個單詞作為乙個特徵,該文件中所有單詞+1
p1denom += sum(trainmatrix[i]) #此類別下,所有出現過的單詞總次數
else:
p0num += trainmatrix[i]
p0denom += sum(trainmatrix[i])
p1vect = np.log(p1num/p1denom) #計算p(w|c)
p0vect = np.log(p0num/p0denom)
return p0vect, p1vect, pabusive
'''
輸入引數1:將文字轉化為數字向量後的列表
輸入引數2:類別為0時的各個特徵概率
輸入引數3:類別為1時的各個特徵概率
輸入引數4:類別0的概率
'''def classifynb(vec2classify, p0vec, p1vec, pclass1):
p1 = sum(vec2classify * p1vec) + np.log(pclass1) # log(a*b) = loga +logb
p0 = sum(vec2classify * p0vec) + np.log(1.0 - pclass1)
if p1 > p0:
return 1
else:
return 0
輸入:
def testingnb():
#listclasses:[0, 1, 0, 1, 0, 1]
listoposts, listclasses = loaddataset()
myvocablist = createvocablist(listoposts)
trainmat =
for postindoc in listoposts:
p0v, p1v, pab = trainnb0(np.array(trainmat), np.array(listclasses))
testentry = ['love', 'my', 'dalmation']
thisdoc = np.array(setofwords2vec(myvocablist, testentry))
print(testentry, 'classified as: ', classifynb(thisdoc, p0v, p1v, pab))
testentry = ['stupid', 'garbage']
thisdoc = np.array(setofwords2vec(myvocablist, testentry))
print(testentry, 'classified as: ', classifynb(thisdoc, p0v, p1v, pab))
testingnb()
輸出:
['love', 'my', 'dalmation'] classified as: 0
['stupid', 'garbage'] classified as: 1
機器學習實戰之樸素貝葉斯
4.樸素貝葉斯的優缺點 優點 在資料較少的情況下仍然有效,可以處理多類別問題。缺點 對於輸入資料的準備方式較為敏感。適用資料型別 標稱型資料。5.使用python進行文字分類 5.1 準備資料 從文字中構建詞向量 我們將把文字看成單詞向量或者詞條向量。考慮出現在所有文件中的所有單詞,再決定將哪些詞納...
機器學習 樸素貝葉斯
樸素貝葉斯原理 1.貝葉斯公式 2.樸素貝葉斯的模型 3.後驗概率最大化的含義 4.樸素貝葉斯的引數估計 4.1.特徵是離散值 假設符合多項式分布 4.2.特徵是稀疏的離散值 假設符合伯努利分布 4.3.特徵是連續值 假設符合正態分佈 5.樸素貝葉斯演算法過程 6.樸素貝葉斯演算法小結 scikit...
機器學習實戰學習筆記(三) 樸素貝葉斯
之所以稱之為 樸素 是因為整個形式化過程只做最原始 最簡單的假設。優缺點 優點 在資料較少的情況下仍然有效,可以處理多類別問題。確定 對於輸入資料的準備方式比較敏感。適用資料型別 標稱型資料。入門示例 二維座標中,如果p1 x,y p2 x,y 那麼 x,y 屬於類別1,否則屬於類別2.機器學習的乙...