樸素貝葉斯演算法原理小結

劉建平Pinard發表於2016-11-16

    在所有的機器學習分類演算法中,樸素貝葉斯和其他絕大多數的分類演算法都不同。對於大多數的分類演算法,比如決策樹,KNN,邏輯迴歸,支援向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函式$Y=f(X)$,要麼是條件分佈$P(Y|X)$。但是樸素貝葉斯卻是生成方法,也就是直接找出特徵輸出Y和特徵X的聯合分佈$P(X,Y)$,然後用$P(Y|X) = P(X,Y)/P(X)$得出。

    樸素貝葉斯很直觀,計算量也不大,在很多領域有廣泛的應用,這裡我們就對樸素貝葉斯演算法原理做一個小結。

1. 樸素貝葉斯相關的統計學知識

    在瞭解樸素貝葉斯的演算法之前,我們需要對相關必須的統計學知識做一個回顧。

    貝葉斯學派很古老,但是從誕生到一百年前一直不是主流。主流是頻率學派。頻率學派的權威皮爾遜和費歇爾都對貝葉斯學派不屑一顧,但是貝葉斯學派硬是憑藉在現代特定領域的出色應用表現為自己贏得了半壁江山。

    貝葉斯學派的思想可以概括為先驗概率+資料=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和資料一起綜合得到。資料大家好理解,被頻率學派攻擊的是先驗概率,一般來說先驗概率就是我們對於資料所在領域的歷史經驗,但是這個經驗常常難以量化或者模型化,於是貝葉斯學派大膽的假設先驗分佈的模型,比如正態分佈,beta分佈等。這個假設一般沒有特定的依據,因此一直被頻率學派認為很荒謬。雖然難以從嚴密的數學邏輯裡推出貝葉斯學派的邏輯,但是在很多實際應用中,貝葉斯理論很好用,比如垃圾郵件分類,文字分類。

    我們先看看條件獨立公式,如果X和Y相互獨立,則有:

$$P(X,Y) =P(X)P(Y)$$

    我們接著看看條件概率公式:

$$P(Y|X) = P(X,Y)/P(X)$$

$$P(X|Y) = P(X,Y)/P(Y)$$

或者說:

$$ P(Y|X) = P(X|Y)P(Y)/P(X)$$

接著看看全概率公式

$$P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1$$

從上面的公式很容易得出貝葉斯公式:

$$P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}$$

 2. 樸素貝葉斯的模型

    從統計學知識回到我們的資料分析。假如我們的分類模型樣本是:$$(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_m)$$

    即我們有m個樣本,每個樣本有n個特徵,特徵輸出有K個類別,定義為${C_1,C_2,...,C_K}$。

    從樣本我們可以學習得到樸素貝葉斯的先驗分佈$P(Y=C_k)(k=1,2,...K)$,接著學習到條件概率分佈$P(X=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)定義為:

$$ \begin{align} P(X,Y=C_k)  &= P(Y=C_k)P(X=x|Y=C_k) \\&= P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \end{align}$$

    從上面的式子可以看出$ P(Y=C_k)$比較容易通過最大似然法求出,得到的$ P(Y=C_k)$就是類別$C_k$在訓練集裡面出現的頻數。但是$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$很難求出,這是一個超級複雜的有n個維度的條件分佈。樸素貝葉斯模型在這裡做了一個大膽的假設,即X的n個維度之間相互獨立,這樣就可以得出:

$$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k)$$

    從上式可以看出,這個很難的條件分佈大大的簡化了,但是這也可能帶來預測的不準確性。你會說如果我的特徵之間非常不獨立怎麼辦?如果真是非常不獨立的話,那就儘量不要使用樸素貝葉斯模型了,考慮使用其他的分類方法比較好。但是一般情況下,樣本的特徵之間獨立這個條件的確是弱成立的,尤其是資料量非常大的時候。雖然我們犧牲了準確性,但是得到的好處是模型的條件分佈的計算大大簡化了,這就是貝葉斯模型的選擇。

    最後回到我們要解決的問題,我們的問題是給定測試集的一個新樣本特徵$(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}$,我們如何判斷它屬於哪個型別?

    既然是貝葉斯模型,當然是後驗概率最大化來判斷分類了。我們只要計算出所有的K個條件概率$P(Y=C_k|X=X^{(test)})$,然後找出最大的條件概率對應的類別,這就是樸素貝葉斯的預測了。

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

    上節我們已經對樸素貝葉斯的模型也預測方法做了一個大概的解釋,這裡我們對樸素貝葉斯的推斷過程做一個完整的詮釋過程。

    我們預測的類別$C_{result}$是使$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=C_k|X=X^{(test)})$時,上式的分母是一樣的,都是$P(X=X^{(test)}$,因此,我們的預測公式可以簡化為:

$$  C_{result}  = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) $$   

    接著我們利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:

$$  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=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,我們通過比較就可以得到樸素貝葉斯的推斷結果。這一節我們就討論怎麼通過訓練集計算這兩個概率。

    對於$P(Y=C_k)$,比較簡單,通過極大似然估計我們很容易得到$P(Y=C_k)$為樣本類別$C_k$出現的頻率,即樣本類別$C_k$出現的次數$m_k$除以樣本總數m。

    對於$P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,這個取決於我們的先驗條件:

 

    a) 如果我們的$X_j$是離散的值,那麼我們可以假設$X_j$符合多項式分佈,這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,特徵$X_j^{(test)}$出現的頻率。即:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k}$$

    其中$m_k$為樣本類別$C_k$總的特徵計數,而$m_{kj^{test}}$為類別為$C_k$的樣本中,第j維特徵$X_j^{(test)}$出現的計數。

    某些時候,可能某些類別在樣本中沒有出現,這樣可能導致$P(X_j=X_j^{(test)}|Y=C_k)$為0,這樣會影響後驗的估計,為了解決這種情況,我們引入了拉普拉斯平滑,即此時有:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda}$$   

    其中$\lambda$ 為一個大於0的常數,常常取為1。$O_j$為第j個特徵的取值個數。

 

    b)如果我們我們的$X_j$是非常稀疏的離散值,即各個特徵出現概率很低,這時我們可以假設$X_j$符合伯努利分佈,即特徵$X_j$出現記為1,不出現記為0。即只要$X_j$出現即可,我們不關注$X_j$的次數。這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,$X_j^{(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)})$$

    其中,$X_j^{(test)}$取值為0和1。

  

    c)如果我們我們的$X_j$是連續值,我們通常取$X_j$的先驗概率為正態分佈,即在樣本類別$C_k$中,$X_j$的值符合正態分佈。這樣$P(X_j=X_j^{(test)}|Y=C_k)$的概率分佈是:

$$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{)}$$

    其中$\mu_k和\sigma_k^2$是正態分佈的期望和方差,可以通過極大似然估計求得。$\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。對於一個連續的樣本值,帶入正態分佈的公式,就可以求出概率分佈了。

5.  樸素貝葉斯演算法過程

    我們假設訓練集為m個樣本n個維度,如下:

$$(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_m)$$

    共有K個特徵輸出類別,分別為${C_1,C_2,...,C_K}$,每個特徵輸出類別的樣本個數為${m_1,m_2,...,m_K}$,在第k個類別中,如果是離散特徵,則特徵$X_j$各個類別取值為$m_{jl}$。其中l取值為$1,2,...S_j$,$S_j$為特徵j不同的取值數。

    輸出為例項$X^{(test)}$的分類。

    演算法流程如下:

    1) 如果沒有Y的先驗概率,則計算Y的K個先驗概率:$P(Y=C_k) = (m_k+\lambda)/(m+K\lambda)$,否則$P(Y=C_k)$為輸入的先驗概率。

    2) 分別計算第k個類別的第j維特徵的第l個個取值條件概率:$P(X_j=x_{jl}|Y=C_k)$

      a)如果是離散值:

$$P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda}$$

      $\lambda$可以取值為1,或者其他大於0的數字。

      b)如果是稀疏二項離散值:$$P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) $$

       此時$l$只有兩種取值。

      c)如果是連續值不需要計算各個l的取值概率,直接求正態分佈的引數:

$$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{)}$$

      需要求出$\mu_k和\sigma_k^2$。 $\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。

    3)對於例項$X^{(test)}$,分別計算:

$$P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) $$

    4)確定例項$X^{(test)}$的分類$C_{result}$

$$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)對輸入資料的表達形式很敏感。
 
    以上就是樸素貝葉斯演算法的一個總結,希望可以幫到朋友們。
 
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章