樸素貝葉斯演算法

無風聽海發表於2022-04-12

一、從生活角度來理解樸素貝葉斯演算法

樸素貝葉斯演算法是統計學味道最濃的一款演算法,也是最能體現我們日常生活經驗的演算法;

與我們讀萬卷書行萬里路形成我們自己的生活經驗類似,樸素貝葉斯演算法也是基於收集的歷史資料分析得到相關事情發生的原因,從而形成解決問題的模型;

與我們面對未知的未來類似,基於自己的生活經驗計算各種可能的情況,最終選擇一個最大可能的方向進行努力 ,樸素貝葉斯演算法也是基於學習的模型計算給定的輸入屬於各個分類的概率,並選擇概率最大的分類作為結果;

從我們出生開始,就在不斷的進行學習,通過上學、不同的人生體驗、閱讀不同型別的書籍來學習;我們把人生的前二十多年全力投入到學習之中,就是要盡最大的可能通過各種方式來豐富自己面對未來不確定性的經驗;只不過由於各種客觀或者主觀條件的限制,我們的內化的經驗可能會誤差比較大,同時可能也不具有統計性規律;

二、從數學的角度來理解樸素貝葉斯演算法

樸素貝葉斯法實現簡單,學習與預測的效率都很高,是一種常用的方法;該演算法是基於貝葉斯定理和特徵條件獨立假設的分類演算法;該演算法首先通過分析訓練資料得到先驗概率、似然度,從而得到輸入輸出的聯合概率分佈;最後基於此訓練模型,利用貝葉斯定理計算得到輸入的後驗概率最大的分類;

聯合概率P(X,Y)是通過計算先驗概率和條件概率得到的;

樸素貝葉斯法通過訓練資料集學習得到先驗概率

\[P(Y = c_{k}) , k = 1,2,3,...,K \]

條件概率

\[P(X = x | Y = c_{k}) = P(X^{(1)} = x^{(1)},..., X^{(n)} = x^{(n)}| Y = c_{k}), k = 1,2,3,...,K \]

由於演算法假設特徵條件獨立性假設,所以條件概率轉化為

\[P(X = x | Y = c_{k}) = P(X^{(1)} = x^{(1)},..., X^{(n)} = x^{(n)}| Y = c_{k}) = \prod_{j=1}^{n} P(X^{(j)} = x^{(j)}| Y = c_{k}) \]

當預測分類的時候,對給定的輸入x,通過學習到的模型計算後驗概率分佈,k|X=x),將後驗概率最大的類作為x的類輸出。後驗概率計算根據貝葉斯定理進行:

\[P(Y = c_{k} | X = x) = \frac{P(X = x | Y = c_{k}) P(Y = c_{k})}{P(X = x)} = \frac{P(X = x | Y = c_{k}) P(Y = c_{k})}{\sum_{k} P(X = x|Y = c_{k})P(Y = c_{k})} \]

由於分母P(X = x)是對整個訓練樣本進行計算的,所以這裡類似一個常數,故可以忽略;同時結合上邊特徵獨立性得到的條件概率,可以得到

\[y = \underset{c_{k}}{argmax} P(Y = c_{k}) \prod_{j} P(X^{(j)} = x^{(j)} | Y = c_{k}) \]

三、樸素貝葉斯演算法分類示例

在Scikit-Learn庫中,基於貝葉斯這一大類的演算法模型的相關類庫都在sklearn.naive_bayes包之中;

from sklearn.datasets import load_iris
from sklearn.naive_bayes import MultinomialNB

X, y = load_iris(return_X_y= True)
clf = MultinomialNB().fit(X, y)
r = clf.predict(X)
print(r)
s = clf.score(X, y)
print(s)



# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#  0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 2 1
#  1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2]
# 0.9533333333333334

相關文章