1. 程式人生 > >機器學習實戰-樸素貝葉斯

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

資料集參考自https://blog.csdn.net/c406495762/article/details/77341116

樸素貝葉斯:首先,何為樸素?樸素要求的是條件特徵之間相互獨立。我們都知道大名鼎鼎的貝葉斯公式,其實樸素貝葉斯的思想很簡單。就是通過計算屬於某一類別的後驗概率,然後比較大小,哪一類的概率大,那麼就將它劃分為哪一類。。。

由上述公式可知,我們先驗概率P(A)很容易求得,我們重點在與求條件概率。由於條件特徵之間相互獨立,於是可以拆分成累乘的形式。在程式碼實現中,我們一般不會去求P(B),因為分母都是一樣的,我們只關注類別概率的大小!

 

將程式碼記錄如下,方便以後檢視。

 

import numpy as np
import pandas as pd
def getDataSet():
    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']] labels = [0,1,0,1,0,1] return postingList,labels #建立詞彙表 def
createVocabList(dataSet): vocabSet = set([]) for data in dataSet: vocabSet = vocabSet | set(data) return list(vocabSet) #向量化 def vectorize(vocabSet,dataSet): vocab = [0] * len(vocabSet) for data in dataSet: vocab[vocabSet.index(data)] = 1 return vocab #樸素貝葉斯建模 def trainN(X_train,y_train): num = len(X_train) #有多少記錄 numvocab = len(X_train[0]) #詞向量的大小 p0Num = np.ones(numvocab) #統計非侮辱類的相關單詞頻數 加入了拉普拉斯平滑 p1Num = np.ones(numvocab) #統計侮辱類的相關單詞頻數 p0Sum = 2 p1Sum = 2 pA = sum(y_train) / num #先驗概率 for i in range(num): if y_train[i]==0: #統計屬於非侮辱類的條件概率所需的資料 p0Sum += sum(X_train[i]) p0Num += X_train[i] else: #統計屬於侮辱類的條件概率所需的資料 p1Sum += sum(X_train[i]) p1Num += X_train[i] # 為了防止下溢位,計算條件概率的對數 p0 = np.log(p0Num / p0Sum) #頻數除以總數 得到概率 p1 = np.log(p1Num / p1Sum) return p0,p1,pA #分類 def classify(testMat,p0,p1,pA): p0Score = sum(testMat * p0) + np.log(pA) p1Score = sum(testMat * p1) + np.log(1-pA) if p0Score > p1Score: return 0 else: return 1 if __name__=='__main__': dataSet,label = getDataSet() vocabSet = createVocabList(dataSet) trainMat = [] for elem in dataSet: trainMat.append(vectorize(vocabSet,elem)) # print(trainMat) p0,p1,pA = trainN(trainMat,label) test1= ['love', 'my', 'dalmation'] test2= ['stupid', 'garbage'] test1_vocab = np.array(vectorize(vocabSet,test1)) test2_vocab = np.array(vectorize(vocabSet,test2)) result1 = classify(test1_vocab,p0,p1,pA) result2 = classify(test2_vocab,p0,p1,pA) if result1==1: print(test1,"屬於:侮辱類") else: print(test1, "屬於:非侮辱類") print("=======================================") if result2==1: print(test2,"屬於:侮辱類") else: print(test2, "屬於:非侮辱類")

結果如下:
['love', 'my', 'dalmation'] 屬於:非侮辱類 ======================================= ['stupid', 'garbage'] 屬於:侮辱類