樸素貝葉斯分類
所有貝葉斯分類都是基於貝葉斯定理,樸素貝葉斯分類是貝葉斯分類中運用廣泛簡單的一種,另外,它還基於特徵條件獨立假設。
貝葉斯定理
貝葉斯定理是計算條件概率的公式,條件概率即是事件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)複製程式碼
歡迎關注: