c语言程序朴素贝叶斯分类器,生成式学习算法(四)之----朴素贝叶斯分类器
樸素貝葉斯分類器(算法)與樸素貝葉斯假設
在高斯判別分析模型(GDA)中,特征向量$ x$ 是連續(xù)實值向量。現(xiàn)在我們來討論分量$ x_j$ 取離散值的貝葉斯樸素貝葉斯模型。
在文本分類問題中,有一個問題是分出一個郵件是(\(y=1\) )或者不是(\(y=1\) )垃圾郵件。我們的訓練數(shù)據(jù)集是一些標好是否是垃圾郵件的郵件。現(xiàn)在我們首先需要把每個郵件表示成特征向量的形式。
假設我們有一個固定長度的詞表。這個詞表不包括一些在每個文檔中都出現(xiàn)的,高頻的對判別垃圾郵件沒有太大作用的停用詞。然后對于每一個郵件。可以用一個長度為詞表長度的0,1向量來表示。向量的分量$ x_j\(就表示這個詞表中的第\) j$項所代表的單詞是否出現(xiàn)在這個郵件中,0表示沒有出現(xiàn),1表示出現(xiàn)。
把每個郵件表示成0,1特征向量$ x$ 后,現(xiàn)在我們要對條件概率\(p(x | y)\) 進行建模。肯定不能用多項分布來建模,因為參數(shù)量太大了。比如我們的詞表長度為5000,特征向量的可能結果有$ 2^{5000}$ 種。用多項分布則需要確定$ 2^{5000}-1$ 個參數(shù)。因此,我們需要對模型做出一些簡化假設。
樸素貝葉斯假設就是其中一種簡化假設,在這個假設下得到的算法叫樸素貝葉斯分類器(算法)。雖然這個假設較強,但很多問題在這個假設下依然表現(xiàn)良好。樸素貝葉斯假設是指在給定\(y\) 的條件下,向量$ x$ 的各個分量$ x_j$ 取值是條件獨立的。具體的,給定C的情況下,A和B是條件獨立的是指$ p(A)=p(A|B,C)$ 。注意,這與A和B是獨立的不同。A與B獨立是指$ p(A)=p(A|B)$ 。在條件獨立假設下,我們可以簡化條件概率,將條件概率分解為如下形式,
\[
\begin{array}{l}
{p\left(x_{1}, \ldots, x_{n} | y\right)} \\
{\quad=p\left(x_{1} | y\right) p\left(x_{2} | y, x_{1}\right) p\left(x_{3} | y, x_{1}, x_{2}\right) \cdots p\left(x_{n} | y, x_{1}, \ldots, x_{n-1}\right)} \\ {\quad=p\left(x_{1} | y\right) p\left(x_{2} | y\right) p\left(x_{3} | y\right) \cdots p\left(x_{n} | y\right)} \\
{\quad=\prod_{j=1}^{n} p\left(x_{j} | y\right)}
\end{array}
\]
從現(xiàn)在起,我們應該把特征$x $ 看成是一個固定的東西。則模型的參數(shù)有垃圾郵件的先驗概率\(\phi_{y}=p(y=1)\) ,以及每個特征分量下的兩個參數(shù)\(\phi_{j | y=1}=p\left(x_{j}=1 | y=1\right)\) ,和 \(\phi_{j | y=0}=p\left(x_{j}=1 | y=0\right)\)。比如 \(\phi_{j | y=1}=p\left(x_{j}=1 | y=1\right)\) 是垃圾郵件中這個特征所代表的單詞出現(xiàn)的概率。
然后我們在這些參數(shù)下可以寫出數(shù)據(jù)的似然函數(shù),
\[
\mathcal{L}\left(\phi_{y}, \phi_{j | y=0}, \phi_{j | y=1}\right)=\prod_{i=1}^{m} p\left(x^{(i)}, y^{(i)}\right)
\]
關于每組參數(shù)最大化,可以得到各個參數(shù)的如下估計,
\[
\begin{equation}
\begin{aligned}
\phi_{j | y=1} &=\frac{\sum_{i=1}^{m} 1\left\{x_{j}^{(i)}=1 \wedge y^{(i)}=1\right\}}{\sum_{i=1}^{m} 1\left\{y^{(i)}=1\right\}} \\
\phi_{j | y=0} &=\frac{\sum_{i=1}^{m} 1\left\{x_{j}^{(i)}=1 \wedge y^{(i)}=0\right\}}{\sum_{i=1}^{m} 1\left\{y^{(i)}=0\right\}} \\
\phi_{y} &=\frac{\sum_{i=1}^{m} 1\left\{y^{(i)}=1\right\}}{m}
\end{aligned}
\end{equation}
\]
比如參數(shù)\(\phi_{j | y=1}=p\left(x_{j}=1 | y=1\right)\) 的估計(不嚴格地,上面我們還用同一個符號來表示)其實就是垃圾郵件中這個特征所代表的單詞出現(xiàn)的頻率。
估計出這些參數(shù),來了一個新郵件,我們就可以做出如下預測,
\[
\begin{aligned}
p(y=1 | x) &=\frac{p(x | y=1) p(y=1)}{p(x)} \\
&=\frac{\left(\prod_{j=1}^{n} p\left(x_{j} | y=1\right)\right) p(y=1)}{\left(\prod_{j=1}^{n} p\left(x_{j} | y=1\right)\right) p(y=1)+\left(\prod_{j=1}^{n} p\left(x_{j} | y=0\right)\right) p(y=0)}
\end{aligned}
\]
不要害怕第二個分母里一坨東西,它只是計算了$ x$ 和$ y$ 的不同取值的聯(lián)合概率,然后歸一化。
之前我們說特征向量$ x$ 是0,1向量。可以自然推廣到特征向量取$k $ 個值的情況。對于連續(xù)的變量不是太服從多元正態(tài)分布時,可以將其離散化為$k $ 值離散特征向量,然后利用這個模型,也往往能取得比高斯判別分析模型更好的結果。
拉普拉斯平滑
2019年9月21日19:03:05
上面算法的一個最大問題就是對于在詞表中出現(xiàn)過,但訓練集中未出現(xiàn)過的單詞,計算出后驗概率0:0,無法判斷是垃圾郵件,還是非垃圾郵件。采用拉普拉斯平滑可以大大改善這個算法。
更廣泛一點來說,對于訓練集中沒有見到的事件,我們就估計它出現(xiàn)的概率為零,不是一個好的做法。對于一個取k個值的多項分布。把最大似然估計有,
\[
\phi_{j}=\frac{\sum_{i=1}^{m} 1\left\{z^{(i)}=j\right\}}{m}
\]
拉普拉斯平滑機制則在此基礎上在分母加$k $,分子加一,即,
\[
\phi_{j}=\frac{\sum_{i=1}^{m} 1\left\{z^{(i)}=j\right\}+1}{m+k}
\]
回到樸素貝葉斯參數(shù)估計上,再給定標簽$y $ 的情況下,表示詞出現(xiàn)與否的每個特征分量 $x_{j} $ 是一個二項分布,因此就有如下拉普拉斯平滑估計,
\[
\begin{aligned}
\phi_{j | y=1} &=\frac{\sum_{i=1}^{m}{ 1\left\{x_{j}^{(i)}=1 \wedge y^{(i)}=1\right\}}+1}{\sum_{i=1}^{m}{ 1\left\{y^{(i)}=1\right\}}+2} \\
\phi_{j | y=0} &=\frac{\sum_{i=1}^{m} 1\left\{x_{j}^{(i)}=1 \wedge y^{(i)}=0\right\}+1}{\sum_{i=1}^{m} 1\left\{y^{(i)}=0\right\}+2}
\end{aligned}
\]
注意,我們這里是對特征分量進行拉普拉斯平滑。標簽本身也是個二項分布,但一般不需要拉普拉斯平滑。
文本分類事件模型
雖然樸素貝葉斯算法在分類中一般表現(xiàn)較好,有一類算法在文本分類中可以表現(xiàn)得更好。
樸素貝葉斯用的是多元伯努利事件模型(multi-variate Bernoulli event model)。郵件發(fā)送者先一定概率決定發(fā)送垃圾郵件和非垃圾郵件,然后在給定條件概率下。獨立的以相應概率發(fā)送詞表中的每個單詞。
現(xiàn)在我們來看一下多項事件模型(multinomial event model)。他對每個郵件的特征表示與之前不同。他將第j個特征分量表示郵件中的第j個單詞(之前的是詞表中第j個單詞出現(xiàn)與否0,1變量)。這個特征分量取值于\(\{1, \ldots,|V|\}\),\(|V|\) 為詞表的大小。然后一個郵件由不固定長度的\(n\) 個詞組成。
在多項事件模型中,每個郵件是否是垃圾郵件產生方法和之前相同。在決定了郵件是否是垃圾郵件后,再根據(jù)相應的條件概率產生第一個單詞,注意是從多項分布中產生一個單詞,然后再獨立的產生第二個單詞,一直產生n個單詞。這里分布是多項分布,和之前的伯努利分布是不一樣的。
這個模型的參數(shù)同樣有垃圾郵件的先驗概率\(\phi_{y}=p(y=1)\) ,\(\phi_{k | y=0}=p\left(x_{j}=k | y=0\right)\) 和\(\phi_{k | y=1}=p\left(x_{j}=k | y=1\right)\) 。注意,我們這里假設不管哪一個位置j,產生此位置單詞的多項分布的參數(shù)都是一樣的(比較之前\(\phi_{j | y=0}=p\left(x_{j}=1 | y=0\right)\) ) 。
給定訓練集\(\left\{\left(x^{(i)}, y^{(i)}\right) ; i=1, \ldots, m\right\}\) ,其中\(zhòng)(x^{(i)}=\left(x_{1}^{(i)}, x_{2}^{(i)}, \dots, x_{n_{i}}^{(i)}\right)\),這里$n_{(i)} $ 是第${i} $ 個郵件的單詞個數(shù)。然后我們在這些參數(shù)下可以寫出數(shù)據(jù)的似然函數(shù),
\[
\begin{aligned}
\mathcal{L}\left(\phi_{y}, \phi_{k | y=0}, \phi_{k | y=1}\right) &=\prod_{i=1}^{m} p\left(x^{(i)}, y^{(i)}\right) \\
&=\prod_{i=1}^{m}\left(\prod_{j=1}^{n_{i}} p\left(x_{j}^{(i)} | y ; \phi_{k | y=0}, \phi_{k | y=1}\right)\right) p\left(y^{(i)} ; \phi_{y}\right)
\end{aligned}
\]
關于每組參數(shù)最大化,可以得到各個參數(shù)的如下估計,
\[
\begin{aligned} \phi_{k | y=1} &=\frac{\sum_{i=1}^{m} \sum_{j=1}^{n_{i}} 1\left\{x_{j}^{(i)}=k \wedge y^{(i)}=1\right\}}{\sum_{i=1}^{m} 1\left\{y^{(i)}=1\right\} n_{i}} \\ \phi_{k | y=0} &=\frac{\sum_{i=1}^{m} \sum_{j=1}^{n_{i}} 1\left\{x_{j}^{(i)}=k \wedge y^{(i)}=0\right\}}{\sum_{i=1}^{m} 1\left\{y^{(i)}=0\right\} n_{i}}
\end{aligned}
\]
如果我們用拉普拉斯平滑,標簽$y $ 的情況下,表示第 $j $ 個位置哪個詞出現(xiàn)的特征分量 $x_{j} $ 是一個多項分布(取值個數(shù) \(|V|\) ),因此就有如下拉普拉斯平滑估計,
\[
\begin{aligned}
\phi_{k | y=1} &=\frac{\sum_{i=1}^{m} \sum_{j=1}^{n_{i}} 1\left\{x_{j}^{(i)}=k \wedge y^{(i)}=1\right\}+1}{\sum_{i=1}^{m} 1\left\{y^{(i)}=1\right\} n_{i}+|V|} \\
\phi_{k | y=0} &=\frac{\sum_{i=1}^{m} \sum_{j=1}^{n_{i}} 1\left\{x_{j}^{(i)}=k \wedge y^{(i)}=0\right\}+1}{\sum_{i=1}^{m} 1\left\{y^{(i)}=0\right\} n_{i}+|V|}
\end{aligned}
\]
盡管樸素貝葉斯算法可能不是最好的,但它通常都有不俗的表現(xiàn)。由于這個算法實現(xiàn)起來簡單明了。絕對是首先值得一試的算法。
關于找一找教程網
本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
本站提供了軟件編程、網站開發(fā)技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
[生成式學習算法(四)之----樸素貝葉斯分類器]http://www.zyiz.net/tech/detail-91587.html
總結
以上是生活随笔為你收集整理的c语言程序朴素贝叶斯分类器,生成式学习算法(四)之----朴素贝叶斯分类器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的gromacs模拟分子运动,
- 下一篇: c语言中头结点不为零怎么写,C语言不带表