朴素贝叶斯的核心基础理论就是贝叶斯理论和条件独立性假设,在文本数据分析中应用比较成功。朴素贝叶斯分类器实现起来非常简单,虽然其性能经常会被支持向量机等技术超越,但有时也能发挥出惊人的效果。所以,在将朴素贝叶斯排除前,最好先试试,大家常将其作为一个比较的基准线。本文会结合垃圾邮件分来来详解朴素贝叶斯,紧跟其后的是朴素贝叶斯的两种变形。文章整体划分为三个部分,1)Bernoulli型朴素贝叶斯;2)Laplace平滑;3)多项分布型朴素贝叶斯模型;4)朴素贝叶斯模型在连续型数据中的应用。
Bernoulli型朴素贝叶斯
对于垃圾邮件分类问题,我们的目标就是建立一个分类器模型,使其能够判定接受到的邮件是否为垃圾邮件。很显然,这是个二分类问题,我们定义邮件的标签(label)信息\(y\in\{0,1\}\),垃圾邮件对应\(y=1\),正常邮件对应\(y=0\)。邮件的主体信息只是由一系列单词组成的文本,我们如何用向量\(x\)来表示它的特征? 常见的方法就是基于现有的文本集合,经过预处理后,从中挑选出较为关键的单词组成词典(Vocabulary)。建好词典后,我们扫描每个文本,然后将文本中出现在词典中的单词以词频等形式编码到特征向量中。这里的词典与我们平时用的词典不一样,主要是基于已有的文本集合的单词集合建立的,更贴近于已有数据,还能考虑很多词典中没有的怪异单词。 在Bernoulli型朴素贝叶斯中,我们扫描整个词典,如果词典中的第\(i\)个单词出现在给定文本中,我们设定\(x_i=1\),否则设定\(x_i=0\)。最后,我们就得到了一个与词典等长的特征表示\(x\in\{0,1\}^{n}\),如下图所示。
有人看了文本的特征表示后可能会想\(x\in\{0,1\}^{n}\)意味着\(x\)最多有\(2^n\)种情况,是不是也可以用多项分布来表示?理论上式可行的,但实际上这绝对不是个行得通的方案。因为在实际应用中,词典的规模通常比较大,一般都是以万为单位的,那么多项分布的模型参数计算机是无法承受的。 在朴素贝叶斯中,我们提出了一个很强的假设为\(p(x|y)\)建模,即在给定\(y\)的情况下,所有\(x_i\)都是独立的,称之为条件独立(conditionally independent)。该假设称为朴素贝叶斯假设,由此得出的算法则称为朴素贝叶斯分类器。用数学形式可描述成如下形式: \begin{equation} \begin{array}{rl} p(x|y)&=p(x_1,x_2,\cdots,x_{n}|y)\\ &=p(x_1|y)p(x_2|y,x_1)\cdots p(x_{n}|y,x_1,\cdots,x_{n-1})\\ &=p(x_1|y)p(x_2|y)p(x_3|y)\cdots p(x_{n}|y)\\ &=\prod_{i=1}^{n}p(x_i|y) \end{array} \end{equation} 其中,第一步到第二步是根据概率论中的链式法则(Chain Rule);第二步到第三步是根据朴素贝叶斯假设。 我们举个例子来说明朴素贝叶斯的假设。比如第\(1089\)个单词"buy"和第\(3873\)个单词"price"同时出现在垃圾邮件中,我们假设如果你已经知道这是一封垃圾邮件,那么第\(1089\)个单词是否出现丝毫不影响你对第\(3873\)个单词是否出现的确定程度,即\(p(x_{3873}|y)=p(x_{3873}|y,x_{1089})\)。\(x_{1089}\)与\(x_{3873}\)相互独立则表示成\(p(x_{3873})=p(x_{3873}|x_{1089})\),这和前面的条件独立不是同一个概念。很显然这个假设在大多数情况下都是不成立的,但是朴素贝叶斯算法在文本分类的问题中往往非常奏效。我们可以这样想,邮件是以这样的方式产生的:首先,发送者根据概率\(p(y)\)随机决定一封邮件是否为垃圾邮件;然后,发送者扫描整个词典,每次根据概率\(p(x_i=1|y)\)随机决定是否把\(x_i\)对应的单词放到邮件中,并且单词的选择之间是互不影响的;最后,这封邮件产生的概率就为\(\prod_{i=1}^{n}p(x_i|y)\)。 朴素贝叶斯模型包含的参数有\(\phi_y=p(y=1)\),\(\phi_{i|y=1}=p(x_i=1|y=1)\),\(\phi_{i|y=0}=p(x_i=1|y=0)\)。给定\(m\)个样本组成的训练集\(\{(x^{(i)},y^{(i)});i=1,2,\cdots,m\}\),其似然函数形式如下: \begin{equation} \ell(\phi_y,\phi_{i|y=0},\phi_{i|y=1})=\prod_{i=1}^mp(x^{(i)},y^{(i)}) \end{equation} 为了便于计算,将其转化为对数形式 \begin{equation} \mathcal{L}(\phi_y,\phi_{i|y=0},\phi_{i|y=1})=\sum_{i=1}^m\log p(x^{(i)}|y^{(i)})+\log P(y^{(i)}) \end{equation} 其中 \begin{equation} p(y^{(i)})=\phi_y^{y{(i)}}(1-\phi_y)^{1-y^{(i)}} \end{equation} \begin{equation} p(x^{(i)}|y^{(i)})=\prod_{j=1}^np(x_j^{(i)}|y^{(i)}) \end{equation} \begin{equation} \begin{array}{cl} p(x_j^{(i)}|y^{(i)})=&\left(\phi_{j|y=0}^{1\{x_j^{(i)}=1\}}(1-\phi_{j|y=0})^{1-1\{x_j^{(i)}=1\}}\right)^{1\{y^{(i)}=0\}}\\ &\cdot\left(\phi_{j|y=1}^{1\{x_j^{(i)}=1\}}(1-\phi_{j|y=1})^{1-1\{x_j^{(i)}=1\}}\right)^{1\{y^{(i)}=1\}} \end{array} \end{equation} 将上述三个等式带入对数似然函数\(\mathcal{L}\)中可得 \begin{equation} \begin{array}{rl} &\mathcal{L}(\phi_y,\phi_{i|y=0},\phi_{i|y=1})\\ =&\sum_{i=1}^m\left(\sum_{j=1}^n1\{y^{(i)}=0\}\left(1\{x_j^{(i)}=1\}\log \phi_{j|y=0}\right.\right.\\ &\left.+(1-1\{x_j^{(i)}=1\})\log(1-\phi_{j|y=0})\right)\\ &+1\{y^{(i)}=1\}\left(1\{x_j^{(i)}=1\}\log \phi_{j|y=1}\right.\\ &\left.\left.+(1-1\{x_j^{(i)}=1\})\log(1-\phi_{j|y=1})\right)\right)\\ &+y^{(i)}\log\phi_y+(1-y^{(i)})\log(1-\phi_y) \end{array} \end{equation} 利用似然函数的对数形式对各参数求偏导,并令偏导为0,可得: \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_y}&=\sum_{i=1}^m\frac{y^{(i)}}{\phi_y}-\frac{1-y^{(i)}}{1-\phi_y}\\ &=\sum_{i=1}^m\frac{y^{(i)}-\phi_y}{\phi_y(1-\phi_y)}=0\\ &\Rightarrow\phi_y=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}}{m} \end{array} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_{j|y=0}}&=\sum_{i=1}^m1\{y^{(i)}=0\}\left(\frac{1\{x_j^{(i)}=1\}}{\phi_{j|y=0}}-\frac{1-1\{x_j^{(i)}=1\}}{1-\phi_{j|y=0}}\right)\\ &=\sum_{i=1}^m\frac{1\{y^{(i)}=0\}\left(1\{x_j^{(i)}=1\}-\phi_{j|y=0}\right)}{\phi_{j|y=0}(1-\phi_{j|y=0})}=0\\ &\Rightarrow\phi_{i|y=0}=\frac{\sum_{i=1}^m1\{x^{(i)}=1\&\&y^{(i)}=0\}}{\sum_{i=1}^m1\{y^{(i)}=0\}} \end{array} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_{j|y=1}}&=\sum_{i=1}^m1\{y^{(i)}=1\}\left(\frac{1\{x_j^{(i)}=1\}}{\phi_{j|y=1}}-\frac{1-1\{x_j^{(i)}=1\}}{1-\phi_{j|y=1}}\right)\\ &=\sum_{i=1}^m\frac{1\{y^{(i)}=1\}\left(1\{x_j^{(i)}=1\}-\phi_{j|y=1}\right)}{\phi_{j|y=1}(1-\phi_{j|y=1})}=0\\ &\Rightarrow\phi_{i|y=1}=\frac{\sum_{i=1}^m1\{x^{(i)}=1\&\&y^{(i)}=1\}}{\sum_{i=1}^m1\{y^{(i)}=1\}} \end{array} \end{equation} 学习到上述参数后,对特征向量为\(x\)的新样本进行预测也就很简单了 \begin{equation} \hat{y}=\underset{y\in\{0,1\}}{\arg\max}\;p(y|x)=\underset{y\in\{0,1\}}{\arg\max}\left(p(y)\prod_{j=1}^np(x_j|y)\right) \end{equation} 由于概率值的范围为\([0,1]\),多个概率值相乘后的结果可能会非常小,以致于计算机将其视为0来处理。为了避免这种情况,我们用上式的对数形式来进行等价表示 \begin{equation} \hat{y}=\underset{y\in\{0,1\}}{\arg\max}\;p(y|x)=\underset{y\in\{0,1\}}{\arg\max}\left(\log p(y)+\sum_{j=1}^n\log p(x_j|y)\right) \end{equation} Bernoulli型朴素贝叶斯只考虑了词典中的词是否出现,所以该方法适应于单词出现的次数不是重点但是否出现最为关键的分类问题。比如,在情感分类问题中,“心烦”、“伤心”等词的出现次数并不是非常重要,只要文中出现了这类表达负面情绪的词汇,我们就可以判定用户心情不太好。
Laplace平滑
上述理论存在一个瑕疵,实际中很可能出现词典中的第\(i\)个单词在训练集的某一类样本中压根没出现,或者词典中存在一些在所有训练样本中都没出现的单词。这样就会出现类条件概率\(p(x_i|y)=0\)的情形。如果用第一个判别准则,我们会发现仅仅由于这个小问题会引发模型的整体“失忆”,即所有其他的类条件概率\(p(x_j|y)=0\)与\(p(x_i|y)=0\)的乘积为0;如果用第二个判别准则,会出现未定义的计算\(\log 0\)。 举个简单的例子来说,假设我们现在要估算服从多项分布的随机变量\(z\in\{1,\cdots,k\}\)的均值,该多项分布的参数为\(\phi_i=p(z=i)\)。给定\(m\)个训练样本\(\{z^{(1)},\cdots,z^{(m)}\}\),利用最大似然估计出的参数为\(\phi_j=\sum_{i=1}^m1\{z^{(i)}=j\}/m\)。如果事件\(z^{(i)}=j\)在训练集中从未出现过,那么最终\(\phi_j=0\)。从统计学角度而言,仅仅因为在训练集中未看到特定事件的发生就将其出现概率置为0是很不合理的。 为了避免这个问题,我们引入Laplace平滑,即将上面的参数估计变成\(\phi_i=\left(\sum_{i=1}^m1\{z^{(i)}=j\}+1\right)/(m+k)\)。分子和分母都在原来统计的基础上加上了一个常数,也称为pseudo count,经过Laplace平滑后,\(\sum_{j=1}^k\phi_j=1\)仍然成立。回到朴素贝叶斯分类器,采用Laplace平滑后参数形式如下: \begin{equation} \phi_y=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}+1}{m+2} \end{equation} \begin{equation} \phi_{i|y=1}=\frac{\sum_{i=1}^m1\{x^{(i)}=1\&\&y^{(i)}=0\}+1}{\sum_{i=1}^m1\{y^{(i)}=0\}+2} \end{equation} \begin{equation} \phi_{i|y=0}=\frac{\sum_{i=1}^m1\{x^{(i)}=1\&\&y^{(i)}=0\}+1}{\sum_{i=1}^m1\{y^{(i)}=0\}+2} \end{equation}
多项分布型朴素贝叶斯
多项分布型的朴素贝叶斯和Bernoulli型朴素贝叶斯放在一起,很多人就犯迷糊了。两中方法看待问题的方式还是有很大区别的,而且应用场景也有各自的侧重点,要注意区分。 在多项分布型朴素贝叶斯中,邮件的特征表示就与Bernoulli型的朴素贝叶斯不同。假设我们有\(|V|\)个单词组成的词典,\(x_i\)表示邮件的第\(i\)个词,现在\(x_i\)的取值范围由\(\{0,1\}\)变成\(\{1,2,\cdots,|V|\}\)。最后,长度为\(n\)的邮件对应的特征向量为\((x_1,x_2,\cdots,x_n)\),因为每个邮件的长度\(n\)不同,所有邮件对应的特征向量的维度也会不同,如下图所示:
邮件的生成方式可以描述成:1)根据Bernoulli分布的概率值\(p(y)\)随机决定邮件是否为垃圾邮件;2)发送者根据多项分布概率值\(p(x_i|y)\)随机从词典中选取一个又一个单词,每次选取单词的事件是相互独立,直到组成长度为\(n\)的邮件。因此,一封邮件对应的概率表示成\(p(y)\prod_{i=1}^np(x_i|y)\)。这个描述过程和上面的Bernoulli型贝叶斯很相似,但是选词的方式发生了改变,前者是根据Bernoulli分布决定是否将词典中的某个词写入邮件中,后者是根据多项分布决定把词典中的哪一个词作为即将写入邮件的单词。 多项分布型朴素贝叶斯模型的参数:\(\phi_y=p(y=1)\),\(\phi_{i|y=0}=p(x_j=i|y=0)\),\(\phi_{i|y=1}=p(x_j=i|y=1)\)。其中\(j\)可以是集合\(\{1,2,\cdots,n\}\)中的任意值,也就是相同类别的邮件中的所有词都服从相同的多项分布,每个词的分布不受位置\(j\)的影响。模型中有如下的概率关系: \begin{equation} p(y)=\phi_y^y(1-\phi_y)^{1-y} \end{equation} \begin{equation} p(x|y)=\prod_{i=1}^np(x_i|y) \end{equation} \begin{equation} \begin{array}{rl} p(x_i|y)&=\left(\phi_{1|y=0}^{1\{x_i=1\}}\cdots\phi_{|V||y=0}^{1\{x_i=|V|\}}\right)^{1\{y=0\}}\left(\phi_{1|y=1}^{1\{x_i=1\}}\cdots\phi_{|V||y=1}^{1\{x_i=|V|\}}\right)^{1\{y=1\}}\\ &=\left(\prod_{k=1}^{|V|}\phi_{k|y=0}^{1\{x_i=k\}}\right)^{1\{y=0\}}\left(\prod_{k=1}^{|V|}\phi_{k|y=1}^{1\{x_i=k\}}\right)^{1\{y=1\}} \end{array} \end{equation} 给定\(m\)个样本组成的训练集\(\{(x^{(i)},y^{(i)}),i=1,\cdots,m\}\),其中\(y^{(i)}\in\{0,1\}\),\(x^{(i)}=\{x^{(i)}_1,\cdots,x^{(i)}_{n_i}\}\),\(n_i\)为第\(i\)个训练样本的单词总数。在该训练集上定义的似然函数如下: \begin{equation} \begin{array}{rl} &\ell(\phi_y,\phi_{k|y=0},\phi_{k|y=1})\\ =&\prod_{i=1}^mp(x^{(i)},y^{(i)})\\ =&\prod_{i=1}^m\left(\prod_{j=1}^{n_i}p(x_j^{(i)}|y^{(i)};\phi_{k|y=0},\phi_{i|y=1})\right)p(y^{(i)};\phi_y) \end{array} \end{equation} 考虑到存在约束条件\(\sum_{i=1}^{|V|}\phi_{k|y=0}=1\)和\(\sum_{i=1}^{|V|}\phi_{k|y=1}=1\),我们在似然函数的对数形式中引入Lagrange乘子\(\lambda_1,\lambda_2\),得到如下的Lagrange函数 \begin{equation} \begin{array}{rl} &\mathcal{L}(\phi_y,\phi_{k|y=1},\phi_{k|y=1})\\ =&\sum_{i=1}^m\left(\sum_{j=1}^{n_i}\log p(x^{(i)}_j|y^{(i)})+\log p(y^{(i)})\right)\\ &+\lambda_1\left(\sum_{k=1}^{|V|}\phi_{k|y=0}-1\right)+\lambda_2\left(\sum_{k=1}^{|V|}\phi_{k|y=1}-1\right)\\ =&\sum_{i=1}^m\left[\sum_{j=1}^{n_i}\left(1\{y^{(i)}=0\}\sum_{k=1}^{|V|}1\{x_j^{(i)}=k\}\log\phi_{k|y=0}\right.\right.\\ &\left.+1\{y^{(i)}=1\}\sum_{k=1}^{|V|}1\{x_j^{(i)}=k\}\log\phi_{k|y=1}\right)\\ &\left.+y^{(i)}\log\phi_y+\left(1-y^{(i)}\right)\log\left(1-\phi_y\right)\right]\\ &+\lambda_1\left(\sum_{k=1}^{|V|}\phi_{k|y=0}-1\right)+\lambda_2\left(\sum_{k=1}^{|V|}\phi_{k|y=1}-1\right) \end{array} \end{equation} 用最大似然的方法进行参数估计,Lagrange函数\(\mathcal{L}\)对各参数求偏导: \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_y}&=\sum_{i=1}^m\frac{y^{(i)}}{\phi_y}-\frac{1-y^{(i)}}{1-\phi_y}\\ &=\sum_{i=1}^m\frac{y^{(i)}-\phi_y}{\phi_y(1-\phi_y)}\\ &\Rightarrow\phi_y=\frac{\sum_{i=1}^my^{(i)}}{m}=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}}{m} \end{array} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_{k|y=0}}&=\sum_{i=1}^m\sum_{j=1}^{n_i}\frac{1\{x_j^{(i)}=k\&\&y^{(i)}=0\}}{\phi_{k|y=0}}+\lambda_1=0\\ &\Rightarrow\phi_{k|y=0}=-\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=0\}}{\lambda_1} \end{array} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_{k|y=1}}&=\sum_{i=1}^m\sum_{j=1}^{n_i}\frac{1\{x_j^{(i)}=k\&\&y^{(i)}=1\}}{\phi_{k|y=1}}+\lambda_2=0\\ &\Rightarrow\phi_{k|y=1}=-\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=1\}}{\lambda_2} \end{array} \end{equation} 又存在\(\sum_{k=1}^M\phi_{k|y=0}=1\)和\(\sum_{k=1}^M\phi_{k|y=1}=1\),结合上式,我们得到 \begin{equation} \lambda_1=-\sum_{i=1}^m\sum_{j=1}^{n_i}\sum_{k=1}^{|V|}1\{x_j^{(i)}=k\&\&y^{(i)}=0\}=-\sum_{i=1}^m1\{y^{(i)}=0\}n_i \end{equation} \begin{equation} \lambda_2=-\sum_{i=1}^m\sum_{j=1}^{n_i}\sum_{k=1}^{|V|}1\{x_j^{(i)}=k\&\&y^{(i)}=1\}=-\sum_{i=1}^m1\{y^{(i)}=1\}n_i \end{equation} 将求得的\(\lambda_1\)和\(\lambda_2\)带入上式,很容易求得 \begin{equation} \phi_{k|y=0}=\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=0\}}{\sum_{i=1}^m1\{y^{(i)}=0\}n_i} \end{equation} \begin{equation} \phi_{k|y=1}=\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=1\}}{\sum_{i=1}^m1\{y^{(i)}=1\}n_i} \end{equation} 观察求出来的参数,\(\phi_y\)很显然就是在训练数据中统计出来的垃圾邮件出现的频率;\(\phi_{k|y=1}\)的分母为所有垃圾邮件的总长度,分子为所有垃圾邮件中第\(k\)个单词出现的次数,总体求得的实际上就是第\(k\)个单词在垃圾邮件中出现的概率。 我们在此基础上加上Laplace平滑,得到如下形式的参数 \begin{equation} \phi_y=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}+1}{m+2} \end{equation} \begin{equation} \phi_{k|y=0}=\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=0\}+1}{\sum_{i=1}^m1\{y^{(i)}=0\}n_i+|V|} \end{equation} \begin{equation} \phi_{k|y=1}=\frac{\sum_{i=1}^m\sum_{j=1}^{n_i}1\{x_j^{(i)}=k\&\&y^{(i)}=1\}+1}{\sum_{i=1}^m1\{y^{(i)}=1\}n_i+|V|} \end{equation} 多项分布型朴素贝叶斯则考虑了词典中的每个单词在每类样本中的词频,所以它的应用场合更倾向于词频扮演重要角色的分类问题,比如主题分类问题(Topic Classification)。在主题分类问题中,出现次数太少的词很难主导整个文章的主体类型,但是如果某些词频繁出现,那么文章的主题既有可能和这些词相关。 求得模型参数后,可以确定先验概率\(p(y)\),给定特征为\(x\)的新样本,\(p(x|y)\)也很容易计算,最后的分类准则如下: \begin{equation} \hat{y}=\underset{y\in\{0,1\}}{\arg\max}\;p(y|x)=\underset{y\in\{0,1\}}{\arg\max}\left(\log p(y)+\sum_{j=1}^{n_i}\log p(x_j|y)\right) \end{equation}
朴素贝叶斯与连续型数据
前面我们说的两种朴素贝叶斯模型都只适应于离散型的数据,那么遇到连续型的数据该怎么处理?接下来同样介绍两种常用的方法:概率分布估计和离散化。 对于连续型数据,我们通常假设该数据在每类样本中都各自服从高斯分布\(\mathcal{N}(\mu_0,\sigma_0^2)\)和\(\mathcal{N}(\mu_1,\sigma_1^2)\)。当然,也可以根据实际情况给出更符合实际情况的概率分布模型,这里就以高斯模型为例。由于样本的每个属性都是条件独立的,所以每个属性都可以有不同的概率分布,如下图所示:
模型参数包括一个Bernoulli分布的参数\(\phi_y=p(y=1)\)和\(2n\)个Gauss模型对应的参数\(\mu_{j|y=0}\),\(\sigma_{j|y=0}\),\(\mu_{j|y=1}\),\(\sigma_{j|y=1}\)。模型中存在的概率关系如下: \begin{equation} p(y)=\phi_y^{y}(1-\phi_y)^{1-y} \end{equation} \begin{equation} p(x|y)=\prod_{i=1}^np(x_i|y) \end{equation} \begin{equation} \begin{array}{lr} p(x_i|y)&=\left(\frac{1}{\sqrt{2\pi\sigma_0^2}}\exp\left(-\frac{(x_i-\mu_0)^2}{2\sigma_0^2}\right)\right)^{1\{y=0\}}\\ &\cdot\left(\frac{1}{\sqrt{2\pi\sigma_1^2}}\exp\left(-\frac{(x_i-\mu_1)^2}{2\sigma_1^2}\right)\right)^{1\{y=1\}} \end{array} \end{equation} 假设我们有\(m\)个样本组成的训练集\(\{(x^{(i)},y^{(i)}),i=1,\cdots,m\}\),其中\(x^{(i)}\in\mathbb{R}^n\),\(y^{(i)}\in\{0,1\}\),得到如下的似然函数: \begin{equation} \begin{array}{rl} &\ell(\phi_y,\mu_{k|y=0},\sigma_{k|y=0}^2,\mu_{k|y=1},\sigma_{k|y=1}^2)\\ =&\prod_{i=1}^mp\left(x^{(i)},y^{(i)}\right)\\ =&\prod_{i=1}^m\left(\prod_{j=1}^np\left(x_j^{(i)}|y^{(i)}\right)\right)p(y^{(i)})\\ \end{array} \end{equation} 将上述似然函数转化为对数形式,方便后面求偏导 \begin{equation} \begin{array}{rl} &\mathcal{L}(\phi_y,\mu_{k|y=0},\sigma_{k|y=0}^2,\mu_{k|y=1},\sigma_{k|y=1}^2)\\ =&\sum_{i=1}^m\left(\sum_{j=1}^n\log p\left(x_j^{(i)}|y^{(i)}\right)+\log p\left(y^{(i)}\right)\right)\\ =&-\frac{1}{2}\sum_{i=1}^m\left[\sum_{j=1}^n1\{y^{(i)}=0\}\left(\frac{\left(x_j^{(i)}-\mu_{j|y=0}\right)^2}{\sigma_{j|y=0}^2}+\log\sigma_{j|y=0}^2\right)\right.\\ &\left.+1\{y^{(i)}=1\}\left(\frac{\left(x_j^{(i)}-\mu_{j|y=1}\right)^2}{\sigma_{j|y=1}^2}+\log\sigma_{j|y=1}^2\right)\right]\\ &\quad+y^{(i)}\log\phi_y+\left(1-y^{(i)}\right)\log(1-\phi_y)+const \end{array} \end{equation} 依然用最大似然估计所有参数,将上面的对数似然函数对各个参数求偏导 \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\phi_y}=&-\frac{1}{2}\sum_{i=1}^m\frac{y^{(i)}}{\phi_y}-\frac{1-y^{(i)}}{1-\phi_y}\\ =&\frac{1}{2}\sum_{i=1}^m\frac{\phi_y-y^{(i)}}{\phi_y(1-\phi_y)}=0\\ \Rightarrow&\phi_y=\frac{\sum_{i=1}^my^{(i)}}{m} \end{array} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\mu_{j|y=0}}&=-\sum_{i=1}^m1\{y^{(i)}=0\}\frac{\left(x_j^{(i)}-\mu_{j|y=0}\right)}{\sigma_{j|y=0}^2}=0\\ &\Rightarrow \mu_{j|y=0}=\frac{\sum_{i=1}^m1\{y^{(i)}=0\}x_j^{(i)}}{\sum_{i=1}^m1\{y^{(i)}=0\}} \end{array} \end{equation} 同理,可得 \begin{equation} \mu_{j|y=1}=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}x_j^{(i)}}{\sum_{i=1}^m1\{y^{(i)}=1\}} \end{equation} \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{L}}{\partial\sigma_{j|y=0}}&=\sum_{i=1}^m1\{y^{(i)}=0\}\left(\frac{\left(x_j^{(i)}-\mu_{j|y=0}\right)^2}{\sigma_{j|y=0}^3}-\frac{1}{\sigma_{j|y=0}}\right)=0\\ &\Rightarrow\sigma_{j|y=0}^2=\frac{\sum_{i=1}^m1\{y^{(i)}=0\}\left(x_j^{(i)}-\mu_{j|y=0}\right)^2}{\sum_{i=1}^m1\{y^{(i)}=0\}} \end{array} \end{equation} 同理,可得 \begin{equation} \sigma_{j|y=1}^2=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}\left(x_j^{(i)}-\mu_{j|y=1}\right)^2}{\sum_{i=1}^m1\{y^{(i)}=1\}} \end{equation} 仔细观察下上面求出的参数,我们很容易就能发现:\(\phi_y\)其实就训练集中正样本出现的频率;\(\mu_{j|y=0}\)和\(\mu_{j|y=0}\)分别是正负样本特征第\(j\)维的均值;\(\sigma_{j|y=0}^2\)和\(\sigma_{j|y=1}^2\)则分别是正负样本特征第\(j\)维的方差。有了模型参数,要判定新样本属于哪个类别,我们可以沿用前面的方法。 另外一种处理连续型数据的方法就是将其离散化(Discretization)为\(k\)个有限的离散值(一般\(k=10\)),然后应用朴素贝叶斯算法。如下表所示,用\(x_i\)表示月收入,我们也许会将其离散化为表中的形式。如果某个人的月收入为\(20K\),则对应的特征\(x_i=4\),然后用多项分布为\(p(x_i|y)\)建模。
现在假设我们有很多维联系的特征需要离散化处理,如下图所示:第一维数据被划分成两个区间,第二维数据被划分成四个区间,原始数据第一维和第二维分别落入第二个和第三个区间,那么离散化后的数值分别为2和3。
在这里,我们假设每一维数据都是连续数值,原始特征的第\(j\)维连续数据经离散化后变成了\(k_j\)个离散数值\(\{1,2,\cdots,k_j\}\),每个样本对应的标签信息\(y\in\{0,1\}\)。当然,这可以视为Bernoulli型朴素贝叶斯的扩展,因为这里第\(x_j\)的取值范围由\(\{0,1\}\)扩展到\(\{1,2,\cdots,k_j\}\)。很显然,我们应该用多项分布来为\(p(x_j|y)\)建模。与前面的多项分布型朴素贝叶斯也有不同,这里每一维特征服从不同的多项分布。模型包含的参数有\(\phi_y=p(y=1)\),\(\phi_{i=t|y=0}=p(x_i=t|y=0)\)和\(\phi_{i=t|y=1}=p(x_i=t|y=1)\)。模型中存在的概率关系有: \begin{equation} p(y)=\phi_y^{y}(1-\phi_y)^{1-y} \end{equation} \begin{equation} p(x|y)=\prod_{i=1}^np(x_i|y) \end{equation} \begin{equation} \begin{array}{rl} p(x_i|y)&=\left(\phi_{i=1|y=0}^{1\{x_i=1\}}\cdots\phi_{i=k_i|y=0}^{1\{x_i=k_i\}}\right)^{1\{y=0\}}\left(\phi_{i=1|y=1}^{1\{x_i=1\}}\cdots\phi_{i=k_i|y=1}^{1\{x_i=k_i\}}\right)^{1\{y=1\}}\\ &=\left(\prod_{t=1}^{k_i}\phi_{i=t|y=0}^{1\{x_i=k\}}\right)^{1\{y=0\}}\left(\prod_{t=1}^{k_i}\phi_{i=t|y=1}^{1\{x_i=k\}}\right)^{1\{y=1\}} \end{array} \end{equation} 对于\(m\)个样本组成的训练集\(\mathcal{S}=\{(x^{(i)},y^{(i)}),i=1,\cdots,m\}\),其中\(x^{(i)}\)为\(n\)维离散数值向量,\(y^{(i)}\in\{0,1\}\),\(x_j^{(i)}\in\{1,\cdots,k_i\}\),得到如下的似然函数: \begin{equation} \begin{array}{rl} &\ell(\phi_y,\phi_{i=t|y=0},\phi_{i=t|y=1})\\ =&\prod_{i=1}^mp\left(x^{(i)},y^{(i)}\right)\\ =&\prod_{i=1}^m\left(\prod_{j=1}^np\left(x_j^{(i)}|y^{(i)}\right)\right)p(y^{(i)})\\ \end{array} \end{equation} 将上面似然函数转化为对数形式 \begin{equation} \mathcal{L}(\phi_y,\phi_{i=t|y=0},\phi_{i=t|y=1}) =\sum_{i=1}^m\left(\sum_{j=1}^n\log p\left(x_j^{(i)}|y^{(i)}\right)+\log p\left(y^{(i)}\right)\right) \end{equation} 考虑到两个等式约束\(\sum_{t=1}^{k_j}\phi_{j=t|y=0}=1\)和\(\sum_{t=1}^{k_j}\phi_{j=t|y=1}=1\),在上式基础上引入Lagrange乘子\(\lambda_1\)和\(\lambda_2\) \begin{equation} \begin{array}{rl} &\mathcal{O}(\phi_y,\phi_{i=t|y=0},\phi_{i=t|y=1})\\ =&\sum_{i=1}^m\left(\sum_{j=1}^n\log p\left(x_j^{(i)}|y^{(i)};\phi_{j=t|y=0},\phi_{j=t|y=1}\right)+\log p\left(y^{(i)};\phi_y\right)\right)\\ &+\lambda_1\left(\sum_{t=1}^{k_j}\phi_{j=t|y=0}-1\right)+\lambda_2\left(\sum_{t=1}^{k_j}\phi_{j=t|y=0}-1\right) \end{array} \end{equation} 用最大似然的方法进行参数估计,对各参数求偏导 \begin{equation} \begin{array}{rl} \frac{\partial\mathcal{O}}{\partial\phi_y}&=\frac{\partial}{\partial\phi_y}\sum_{i=1}^m\log p\left(y^{(i)}\right)\\ &=\sum_{i=1}^m\frac{\partial}{\partial\phi_y}\left(y^{(i)}\log\phi_y+\left(1-y^{(i)}\right)\log(1-\phi_y)\right)\\ &=\sum_{i=1}^m\frac{y^{(i)}-\phi_y}{\phi_y(1-\phi_y)}=0\\ &\Rightarrow \phi_y=\frac{\sum_{i=1}^my^{(i)}}{m}=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}}{m} \end{array} \end{equation} \begin{equation} \begin{array}{rl} &\frac{\partial\mathcal{O}}{\partial\phi_{j=t|y=0}}\\ =&\frac{\partial}{\partial\phi_{j=t|y=0}}\sum_{i=1}^m\log p\left(x_j^{(i)}|y^{(i)}\right)+\lambda_1\left(\sum_{t=1}^{k_j}\phi_{j=t|y=0}-1\right)\\ =&\frac{\sum_{i=1}^m1\{y^{(i)}=0\&\&x_j^{(i)}=t\}}{\phi_{j=t|y=0}}+\lambda_1=0\\ \Rightarrow&\phi_{j=t|y=0}=-\frac{\sum_{i=1}^m1\{y^{(i)}=0\&\&x_j^{(i)}=t\}}{\lambda_1} \end{array} \end{equation} \begin{equation} \begin{array}{rl} &\frac{\partial\mathcal{O}}{\partial\phi_{j=t|y=1}}\\ =&\frac{\partial}{\partial\phi_{j=t|y=1}}\sum_{i=1}^m\log p\left(x_j^{(i)}|y^{(i)}\right)+\lambda_2\left(\sum_{t=1}^{k_j}\phi_{j=t|y=1}-1\right)\\ =&\frac{\sum_{i=1}^m1\{y^{(i)}=1\&\&x_j^{(i)}=t\}}{\phi_{j=t|y=1}}+\lambda_2=0\\ \Rightarrow&\phi_{j=t|y=1}=-\frac{\sum_{i=1}^m1\{y^{(i)}=1\&\&x_j^{(i)}=t\}}{\lambda_2} \end{array} \end{equation} 根据\(\sum_{t=1}^{k_j}\phi_{j=t|y=0}=1\)和\(\sum_{t=1}^{k_j}\phi_{j=t|y=1}=1\),将上面求出的参数左右两边同时加和,求得 \begin{equation} \lambda_1=-\sum_{t=1}^{k_j}\sum_{i=1}^m1\{y^{(i)}=0\&\&x_j^{(i)}=t\}=-\sum_{i=1}^m1\{y^{(i)}=0\} \end{equation} \begin{equation} \lambda_2=-\sum_{t=1}^{k_j}\sum_{i=1}^m1\{y^{(i)}=1\&\&x_j^{(i)}=t\}=-\sum_{i=1}^m1\{y^{(i)}=1\} \end{equation} 将求出的\(\lambda_1\)和\(\lambda_2\)带回,可求得 \begin{equation} \phi_{j=t|y=0}=\frac{\sum_{i=1}^m1\{y^{(i)}=0\&\&x_j^{(i)}=t\}}{\sum_{i=1}^m1\{y^{(i)}=0\}} \end{equation} \begin{equation} \phi_{j=t|y=1}=\frac{\sum_{i=1}^m1\{y^{(i)}=1\&\&x_j^{(i)}=t\}}{\sum_{i=1}^m1\{y^{(i)}=1\}} \end{equation} 在进入Laplace平滑后,我们的模型参数如下: \begin{equation} \phi_y=\frac{\sum_{i=1}^m1\{y^{(i)}=1\}+1}{m+2} \end{equation} \begin{equation} \phi_{j=t|y=0}=\frac{\sum_{i=1}^m1\{y^{(i)}=0\&\&x_j^{(i)}=t\}+1}{\sum_{i=1}^m1\{y^{(i)}=0\}+k_j} \end{equation} \begin{equation} \phi_{j=t|y=1}=\frac{\sum_{i=1}^m1\{y^{(i)}=1\&\&x_j^{(i)}=t\}+1}{\sum_{i=1}^m1\{y^{(i)}=1\}+k_j} \end{equation} 那么,在处理连续型数据时,我们应该选用概率分布估计还是离散化的方法?如果训练数据较少,或者数据的概率分布我们大致知道数据的概率分布,那么选用合适的概率分布模型效果会更好;当有大量的训练数据时,离散化的方法会有不错的表现,因为其模型更为复杂,整个学习过程实际上是在不断拟合数据的实际概率分布模型,而前者是在假定数据满足某种概率分布的前提下学习模型的参数。朴素贝叶斯更多地被用于有大量训练数据的应用场合,离散化的技术手段应用的更广泛一些。 一般来说,简单模型很容易产生欠拟合(under-fitting)的情况,而复杂模型容易产生过拟合(over-fitting)的情况。在训练数据较小的时候,复杂模型会产生过拟合问题,简单模型的泛化能力要比复杂模型好,但这时两者都只能学习到数据的极少数特点;当训练数据很充足时,简单模型则会出现欠拟合问题,其泛化能力不会因训练数据的增大而增强,此时复杂模型的优势就显露出来了。