根據公式:
可以得出:
這裡進行計算時,只需要計算分子,比較大小,因為分母只是對數值有影響,對兩個數的比較不會產生影響
import numpy as np
"""建立資料集"""
def loaddataset():
postinglist = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], # stupid侮辱類
['my', 'dalmation', 'is', 'so', 'cute', 'i', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'], # garbage,stupid侮辱類
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] # 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) # 先將文件轉換為set集合,無需不重複,再取並集
return list(vocabset)
"""判斷輸入集中單詞是否在詞彙表中"""
def setofwordsvec(vocablist, inputset):
returnvec = [0] * len(vocablist) # 建立乙個元素都為0的向量
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) # 樣本個數,6
numwords = len(trainmatrix[0]) # 每個樣本長度,32
pabusive = sum(traincategory) / float(numtraindocs) # 文件屬於侮辱類的概率
p0num = np.ones(numwords) # 非侮辱類情況下,某個單詞出現的概率
p1num = np.ones(numwords) # 侮辱類情況下,某個單詞出現的概率
p0denom = 2.0 # 分母,都設定為2(我們需要的是兩個比較,所以都設定為共同的分母不影響大小)
p1denom = 2.0
for i in range(numtraindocs):
if traincategory[i] == 1:
p1num += trainmatrix[i] # 每個侮辱類樣本都相加(記錄侮辱類每個單詞的個數)
p1denom += sum(trainmatrix[i]) # 求和所有侮辱類樣本的單詞數
else:
p0num += trainmatrix[i] # 每個非侮辱類樣本都相加(記錄侮辱類每個單詞的個數)
p0denom += sum(trainmatrix[i]) # 求和所有非侮辱類樣本的單詞數
p1vect = np.log(p1num / p1denom) # 取對數,防止下溢位
p0vect = np.log(p0num / p0denom)
return p0vect, p1vect, pabusive
"""分類"""
def classifynb(vecclassify, p0vec, p1vec, pclass1):
p1 = sum(vecclassify * p1vec) + np.log(pclass1) # log(a*b)=loga+logb,前邊沒有log,是因為這需要兩個數比較,同時log和都不log不會影響比較大小
p0 = sum(vecclassify * p0vec) + np.log(1 - pclass1)
if p1 > p0:
return 1
else:
return 0
if __name__ == '__main__':
listoposts, listclasses = loaddataset()
myvocablist = createvocablist(listoposts)
trainmat =
for postindoc in listoposts:
pov, p1v, pab = trainnb0(np.array(trainmat), np.array(listclasses))
testentry = ['love', 'my', 'dalmation']
thisdoc = np.array(setofwordsvec(myvocablist, testentry))
if classifynb(thisdoc, pov, p1v, pab):
print("%s屬於侮辱類詞彙。" % (testentry,))
else:
print("%s屬於非侮辱類詞彙。" % (testentry,))
testentry = ['stupid', 'garbage']
thisdoc = np.array(setofwordsvec(myvocablist, testentry))
if classifynb(thisdoc, pov, p1v, pab):
print("%s屬於侮辱類詞彙。" % (testentry,))
else:
print("%s屬於非侮辱類詞彙。" % (testentry,))
機器學習 樸素貝葉斯
樸素貝葉斯原理 1.貝葉斯公式 2.樸素貝葉斯的模型 3.後驗概率最大化的含義 4.樸素貝葉斯的引數估計 4.1.特徵是離散值 假設符合多項式分布 4.2.特徵是稀疏的離散值 假設符合伯努利分布 4.3.特徵是連續值 假設符合正態分佈 5.樸素貝葉斯演算法過程 6.樸素貝葉斯演算法小結 scikit...
機器學習 樸素貝葉斯 例子
一 學習樸素貝葉斯之前先了解一下 條件概率下 貝葉斯公式 1 舉例是兩個工具機m1和m2 用例生產扳手機器 生產扳手 個數 mach1 30mach2 20不合格佔1 defective 機器 次品分布比例 mach1 50 mach2 50 2 問題 mach2生產的不合格產品的概率是多少?p m...
機器學習之樸素貝葉斯
寫在前面 本文寫自初學時,若後續學習過程中有新的理解,將不定期進行更新 若文中敘述有誤,望不吝賜教,也將及時修改 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。在理解樸素貝葉斯之前,需要對兩個數...