一、朴素的貝葉斯算法原理
貝葉斯分類算法以樣本可能屬於某類的概率來作為分類依據,朴素貝葉斯分類算法是貝葉斯分類算法中最簡單的一種,朴素的意思是條件概率獨立性。
條件概率的三個重要公式:
(1)概率乘法公式:
P(AB)= P(B) P(A|B) = P(A) P(B|A) =P(BA)
(2)全概率公式:
(3)貝葉斯公式:
如果一個事物在一些屬性條件發生的情況下,事物屬於A的概率>屬於B的概率,則判定事物屬於A,這就是朴素貝葉斯的基本思想。
二、算法實現一般步驟
(1)分解各類先驗樣本數據中的特征。
(2)計算各類數據中,各特征的條件概率(比如:特征1出現的情況下,屬於A類的概率p(A|特征1),屬於B類的概率p(B|特征1),屬於C類的概率p(C|特征1)......)。
(3)分解待分類數據中的特征(特征1、特征2、特征3、特征4......)。
(4)計算各特征的各條件概率的乘積,如下所示:
判斷為A類的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4).....
判斷為B類的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4).....
判斷為C類的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4).....
......
(5)結果中的最大值就是該樣本所屬的類別。
三、應用舉例
二分類問題:大眾點評、淘寶等電商上都會有大量的用戶評論,有差評(1),有好評(0),現需要使用朴素貝葉斯分類算法來自動分類用戶評論。
四、實際問題代碼實現
from numpy import * #貝葉斯算法 def loadDataSet(): trainData=[['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] #1表示侮辱性言論,0表示正常言論 return trainData, labels #生成詞匯表 def createVocabList(trainData): VocabList = set([]) for item in trainData: VocabList = VocabList|set(item) #取兩個集合的並集 return sorted(list(VocabList)) #對結果排序后返回 #對訓練數據生成只包含0和1的向量集 def createWordSet(VocabList, trainData): VocabList_len = len(VocabList) #詞匯集的長度 trainData_len = len(trainData) #訓練數據的長度 WordSet = zeros((trainData_len,VocabList_len)) #生成行長度為訓練數據的長度 列長度為詞匯集的長度的列表 for index in range(0,trainData_len): for word in trainData[index]: if word in VocabList: #其實也就是,訓練數據包含的單詞對應的位置為1其他為0 WordSet[index][VocabList.index(word)] = 1 return WordSet #計算向量集每個的概率 def opreationProbability(WordSet, labels): WordSet_col = len(WordSet[0]) labels_len = len(labels) WordSet_labels_0 = zeros(WordSet_col) WordSet_labels_1 = zeros(WordSet_col) num_labels_0 = 0 num_labels_1 = 0 for index in range(0,labels_len): if labels[index] == 0: WordSet_labels_0 += WordSet[index] #向量相加 num_labels_0 += 1 #計數 else: WordSet_labels_1 += WordSet[index] #向量相加 num_labels_1 += 1 #計數 p0 = WordSet_labels_0 * num_labels_0 / labels_len p1 = WordSet_labels_1 * num_labels_1 / labels_len return p0, p1 trainData, labels = loadDataSet() VocabList = createVocabList(trainData) train_WordSet = createWordSet(VocabList,trainData) p0, p1 = opreationProbability(train_WordSet, labels) #到此就算是訓練完成
#開始測試 testData = [['not', 'take', 'ate', 'my', 'stupid']] #測試數據 test_WordSet = createWordSet(VocabList, testData) #測試數據的向量集 res_test_0 = [] res_test_1 = [] for index in range(0,len(p0)): print(p0[index]) if test_WordSet[0][index] == 0: res_test_0.append((1-p0[index]) * test_WordSet[0][index]) res_test_1.append((1-p1[index]) * test_WordSet[0][index]) else: res_test_0.append(p0[index] * test_WordSet[0][index]) res_test_1.append(p1[index] * test_WordSet[0][index]) if sum(res_test_0) > sum(res_test_1): print("屬於0類別") else: print("屬於1類別")
運行結果: