朴素贝叶斯算法
在高斯判别分析中,特征向量是连续的、实数值向量。现在我们要谈谈一个不同的生成学习算法,其中x是离散的向量。
让我们以识别垃圾邮件为例,这类问题被称为文本分类问题。
假设我们有一个训练集(已经标记好了是否为垃圾邮件的邮件集合),我们首先需要构建表示一封邮件的特征向量。
我们通过如下方式表示特征向量:其长度为词表的长度(词表为所有可能出现的词的集合,一般通过训练集生成),如果这封邮件包含了第 i 个词, xi=1 ,否则 xi=0 。下图为一个简单的例子:
选择好特征向量后,我们需要来构建生成模型,但考虑到x是一个高维向量,因此如果直接对 p(x∣y) 建模,那么会得到一个参数向量的维数极高的多项分布,使计算过于复杂。
因此,我们需要做一个强力的假设,假设给定 y 时, 每一个 xi 是条件独立的。这个假设被称为朴素贝叶斯假设,其引出的算法被称为朴素贝叶斯分类器。(注意是条件独立而不是独立,即仅在给定 y 的情况下独立)
现在我们有(以50000维度为例):
第一个等式来自于概率的基本性质,第二个等式则使用了朴素贝叶斯假设。即使这个假设在现实中不一定成立,但其实际的效果还是不错的。
模型包含了以下三个参数:
和之前一样,给定一个训练集
{(x(i),y(i));i=1,…,m}
,我们可以写出如下的联合似然函数(具体的形式参见生成学习算法):
对这个联合似然函数进行最大似然分析,得到的参数值如下:
这些结果的得出是很自然的,从概率的角度也可以很好地解释。
得到了这些参数之后,为了对一个新的输入x进行预测,我们可以计算:
然后选择具有更高后验概率的类作为输出。(这里的n指字典的维数,需要先把x转换为统一长度的向量)
在之前的例子中,输入的每一维特征都是是二元的,其对应的分布是伯努利分布,而当特征是多元时,其对应的分布应该用多项式分布建模。
实际上,即便一些原始的输入数据是连续值,我们可以通过一个映射表将连续值映射为离散值,然后运用朴素贝叶斯方法进行建模。当原始,连续值的数据不能很好的用多元正态分布进行建模时,将其离散化再使用朴素贝叶斯建模往往会取得更好的效果。
拉普拉斯平滑
之前描述的朴素贝叶斯算法有很多的应用,但是其当前的形式仍存在一个问题,让我们讨论一下如何解决这个问题。
在垃圾邮件分类问题中,如果词典中存在一个词,而这个词在训练集中从未出现过时,其最大似然分析得出的参数 ϕ35000|y 将会是
因此,当我们尝试去预测含有该词的邮件是否为垃圾邮件时,后验概率的计算结果将变为:
这会导致我们无法进行预测。更一般的来看,如果你在有限的训练集上没有看到过某个事件,就认为其发生的概率为0,这在统计学上是不合理的。
现在假设我们要分析一个多项式随机变量 z 的均值,取值为 {1,…,k} ,我们可以分析 ϕi=p(z=i) ,给定一个独立的观察集 {z(1),…,z(m)} ,最大似然估计的结果为:
如果我们用这个公式来进行最大似然估计,那么有一些 ϕi 的值可能为0(如果未在观察集中出现),为了避免这个问题,我们可以使用拉普拉斯平滑,其形式为:
分子加1,分母加k,这样可以保证 ∑mj=1ϕj=1 (概率之和为1),同时保证了对所有的取值, ϕj≠0 ,从而解决了之前的问题。实验证明,在大部分情况下,拉普拉斯平滑可以给出一个最优的估计。
对于朴素贝叶斯分类器,使用拉普拉斯平滑,可以得到如下公式:
因为x的取值有两种,所以分子加1,分母加2。
(在实际中,一般不需要对 ϕy 进行拉普拉斯平滑。)
文本分类的事件模型
让我们再探讨一个专门用于文本分类的模型来结束生成学习算法。虽然朴素贝叶斯对许多分类问题有很好的效果,但是对于文本分类,还有存在着一个效果更棒的相关模型。
在文本分类领域,之前我们使用的朴素贝叶斯模型被称为多元伯努利事件模型。现在我们将使用一个不同的模型,叫作多项式事件模型。
我们将使用与之前不同的方式来表示一封邮件。令 xi 表示邮件中的第i个词语,则其取值范围为 {1,…,|V|} , |V| 是词表(词典)的大小。 一封含有 n 个词语的邮件现在将被表示为一个长度为 n 的向量 (x+1,x2,…,xn) ,注意 n 会随邮件的不同而变化。
该模型的参数为:
注意:我们假设 p(xj∣y) 对所有的 j (邮件中词语的位置)都是一样的。
如果给定一个训练集
最大似然估计得出的结果如下:
可以看到,里在考虑字典中索引为k的词时,会把在每个文本中出现的次数相加,所以该模型相比于之前的模型,不仅仅考虑是否出现,还考虑了出现的次数。
如果有要应用拉普拉斯平滑,可以在分子加1,分母加 |V| ,得到:
虽然朴素贝叶斯不是最好的分类算法,但因为其易于实现,所以非常适合作为你的第一个尝试。