樸素貝葉斯

樸素貝葉斯

樸素貝葉斯是生成方法,也就是直接找出特徵輸出Y和特徵X的聯合分佈P(X,Y)P(X,Y),然後再利用P(YX)=P(X,Y)P(X)P(Y|X)=\frac{P(X,Y)}{P(X)}得出。


1. 相關的統計學知識

條件獨立公式,如果X和Y相互獨立:
P(X,Y)=P(X)P(Y) P(X,Y) = P(X)P(Y)
條件概率公式:
P(YX)=P(XY)P(X) P(Y|X) = \frac{P(X,Y)}{P(X)}
P(XY)=P(YX)P(Y) P(X|Y) = \frac{P(Y,X)}{ P(Y) }
P(YX)=P(XY)P(Y)P(X) P(Y|X) = P(X|Y)\frac{P(Y)}{P(X)}
全概率公式:
P(X)=kP(XY=Yk)P(Yk)kP(Yk)=1 P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1
貝葉斯公式:
P(YkX)=P(XYk)P(Yk)kP(XY=Yk)P(Yk) P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}


2.樸素貝葉斯模型

對於數據分析,假設分類模型的樣本是:
(x1(1),x2(1),...xn(1),y1),(x1(2),x2(2),...xn(2),y2),...(x1(m),x2(m),...xn(m),yn) (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)
即表示有m個樣本,每個樣本有n個特徵,特徵輸出有K個類別,定義爲:C1,C2,C3,......CKC_1, C_2, C_3,......C_K
從樣本中可以學習得到樸素貝葉斯的先驗分佈概率P(Y=Ci)(i=1,2,3,...K)P(Y=C_i)(i=1, 2,3,...K),接着可以學習到條件概率分佈P(X=xY=Ck)=P(X1=x1,X2=x2,...Xn=xnY=Ck)P(X=\mathcal{x}| Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k),然戶就可以利用貝葉斯公式可以得到X和Y的聯合概率分佈P(X,Y)P(X,Y),聯合概率分佈定義爲P(X,Y)P(X,Y):
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ P(X,Y=C_k) &=…
上面的式子可以看出:雖然條件分佈的求解被簡化了,但是也帶來了預測的不準確性,如果特徵之間非常不獨立,那就儘量避免使用樸素貝葉斯模型,對於一般情況下,樣本的各個特徵之間相互獨立這個條件是弱成立的,尤其在數據量非常大的時候,雖然樸素貝葉斯模型犧牲了準確性,但是卻帶來了計算的簡化。
迴歸到需要解決的問題,問題是給定一個行的樣本特徵(x1(test),x2(test),...xn(test)(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)},需要解決的問題是判斷它屬於那個特徵。
對於貝葉斯模型,使用後驗概率最大化來判斷分類,只要計算出所有的K個條件概率P(Y=CkX=X(test))P(Y=C_k|X=X^{(test)}),然後找出最大的條件概率對應的類別,這就是樸素貝葉斯的預測了。


3. 樸素貝葉斯的推斷過程

需要預測的類別CresultC_{result}是使P(Y=CkX=X(test))P(Y=C_k|X=X^{(test)})最大化的類別,數學表達式爲:

\begin{align} C_{result}  & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align}

由於對於所有的類別計算P(Y=CkX=X(test))P(Y=C_k|X=X^{(test)})時,上式的分母是一樣的,都是P(X=X(test)P(X=X^{(test)},因此,預測公式可以簡化爲:
Cresult=argmaxCkP(X=X(test)Y=Ck)P(Y=Ck) C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k)
利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:
Cresult=argmaxCkP(Y=Ck)j=1nP(Xj=Xj(test)Y=Ck) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k)


4. 樸素貝葉斯的參數估計

上面可以得到只要我們求出P(Y=Ck)P(Xj=Xj(test)Y=Ck)(j=1,2,...n)P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n),通過比較就可以得到樸素貝葉斯的推斷結果,下面討論如何通過訓練集來計算這兩個概率:
對於P(Y=Ck)P(Y=C_k),通過極大似然估計很容易得到P(Y=Ck)P(Y=C_k)樣本類別CkC_k出現的頻率,即樣本類別CkC_k出現的次數mKm_K除以樣本總數mm
而對於P(Xj=Xj(test)Y=Ck)(j=1,2,...n)P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)取決於我們的先驗條件:

  1. 如果XjX_j是離散的值,可以假設XjX_j符合多項式分佈,這樣得到P(Xj=Xj(test)Y=Ck)P(X_j=X_j^{(test)}|Y=C_k)是在樣本類別CkC_k中,特徵Xj(test)X_j^{(test)}出現的頻率,即:
    P(Xj=Xj(test)Y=Ck)=mkjtestmk P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k}
    其中mkm_k爲樣本類別CkC_k總的特徵計數,而mkjtest爲類別爲CkC_k的樣本中,第j維特徵Xj(test)X^{(test)}_j出現的計數。
     某些時候,可能某些類別在樣本中沒有出現,這樣可能導致P(Xj=Xj(test)Y=Ck)P(X_j=X_j^{(test)}|Y=C_k)爲0,這樣會影響後驗的估計,爲了解決這種情況,我們引入了拉普拉斯平滑,即此時有:
     P(Xj=Xj(test)Y=Ck)=mkjtest+λmk+Ojλ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda}
     其中λ\lambda 爲一個大於0的常數,常常取爲1。OjO_j爲第j個特徵的取值個數。
     2. 如果XjX_j是非常稀疏的離散值,即表示各個特徵出現的概率很低,這個時候我們可以假設XjX_j符合伯努利分佈,即特徵XjX_j出現記爲1,不出現記爲0,即表示只要XjX_j出現即可,不關注XjX_j的出現次數,這樣得到的P(Xj=Xj(test)Y=Ck)P(X_j=X_j^{(test)}|Y=C_k)是在樣本類別CkC_k中,Xj(test)X_j^{(test)}出現的頻率。此時有:
     P(Xj=Xj(test)Y=Ck)=P(XjY=Ck)Xj(test)+(1P(XjY=Ck))(1Xj(test)) P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)})
     其中,Xj(test)X_j^{(test)}的取值爲0或者1。
     3. 如果XjX_j是連續值,我們通常取XjX_j的先驗概率爲正態分佈,即表示在樣本類別CkC_k中,XjX_j的這個值符合正態分佈。這樣的話,P(Xj=Xj(test)Y=Ck)P(X_j=X_j^{(test)}|Y=C_k)的概率分佈爲:
     KaTeX parse error: Invalid delimiter: '{"type":"ordgroup","mode":"math","loc":{"lexer":{"input":" P(X_j=X_j^{(test)}|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(X_j^{(test)} - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":71,"end":74},"body":[{"type":"atom","mode":"math","family":"open","loc":{"lexer":{"input":" P(X_j=X_j^{(test)}|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(X_j^{(test)} - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":72,"end":73},"text":"("}]}' after '\Bigg' at position 72: …a_k^2}}exp\Bigg{̲(̲}̲-\frac{(X_j^{(t…
     其中μkσk2\mu_k和\sigma_k^2正態分佈的期望和方差,可以通過極大似然估計求得。μk\mu_k爲在樣本類別CkC_k中,所有XjX_j的平均值。σk2\sigma^2_k爲在樣本類別CkC_k中,所有XjX-j的方差。對於一個連續的樣本值,帶入正態分佈的公式,就可以求出概率分佈了。

5. 樸素貝葉斯算法過程

我們假設訓練集爲m個樣本n個維度,如下:
(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),yn) (x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)
共有K個特徵輸出類別,分別爲C1,C2,...,CK{C_1,C_2,...,C_K},每個特徵輸出類別的樣本個數爲m1,m2,...,mK{m_1,m_2,...,m_K},在第k個類別中,如果是離散特徵,則特徵XjX_j各個類別取值爲mjlm_{jl}。其中ll取值爲1,2,...Sj1,2,...S_jXjX_j爲特徵jj不同的取值數。
輸出爲X(test)X^{(test)}的分類。
算法流程如下:
1. 如果沒有YY的先驗概率,則計算YYKK個先驗概率:P(Y=Ck)=(mk+λ)/(m+Kλ)P(Y=C_k) = (m_k+\lambda)/(m+K\lambda),否則P(Y=Ck)P(Y=C_k)爲輸入的先驗概率。
2. 分別計算第kk個類別的第j維特徵的第ll個個取值條件概率:P(Xj=xjlY=Ck)P(X_j=x_{jl}|Y=C_k)
2.1 如果是離散值:
P(Xj=xjlY=Ck)=mkjl+λmk+Sjλ P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda}
λ\lambda可以取值爲1,或者其他大於0的數字。
2.2 果是稀疏二項離散值:
P(Xj=xjlY=Ck)=P(jY=Ck)xjl+(1P(jY=Ck)(1xjl) P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl})
此時ll只有兩種取值。
2.3 如果是連續值不需要計算各個l的取值概率,直接求正態分佈的參數:
KaTeX parse error: Invalid delimiter: '{"type":"ordgroup","mode":"math","loc":{"lexer":{"input":" P(X_j=x_j|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(x_j - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":62,"end":65},"body":[{"type":"atom","mode":"math","family":"open","loc":{"lexer":{"input":" P(X_j=x_j|Y=C_k) = \\frac{1}{\\sqrt{2\\pi\\sigma_k^2}}exp\\Bigg{(}-\\frac{(x_j - \\mu_k)^2}{2\\sigma_k^2}\\Bigg{)} ","settings":{"displayMode":true,"throwOnError":true,"errorColor":"#cc0000","macros":{},"colorIsTextColor":false,"strict":"warn","maxSize":null,"maxExpand":1000,"allowedProtocols":["http","https","mailto","_relative"]},"tokenRegex":{}},"start":63,"end":64},"text":"("}]}' after '\Bigg' at position 63: …a_k^2}}exp\Bigg{̲(̲}̲-\frac{(x_j - \…
需要求出μk\mu_kσk2\sigma^2_kμk\mu_k爲在樣本類別CkC_k中,所有XjX_j的平均值。σk2\sigma_k^2爲在樣本CkC_k中,所有XjX_j的方差。

3. 對於實例X(test)X^{(test)},分別計算:
P(Y=Ck)j=1nP(Xj=xj(test)Y=Ck) P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k)

4. 確定實例X(test)X^{(test)}的分類結果CresultC_{result}:
Cresult=argmaxCkP(Y=Ck)j=1nP(Xj=Xj(test)Y=Ck) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k)
從上面的計算可以看出,沒有複雜的求導和矩陣運算,因此效率很高。


6. 樸素貝葉斯算法小結

樸素貝葉斯的主要優點有:

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

樸素貝葉斯的主要缺點有:

  1. 理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因爲樸素貝葉斯模型給定輸出類別的情況下,假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最爲良好。對於這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯性適度改進。
  2. 需要知道先驗概率,且先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。
  3. 由於我們是通過先驗和數據來決定後驗的概率從而決定分類,所以分類決策存在一定的錯誤率。
  4. 對輸入數據的表達形式很敏感。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章