樸素貝葉斯的基本算法和高斯混合樸素貝葉斯算法

  • 2019 年 11 月 20 日
  • 筆記

2. 樸素貝葉斯原理

樸素貝葉斯算法基於貝葉斯定理和特徵條件獨立假設

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

4.1 樸素貝葉斯的主要優點

  1. 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率
  2. 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。
  3. 對缺失數據不太敏感,算法也比較簡單,常用於文本分類。

4.2 樸素貝葉斯的主要缺點

  1. 樸素貝葉斯模型的特徵條件獨立假設在實際應用中往往是不成立的
  2. 如果樣本數據分佈不能很好的代表樣本空間分佈,那先驗概率容易測不準。
  3. 對輸入數據的表達形式很敏感。

詳細案例

算法雜貨鋪——分類算法之樸素貝葉斯分類

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