機器學習之樸素貝葉斯分類

超人汪小建發表於2019-02-28

樸素貝葉斯分類

所有貝葉斯分類都是基於貝葉斯定理,樸素貝葉斯分類是貝葉斯分類中運用廣泛簡單的一種,另外,它還基於特徵條件獨立假設。

貝葉斯定理

貝葉斯定理是計算條件概率的公式,條件概率即是事件B發生的前提下事件A發生的概率,記作P(A|B),叫做事件B發生的情況下A的條件概率。

公式為:

機器學習之樸素貝葉斯分類

公式大致推導:

機器學習之樸素貝葉斯分類
這裡寫圖片描述

如圖,有

機器學習之樸素貝葉斯分類

同樣,也有
機器學習之樸素貝葉斯分類

於是,
機器學習之樸素貝葉斯分類

得到,
機器學習之樸素貝葉斯分類

另外,根據全概率公式還有
機器學習之樸素貝葉斯分類

所以公式還可以寫成:
機器學習之樸素貝葉斯分類

特徵條件獨立假設

樣本集(X,Y),每個樣本x有n維特徵,即x=(x1,x2,...,xn),類標記集合y=(y1,y2,...,yn)。

此時為求最大的後驗概率,根據貝葉斯定理和全概率公式有,

機器學習之樸素貝葉斯分類

對於P(x|yk)=P(x1,x2,...,xn|yk),假如xi可取的值個數為Si個,則引數個數為k∏ni=1Si
為降低引數規模,提出特徵條件獨立假設,它假設了n維特徵(x1,x2,...,xn)互相獨立,於是
機器學習之樸素貝葉斯分類
,這時引數個數為
機器學習之樸素貝葉斯分類

核心思想

基於特徵條件獨立假設,對給定的訓練樣本集來學習輸入輸出的聯合概率分佈,得到一個模型,然後給定一個輸入x,利用貝葉斯定理求出後驗概率最大的輸出y。

即對於一個輸入x,根據概率角度就是求x屬於哪個類別的概率最大,也就是說P(y1|x)、P(y2|x)、…P(yk|x)中哪個後驗概率最大就屬於哪個類。

在特徵條件獨立假設下,有

機器學習之樸素貝葉斯分類

其中分母對於所有分類yk都是相同的,所以其實就是求分子最大值對應的分類。即
機器學習之樸素貝葉斯分類
值最大對應的分類。

期望風險

反應到期望風險上就是:將輸入例項分配到後驗概率最大的類中就是期望風險最小化。

極大似然估計&貝葉斯估計

對於訓練樣本,樸素貝葉斯法的學習其實就是估計先驗概率和條件概率。極大似然估計是一種引數估計的方法,根據訓練樣本推算出引數的大概值,因為在極大似然估計的思想看來,某個引數能使樣本出現的概率最大,那就把這個引數作為真實值。

由於極大似然估計可能會出現概率值為0的情況,這會影響到後驗概率的計算結果,為解決這個問題引入貝葉斯估計,即在計算先驗概率時在分子加一個λ,分母加一個λ 類別數,而計算條件概率時在分子加一個λ,分母加一個λ Si(其中Si為xi可取的值個數)。當λ取1時稱為拉普拉斯平滑。而當λ為0時即是極大似然估計。

大概流程

待分類項x=(x1,x2,...,xn)。
類別集合y=(y1,y2,...,yn)。
分別求P(y1|x)、P(y2|x)、…P(yk|x),取最大的值對應的分類yk。
要求3就需要訓練樣本集(X,Y),再根據樣本集完成下面5到7的操作。
根據極大似然估計或貝葉斯估計計算先驗概率和條件概率,即P(xi|yk)和P(yk)。
由特徵條件獨立假設後對應公式

機器學習之樸素貝葉斯分類
求得最大值。
得到最大值對應的分類。

實現程式碼

from numpy import *

dataSet = [[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[1,0],[0,0],[1,0],[1,0],[1,1],[1,0],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1]]
ySet = [0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1]


def train():
    dataNum = len(dataSet)
    featureNum = len(dataSet[0])
    p0Num = ones(featureNum)
    p1Num = ones(featureNum)
    p0Denom = 2.0
    p1Denom = 2.0
    p0 = 0
    for i in range(dataNum):
        if ySet[i] == 1:
            p1Num += dataSet[i]
            p1Denom += sum(dataSet[i])
        else:
            p0 += 1
            p0Num += dataSet[i]
            p0Denom += sum(dataSet[i])
    p0Rate = p0 / dataNum
    p0Vec = log(p0Num / p0Denom)
    p1Vec = log(p1Num / p1Denom)
    return p0Rate, p0Vec, p1Vec

p0Rate, p0Vec, p1Vec = train()
test = [1,0]
p1 = sum(test * p1Vec) + log(1.0 - p0Rate)
p0 = sum(test * p0Vec) + log(p0Rate)
if p1 > p0:
    print(1)
else:
    print(0)複製程式碼

歡迎關注:

機器學習之樸素貝葉斯分類
這裡寫圖片描述

相關文章