樸素貝葉斯的基本演算法和高斯混合樸素貝葉斯演算法
- 2019 年 11 月 20 日
- 筆記

2. 樸素貝葉斯原理
樸素貝葉斯演算法基於貝葉斯定理和特徵條件獨立假設。
- 貝葉斯定理
- 特徵條件獨立:特徵條件獨立假設?X的?n個特徵在類確定的條件下都是條件獨立的。大大簡化了計算過程,但是因為這個假設太過嚴格,所以會相應犧牲一定的準確率。這也是為什麼稱呼為樸素的原因。


4.1 樸素貝葉斯的主要優點
- 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
- 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出記憶體時,我們可以一批批的去增量訓練。
- 對缺失數據不太敏感,演算法也比較簡單,常用於文本分類。
4.2 樸素貝葉斯的主要缺點
- 樸素貝葉斯模型的特徵條件獨立假設在實際應用中往往是不成立的。
- 如果樣本數據分布不能很好的代表樣本空間分布,那先驗概率容易測不準。
- 對輸入數據的表達形式很敏感。
詳細案例
演算法雜貨鋪——分類演算法之樸素貝葉斯分類
http://uml.org.cn/sjjmwj/201310221.asp
實現樸素貝葉斯的基本演算法和高斯混合樸素貝葉斯演算法
實戰項目程式碼下載:
關注微信公眾號 datanlp 然後回復 貝葉斯 即可獲取下載鏈接。

class NaiveBayesBase(object):
def __init__(self):
pass
def fit(self, trainMatrix, trainCategory):
'''
樸素貝葉斯分類器訓練函數,求:p(Ci),基於辭彙表的p(w|Ci)
Args:
trainMatrix : 訓練矩陣,即向量化表示後的文檔(詞條集合)
trainCategory : 文檔中每個詞條的列表標註
Return:
p0Vect : 屬於0類別的概率向量(p(w1|C0),p(w2|C0),…,p(wn|C0))
p1Vect : 屬於1類別的概率向量(p(w1|C1),p(w2|C1),…,p(wn|C1))
pAbusive : 屬於1類別文檔的概率
'''
numTrainDocs = len(trainMatrix)
# 長度為辭彙表長度
numWords = len(trainMatrix[0])
# p(ci)
self.pAbusive = sum(trainCategory) / float(numTrainDocs)
# 由於後期要計算p(w|Ci)=p(w1|Ci)*p(w2|Ci)*…*p(wn|Ci),若wj未出現,則p(wj|Ci)=0,因此p(w|Ci)=0,這樣顯然是不對的
# 故在初始化時,將所有詞的出現數初始化為1,分母即出現詞條總數初始化為2
p0Num = np.ones(numWords)
p1Num = np.ones(numWords)
p0Denom = 2.0
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])
# p(wi | c1)
# 為了避免下溢出(當所有的p都很小時,再相乘會得到0.0,使用log則會避免得到0.0)
self.p1Vect = np.log(p1Num / p1Denom)
# p(wi | c2)
self.p0Vect = np.log(p0Num / p0Denom)
return self