樸素貝葉斯————基於貝葉斯定理與特徵條件獨立假設的分類方法
對於給定數據集,首先計算基於特徵條件獨立假設學習輸入/輸出的聯合概率分佈;然後基於此模型,對給定的輸入x,利用貝葉斯定理求出
後驗概率最大的輸出y。
用p1(x,y)表示數據(x,y)屬於類別1的概率
用p2(x,y)表示數據(x,y)屬於類別2的概率
如果p1>p2,那麼類別爲1;反之,類別爲2
推廣: argmax p(ci | x,y),使後驗概率最大的ci,則(x,y)就屬於ci類
其中源碼第49~55行理解:
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0
這是貝葉斯分類函數的代碼
四個輸入:要分類的向量vec2Classify 以及貝葉斯訓練函數計算得到的三個概率值;
其中vec2Classify得到方式
testEntry = ['love', 'my', 'dalmation'] # 測試樣本
thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) # setOfWordsVec函數用來檢查測試樣本是否在訓練的詞組中
print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb) # thisDoc = vec2Classify 這時是一個{0,1}集合的數組
接下來解釋 p1和p0的計算
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
已知:p( ci | w ) = p( w | ci ) * p( ci ) / p( w )
因爲p( w )是定量,所以要求使之值最大的ci,即求p( w | ci ) * p ( ci )的最大值
分類函數中 ci = {0,1} 由於樸素貝葉斯假設所有特徵都相互獨立,則有
p( w | ci) = p( w0, w1, ... , wn | ci) = p( w0 | ci ) * p( w1 | ci ) * .... * p( wn | ci )
取對數(不影響函數單調性):
ln p ( w | ci) = sum ( ln p( wn | ci )) ( n = 1, 2, .... )
所有原式取對數,ln( p( w | ci) * p( ci ) ) = sum ( ln p( wn | ci) ) + ln p( ci )
p(1) = pClass1 所以 p(0) = 1 - pClass1