1.基本概念
樸素貝葉斯是簡化的貝葉斯算法亮蛔,是一種基于貝葉斯定理和條件獨(dú)立性假設(shè)的一種分類方法比伏,通過假設(shè)特征獨(dú)立,簡化后驗(yàn)概率計(jì)算户魏。
基本形式:
? ?
推導(dǎo)過程:
解釋:已知當(dāng)前給出預(yù)測樣本(B是一組特征值)澡刹,求已知該樣本情況下呻征,結(jié)果為A的概率
P(A|B)稱為后驗(yàn)概率
P(A)是A在所有訓(xùn)練集中出現(xiàn)的概率
P(B|A)稱為先驗(yàn)概率,已知結(jié)果A條件下罢浇,訓(xùn)練集B出現(xiàn)的概率
P(B)是所有特征b同時(shí)發(fā)生的概率
最終形式:
P(A):直接計(jì)算
由于概率獨(dú)立
固定可以忽略
2.相關(guān)代碼(注意拉普拉斯平滑和對結(jié)果去自然對數(shù))
import numpy
from numpy import *
# 該方法為貝葉斯訓(xùn)練陆赋,輸入樣本集合和標(biāo)簽集合
def train_bayes(train_matrix, train_class):
? ? # 樣本個(gè)數(shù)
? ? num_docs = len(train_matrix)
? ? # 特征個(gè)數(shù)
? ? num_word = len(train_matrix[0])
? ? # 先驗(yàn)概率P(A)? A為1的概率
? ? Prob_positive = sum(train_class)/ float(num_docs)
? ? # 因?yàn)閾?dān)心零概率的出現(xiàn)導(dǎo)致連乘概率為0沐祷,加入拉普拉斯平滑系數(shù)(就是本來為0的加上一個(gè)常數(shù),這樣不會為0)攒岛,所以下面為np.ones而不是np.zeros
? ? # 因?yàn)閷Y(jié)果概率只是比較而不是要精確值赖临,因此這樣做并對概率取自然對數(shù)避免下溢出
? ? Prob_num_0 = ones(num_word)
? ? Prob_num_1 = ones(num_word)
? ? Prob_denom_0 = 2.0
? ? Prob_denom_1 = 2.0
? ? # 計(jì)算概率向量
? ? # 先驗(yàn)概率每個(gè)特征值|label為1的概率向量
? ? for i in range(num_docs):
? ? ? ? if train_class[i] == 1:
? ? ? ? ? ? Prob_num_1 += train_matrix[i]
? ? ? ? ? ? Prob_denom_1 += sum(train_matrix[i])
? ? ? ? else:
? ? ? ? ? ? Prob_num_0 += train_matrix[i]
? ? ? ? ? ? Prob_denom_0 += sum(train_matrix[i])?
? ? # 取自然對數(shù)? ? ? ?
? ? p1_vec = log(Prob_num_1 / Prob_denom_1)
? ? p0_vec = log(Prob_num_0 / Prob_denom_0)
? ? # 返回P(A=1)/P(A=0) = 1 - P(A=1)/P(b[vec]|A=1)/P(b[vec]|A=0) --- 由此可計(jì)算概率
? ? return p1_vec, p0_vec, Prob_positive