在全部的機器學習分類算法中,樸素貝葉斯和其餘絕大多數的分類算法都不一樣。對於大多數的分類算法,好比決策樹,KNN,邏輯迴歸,支持向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函數\(Y=f(X)\),要麼是條件分佈\(P(Y|X)\)。可是樸素貝葉斯倒是生成方法,也就是直接找出特徵輸出Y和特徵X的聯合分佈\(P(X,Y)\),而後用\(P(Y|X) = P(X,Y)/P(X)\)得出。算法
樸素貝葉斯很直觀,計算量也不大,在不少領域有普遍的應用,這裏咱們就對樸素貝葉斯算法原理作一個小結。微信
在瞭解樸素貝葉斯的算法以前,咱們須要對相關必須的統計學知識作一個回顧。機器學習
貝葉斯學派很古老,可是從誕生到一百年前一直不是主流。主流是頻率學派。頻率學派的權威皮爾遜和費歇爾都對貝葉斯學派不屑一顧,可是貝葉斯學派硬是憑藉在現代特定領域的出色應用表現爲本身贏得了半壁江山。函數
貝葉斯學派的思想能夠歸納爲先驗機率+數據=後驗機率。也就是說咱們在實際問題中須要獲得的後驗機率,能夠經過先驗機率和數據一塊兒綜合獲得。數據你們好理解,被頻率學派攻擊的是先驗機率,通常來講先驗機率就是咱們對於數據所在領域的歷史經驗,可是這個經驗經常難以量化或者模型化,因而貝葉斯學派大膽的假設先驗分佈的模型,好比正態分佈,beta分佈等。這個假設通常沒有特定的依據,所以一直被頻率學派認爲很荒謬。雖然難以從嚴密的數學邏輯裏推出貝葉斯學派的邏輯,可是在不少實際應用中,貝葉斯理論很好用,好比垃圾郵件分類,文本分類。性能
咱們先看看條件獨立公式,若是X和Y相互獨立,則有:學習
\[ P(X,Y) =P(X)P(Y) \]測試
咱們接着看看條件機率公式:spa
\[ P(Y|X) = P(X,Y)/P(X) \]code
\[ 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)} \]
從統計學知識回到咱們的數據分析。假如咱們的分類模型樣本是:
\[ (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)})\),而後找出最大的條件機率對應的類別,這就是樸素貝葉斯的預測了。
上節咱們已經對樸素貝葉斯的模型也預測方法作了一個大概的解釋,這裏咱們對樸素貝葉斯的推斷過程作一個完整的詮釋過程。
咱們預測的類別\(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) \]
在上一節中,咱們知道只要求出\(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\)的方差。對於一個連續的樣本值,帶入正態分佈的公式,就能夠求出機率分佈了。
咱們假設訓練集爲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) \]
從上面的計算能夠看出,沒有複雜的求導和矩陣運算,所以效率很高。
樸素貝葉斯算法的主要原理基本已經作了總結,這裏對樸素貝葉斯的優缺點作一個總結。
樸素貝葉斯的主要優勢有:
1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤爲是數據量超出內存時,咱們能夠一批批的去增量訓練。
3)對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。
樸素貝葉斯的主要缺點有:
1) 理論上,樸素貝葉斯模型與其餘分類方法相比具備最小的偏差率。可是實際上並不是老是如此,這是由於樸素貝葉斯模型給定輸出類別的狀況下,假設屬性之間相互獨立,這個假設在實際應用中每每是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果很差。而在屬性相關性較小時,樸素貝葉斯性能最爲良好。對於這一點,有半樸素貝葉斯之類的算法經過考慮部分關聯性適度改進。
2)須要知道先驗機率,且先驗機率不少時候取決於假設,假設的模型能夠有不少種,所以在某些時候會因爲假設的先驗模型的緣由致使預測效果不佳。
3)因爲咱們是經過先驗和數據來決定後驗的機率從而決定分類,因此分類決策存在必定的錯誤率。
4)對輸入數據的表達形式很敏感。 以上就是樸素貝葉斯算法的一個總結,但願能夠幫到朋友們。 (歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121) ```