机器学习算法总结--朴素贝叶斯
這次需要總結的是樸素貝葉斯算法,參考文章:
- 《統計學習方法》
- 機器學習常見算法個人總結(面試用)
- 樸素貝葉斯理論推導與三種常見模型
- 樸素貝葉斯的三個常用模型:高斯、多項式、伯努利
簡介
樸素貝葉斯是基于貝葉斯定理與特征條件獨立假設的分類方法。
貝葉斯定理是基于條件概率來計算的,條件概率是在已知事件B發生的前提下,求解事件A發生的概率,即P(A|B)=P(AB)P(B),而貝葉斯定理則可以通過P(A|B)來求解P(B|A):
其中分母 P(A)可以根據全概率公式分解為: P(A)=∑ni=1P(Bi)P(A|Bi)
而特征條件獨立假設是指假設各個維度的特征x1,x2,...,xn互相獨立,則條件概率可以轉化為:
樸素貝葉斯分類器可表示為:
f(x)=argmaxykP(yk|x)=argmaxykP(yk)∏ni=1P(xi|yk)∑kP(yk)∏ni=1P(xi|yk)
而由于對上述公式中分母的值都是一樣的,所以可以忽略分母部分,即可以表示為:
f(x)=argmaxP(yk)∏i=1nP(xi|yk)
這里 P(yk)是先驗概率,而 P(yk|x)則是后驗概率,樸素貝葉斯的目標就是最大化后驗概率,這等價于期望風險最小化。
參數估計
極大似然估計
樸素貝葉斯的學習意味著估計P(yk)和P(xi|yk),可以通過極大似然估計來估計相應的概率。
如上圖所示,分別是P(yk)和P(xi|yk)的極大似然估計。
當求解完上述兩個概率,就可以對測試樣本使用樸素貝葉斯分類算法來預測其所屬于的類別,簡單總結的算法流程如下所示:
貝葉斯估計/多項式模型
用極大似然估計可能會出現所要估計的概率值為0的情況,這會影響到后驗概率的計算,使分類產生偏差。解決這個問題的辦法是使用貝葉斯估計,也被稱為多項式模型。
當特征是離散的時候,使用多項式模型。多項式模型在計算先驗概率P(yk)和條件概率P(xi|yk)時,會做一些平滑處理,具體公式為:
N是總的樣本個數,k是總的類別個數,Nyk是類別為yk的樣本個數,α是平滑值。
P(xi|yk)=Nyk,xi+αNyk+nα
Nyk是類別為yk的樣本個數,n是特征的維數,Nyk,xi是類別為yk的樣本中,第i維特征的值是xi的樣本個數,α是平滑值。
當α=1時,稱作Laplace平滑,當0<α<1時,稱作Lidstone平滑,α=0時不做平滑。
如果不做平滑,當某一維特征的值xi沒在訓練樣本中出現過時,會導致P(xi|yk)=0,從而導致后驗概率為0。加上平滑就可以克服這個問題。
高斯模型
當特征是連續變量的時候,運用多項式模型會導致很多P(xi|yk)=0(不做平滑的情況下),即使做平滑,所得到的條件概率也難以描述真實情況,所以處理連續變量,應該采用高斯模型。
高斯模型是假設每一維特征都服從高斯分布(正態分布):
μyk,i表示類別為yk的樣本中,第i維特征的均值;
σ2yk,i表示類別為yk的樣本中,第i維特征的方差。
伯努利模型
與多項式模型一樣,伯努利模型適用于離散特征的情況,所不同的是,伯努利模型中每個特征的取值只能是1和0(以文本分類為例,某個單詞在文檔中出現過,則其特征值為1,否則為0).
伯努利模型中,條件概率P(xi|yk)的計算方式是:
當特征值xi為1時,P(xi|yk)=P(xi=1|yk);
當特征值xi為0時,P(xi|yk)=1?P(xi=1|yk);
工作流程
確定特征屬性,并對每個特征屬性進行適當劃分,然后由人工對一部分待分類項進行分類,形成訓練樣本。
計算每個類別在訓練樣本中的出現頻率及每個特征屬性劃分對每個類別的條件概率估計
使用分類器進行分類,輸入是分類器和待分類樣本,輸出是樣本屬于的分類類別
屬性特征
P(xi|yk)=12πσ2yk?????√exp(?(xi?μyk)22σ2yk)
優缺點
優點
缺點
代碼實現
下面是使用sklearn的代碼例子,分別實現上述三種模型,例子來自樸素貝葉斯的三個常用模型:高斯、多項式、伯努利。
下面是高斯模型的實現
多項式模型如下:
>>> import numpy as np >>> X = np.random.randint(5, size=(6, 100)) >>> y = np.array([1, 2, 3, 4, 5, 6]) >>> from sklearn.naive_bayes import MultinomialNB >>> clf = MultinomialNB() >>> clf.fit(X, y) MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) >>> print(clf.predict(X[2])) [3]值得注意的是,多項式模型在訓練一個數據集結束后可以繼續訓練其他數據集而無需將兩個數據集放在一起進行訓練。在sklearn中,MultinomialNB()類的partial_fit()方法可以進行這種訓練。這種方式特別適合于訓練集大到內存無法一次性放入的情況。
在第一次調用partial_fit()時需要給出所有的分類標號。
>>> import numpy >>> from sklearn.naive_bayes import MultinomialNB >>> clf = MultinomialNB() >>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb']) GaussianNB() >>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb'])) GaussianNB() >>> clf.predict(numpy.array([9,1])) array(['bb'], dtype='|S2')伯努利模型如下:
>>> import numpy as np >>> X = np.random.randint(2, size=(6, 100)) >>> Y = np.array([1, 2, 3, 4, 4, 5]) >>> from sklearn.naive_bayes import BernoulliNB >>> clf = BernoulliNB() >>> clf.fit(X, Y) BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True) >>> print(clf.predict(X[2])) [3]樸素貝葉斯的總結就到這里為止。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的机器学习算法总结--朴素贝叶斯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pink-css标签
- 下一篇: 程序员幽默趣图(动物篇)