[TOC] 更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:<a target="_blank" href="https://www.cnblogs.com/nickchen121/p/11686958.html">http://www.javashuo.com/article/p-vozphyqp-cm.html</a>html
樸素貝葉斯是基於貝葉斯公式與特徵條件獨立假設的分類方法(注:貝葉斯公式是數學定義,樸素貝葉斯是機器學習算法)。樸素貝葉斯基於輸入和輸入的聯合機率分佈,對於給定的輸入,利用貝葉斯公式求出後驗機率最大的輸出$y$。便可以總結爲如下三點python
假設如今有一個有兩個類別的鳶尾花數據集,而且已經知曉每一個數據的分類狀況,而且假設數據的分佈以下圖所示。算法
# 樸素貝葉斯引入圖例 from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt from sklearn import datasets %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') iris_data = datasets.load_iris() X = iris_data.data[0:100, [0, 1]] y = iris_data.target[0:100] plt.scatter(X[0:50, [0]], X[0:50, [1]], color='r', s=50, marker='o', label='山鳶尾') plt.scatter(X[50:100, [0]], X[50:100, [1]], color='b', s=50, marker='x', label='雜色鳶尾') plt.xlabel('花瓣長度(cm)', fontproperties=font) plt.ylabel('花瓣寬度(cm)', fontproperties=font) plt.legend(prop=font) plt.show()
![png](http://www.chenyoude.com/ml/02-27 樸素貝葉斯_6_0.png?x-oss-process=style/watermark)數據結構
如今假設有一個未知分類的鳶尾花數據$(x_1(花瓣長度),x_2(花瓣寬度))$,用$p_1(x_1,x_2)$表示樣本屬於山鳶尾(red)的機率,用$p_2(x_1,x_2)$表示屬於雜色鳶尾(blue)的機率,$p_1(x_1,x_2) + p_2(x_1,x_2) = 1$。機器學習
假設若是$p_1(x_1,x_2) > p_2(x_1,x_2)$則$(x_1,x_2)$爲山鳶尾,不然爲雜色鳶尾,即選擇機率高的類別做爲新樣本的分類結果。這就是貝葉斯決策理論的核心思想,選擇具備最高几率的決策。函數
若是使用條件機率來表示這個上述所說的分類,則能夠表示爲 $$ \begin{align} & p(red|x_1,x_2) > p(blue|x_1,x_2) \quad \text{樣本屬於山鳶尾} \ & p(red|x_1,x_2) < p(blue|x_1,x_2) \quad \text{樣本屬於雜色鳶尾} \end{align} $$ 即若是出現一個新樣本,假設數據集有$n$個特徵、$m$個分類,只須要計算這個樣本的 $$ arg,max,(p(red|x_1,x_2),p(blue|x_1,x_2)) $$ 若是隻有兩個特徵$x_1$和$x_2$,那麼計算並不會很難,按照條件公式計算便可,可是你有沒有想過若是有$n$特徵,$K$個分類呢?即計算 $$ \underbrace{arg,max}_{c_k},p(c_j|x_1,x_2,\ldots,x_n) \quad(k=1,2,\cdots,K) $$ 上述的計算量是很是大的,那麼咱們有沒有一種簡單的方法可以改善該公式呢?有是有必定有的,即樸素貝葉斯法。學習
假設現有一個訓練集有$K$個類別$c_1,c_2,\ldots,c_k$,$m$個樣例,每一個樣例有$n$個特徵,訓練集能夠表示爲 $$ ((x_1^{(1)},x_2^{(1)},\cdots,x_n^{(1)},y_1)(x_1^{(2)},x_2^{(2)},\cdots,x_n^{(2)},y_2),\cdots,(x_1^{(m)},x_2^{(m)},\cdots,x_n^{(m)},y_m)) $$ 從樣本中能夠獲得測試
樸素貝葉斯的先驗分佈爲$p(c_k) \quad (k=1,2,\ldots,K)$,網站
樸素貝葉斯的條件機率分佈爲$p(x_1,x_2,\ldots,x_n|c_k)$,人工智能
利用條件機率公式獲得$X$和$Y$的聯合分佈$p(X,Y)$ $$ \begin{align} p(X,Y) & = p((x_1,x_2,\ldots,x_n),c_k) \ & = p(c_k)p(x_1,x_2,\ldots,x_n|c_k) \ \end{align} $$
因爲$p(x_1,x_2,\ldots,x_n|c_k)$是一個$n$個維度的條件分佈,計算難度超級複雜,所以假設$X$的$n$個維度之間相互獨立(注:若是特徵之間有大部分不是獨立存在的,則應該儘可能不要使用樸素貝葉斯模型,而應該考慮使用其餘的分類方法),則能夠把這個$n$維的條件分佈改寫成 $$ p(x_1,x_2,\ldots,x_n|c_k) = p(x_1|c_k)p(x_2|c_k)\cdots{p(x_n|c_k)} $$ 雖然改寫後的聯合分佈計算更加簡單,可是因爲假設全部的特徵都是獨立的,所以會相應的下降預測的不許確性。
假設已經獲得了訓練集的$p(c_k)$和$p(x_j|c_k)$值,假設現有一個測試樣本$(x_{1},x_{2},\ldots,x_{n})$,則能夠根據貝葉斯公式求得$K$個分類$c_1,c_2,\ldots,c_k$各自的機率。 $$ \begin{align} p(c_k|x_{1},x_{2},\ldots,x_{n}) & = {\frac{p(x_{1},x_{2},\ldots,x_{n}|c_k)p(c_k)}{p(x_{1},x_{2},\ldots,x_{n})}} \ & = {\frac{p(x_{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)p(c_k)}} {p(x_{1},x_{2},\ldots,x_{n})}} \ \end{align} $$ 求得全部分類各自的機率以後,哪個分類的機率最大,則樣本屬於哪個分類。 $$ \begin{align} 樣本類別 & = max,(p(c_1|x_{1},x_{2},\ldots,x_{n}),p(c_2|x_{1},x_{2},\ldots,x_{n}),\cdots,p(c_k|x_{1},x_{2},\ldots,x_{n})) \ & = \underbrace{arg,max}{c_k},{\frac{p(x{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)}} {p(x_{1},x_{2},\ldots,x_{n})}} \ \end{align} $$ 其中$y = max,f(x)$表示$y$是$f(x)$中全部的值中最大的輸出;$y = arg,max f(x)$表示$y$是$f(x)$中,輸出的那個參數$t$。
因爲每個類別的機率公式的分子都是相同的,把分子去掉後則能夠把上述公式轉化爲樸素貝葉斯模型的基本公式 $$ \begin{align} 樣本類別 & = \underbrace{arg,max}{c_k} {p(x{1}|c_k)p(x_{2}|c_k)\cdots{p(x_{n}|c_k)p(c_k)}} \ & = \underbrace{arg,max}{c_k},p(c_k) \prod{j=1}^{n} p(x_{j}|c_k) \end{align} $$
樸素貝葉斯模型的基本公式爲 $$ 樣本類別 = \underbrace{arg,max}{c_k},p(c_k) \prod{j=1}^{n} p(x_{j}|c_k) $$ 其中$p(c_k)$經過極大似然估計很容易算出樣本類別$c_k$的出現頻率,假設$c_k$出現$m_k$次,則 $$ p(c_k) = {\frac{m_k}{m}} $$ 而對於$p(x_j|c_k)$,則須要考慮特徵值的取值與分佈狀況。
假設$x_j$是離散值,則能夠假設$x_j$符合多項式分佈,這種狀況下的$p(x_j|c_k)$是樣本類別$c_k$中特徵$x_j$出現的頻率,假設$x_j$在$c_k$中出現的次數爲$m_{k_j}$,則 $$ p(x_j|c_k) = {\frac {m_{k_j}} {m_k} } $$ 因爲假設全部特徵相互獨立,若是某個特徵沒有出如今某個類別中,則$p(x_j|c_k) = 0$會使分類產生誤差,通常採用貝葉斯估計解決該問題,即引入拉普拉斯平滑(Laplace smoothing),即 $$ p(x_j|c_k) = {\frac {m_{k_j} + \lambda} {m_k + S_j\lambda} } $$ 其中$\lambda\leq0$,當$\lambda=0$時爲最大似然估計;$\lambda=1$時稱爲拉普拉斯平滑,$S_j$爲第j個特徵能夠能取值的個數(注:因爲$x_j$是離散的值,$x_j$有可能出現屢次,而且每次出現的值可能不一樣)。
假設$x_j$是很是稀疏的離散值,即各個特徵出現的機率很低,這個時候能夠假設$x_j$符合伯努利分佈,即特徵$x_j$出現爲$1$,不出現爲$0$。則$p(x_j|c_k)$是$x_j$在樣本類別$c_k$中出現的頻率,則 $$ p(x_j|c_k) = p(x_j|c_k)x_j + (1- p(x_j|c_k))(1-x_j) $$
假設$x_j$是連續值,則假設$x_j$符合高斯分佈(正態分佈),則能夠把$x_j$直接帶入正態分佈公式,便可得 $$ p(x_j|c_k) = {\frac {1} {\sqrt{2\pi\sigma_k^2}} } exp (-{\frac {(x_j - \mu_{k})^2} {2\sigma_k^2}}) $$ 其中$\mu_k$是全部$x_j$的指望值,$\sigma_k^2$是全部$x_j$的方差
多項式樸素貝葉斯(Multinomial Naive Bayes)特徵值符合多項式分佈,多用於高維度向量分類,即樣本特徵爲多元離散值,所以最經常使用於文章分類。
from sklearn.naive_bayes import MultinomialNB
伯努利樸素貝葉斯(Bernoulli Naive Bayes)特徵值符合伯努利分佈,針對布爾類型特徵值的向量作分類,即樣本特徵爲二元離散值,或者爲稀疏的多元離散值。
from sklearn.naive_bayes import BernoulliNB
高斯樸素貝葉斯(Gaussian Naive Bayes)特徵符合高斯分佈,多用於特徵值爲連續值,能夠利用高斯機率密度公式進行分類擬合。
from sklearn.naive_bayes import GaussianNB
有$m$個實例$n$維特徵的數據集 $$ T={(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)} $$ 其中$x_i$是第$i$個實例的特徵向量即$({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})$,${x_i}^{(j)} \quad(j=1,2,\cdots,n)$是第$i$個實例的第$j$個特徵,${x_i}^{(j)}\in{a_{j1},a_{j2},\cdots,a_{jS_j}}$,$a_{jl} \quad(l=1,2,\cdots,S_j)$是第$j$個特徵可能的第$l$個值,$y_i\in{c_1,c_2,\cdots,c_K}$,$c_k \quad (k=1,2,\cdots,K)$是第$k$個類;實例$x$。
實例$x$的類別。
樸素貝葉斯法是基於貝葉斯公式的一個理論,若是能記住貝葉斯公式並對機率論能提早有一個大概的瞭解,會更利於理解樸素貝葉斯法。
樸素貝葉斯法在可以很好地解決多分類問題,可是因爲它最大的缺點,即假設特徵都是獨立的,因此通常被用於文本分類,由於通常會認爲單詞與單詞之間都是相互獨立的。
下一篇將會介紹一個在深度學習流行以前在工業上最經常使用的分類器,即支持向量機。