機器學習 樸素貝葉斯(侮辱類詞彙檢測)

2021-09-25 08:14:50 字數 3525 閱讀 8432

根據公式:

可以得出:

這裡進行計算時,只需要計算分子,比較大小,因為分母只是對數值有影響,對兩個數的比較不會產生影響

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

機器學習之樸素貝葉斯

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