c语言程序朴素贝叶斯分类器,生成式学习算法(四)之----朴素贝叶斯分类器

朴素贝叶斯分类器(算法)与朴素贝叶斯假设

在高斯判别分析模型(GDA)中,特征向量$ x$ 是连续实值向量。现在我们来讨论分量$ x_j$ 取离散值的贝叶斯朴素贝叶斯模型。

在文本分类问题中,有一个问题是分出一个邮件是(\(y=1\) )或者不是(\(y=1\) )垃圾邮件。我们的训练数据集是一些标好是否是垃圾邮件的邮件。现在我们首先需要把每个邮件表示成特征向量的形式。

假设我们有一个固定长度的词表。这个词表不包括一些在每个文档中都出现的,高频的对判别垃圾邮件没有太大作用的停用词。然后对于每一个邮件。可以用一个长度为词表长度的0,1向量来表示。向量的分量$ x_j\(就表示这个词表中的第\) j$项所代表的单词是否出现在这个邮件中,0表示没有出现,1表示出现。

把每个邮件表示成0,1特征向量$ x$ 后,现在我们要对条件概率\(p(x | y)\) 进行建模。肯定不能用多项分布来建模,因为参数量太大了。比如我们的词表长度为5000,特征向量的可能结果有$ 2^{5000}$ 种。用多项分布则需要确定$ 2^{5000}-1$ 个参数。因此,我们需要对模型做出一些简化假设。

朴素贝叶斯假设就是其中一种简化假设,在这个假设下得到的算法叫朴素贝叶斯分类器(算法)。虽然这个假设较强,但很多问题在这个假设下依然表现良好。朴素贝叶斯假设是指在给定\(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}

\]

从现在起,我们应该把特征$x $ 看成是一个固定的东西。则模型的参数有垃圾邮件的先验概率\(\phi_{y}=p(y=1)\) ,以及每个特征分量下的两个参数\(\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)\) 是垃圾邮件中这个特征所代表的单词出现的概率。

然后我们在这些参数下可以写出数据的似然函数,

\[

\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)

\]

关于每组参数最大化,可以得到各个参数的如下估计,

\[

\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}

\]

比如参数\(\phi_{j | y=1}=p\left(x_{j}=1 | y=1\right)\) 的估计(不严格地,上面我们还用同一个符号来表示)其实就是垃圾邮件中这个特征所代表的单词出现的频率。

估计出这些参数,来了一个新邮件,我们就可以做出如下预测,

\[

\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$ 的不同取值的联合概率,然后归一化。

之前我们说特征向量$ x$ 是0,1向量。可以自然推广到特征向量取$k $ 个值的情况。对于连续的变量不是太服从多元正态分布时,可以将其离散化为$k $ 值离散特征向量,然后利用这个模型,也往往能取得比高斯判别分析模型更好的结果。

4e4671eb5c21ae31ffff439f2917f010.png

拉普拉斯平滑

2019年9月21日19:03:05

上面算法的一个最大问题就是对于在词表中出现过,但训练集中未出现过的单词,计算出后验概率0:0,无法判断是垃圾邮件,还是非垃圾邮件。采用拉普拉斯平滑可以大大改善这个算法。

更广泛一点来说,对于训练集中没有见到的事件,我们就估计它出现的概率为零,不是一个好的做法。对于一个取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}

\]

回到朴素贝叶斯参数估计上,再给定标签$y $ 的情况下,表示词出现与否的每个特征分量 $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}

\]

注意,我们这里是对特征分量进行拉普拉斯平滑。标签本身也是个二项分布,但一般不需要拉普拉斯平滑。

文本分类事件模型

虽然朴素贝叶斯算法在分类中一般表现较好,有一类算法在文本分类中可以表现得更好。

朴素贝叶斯用的是多元伯努利事件模型(multi-variate Bernoulli event model)。邮件发送者先一定概率决定发送垃圾邮件和非垃圾邮件,然后在给定条件概率下。独立的以相应概率发送词表中的每个单词。

现在我们来看一下多项事件模型(multinomial event model)。他对每个邮件的特征表示与之前不同。他将第j个特征分量表示邮件中的第j个单词(之前的是词表中第j个单词出现与否0,1变量)。这个特征分量取值于\(\{1, \ldots,|V|\}\),\(|V|\) 为词表的大小。然后一个邮件由不固定长度的\(n\) 个词组成。

在多项事件模型中,每个邮件是否是垃圾邮件产生方法和之前相同。在决定了邮件是否是垃圾邮件后,再根据相应的条件概率产生第一个单词,注意是从多项分布中产生一个单词,然后再独立的产生第二个单词,一直产生n个单词。这里分布是多项分布,和之前的伯努利分布是不一样的。

这个模型的参数同样有垃圾邮件的先验概率\(\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,产生此位置单词的多项分布的参数都是一样的(比较之前\(\phi_{j | y=0}=p\left(x_{j}=1 | y=0\right)\) ) 。

给定训练集\(\left\{\left(x^{(i)}, y^{(i)}\right) ; i=1, \ldots, m\right\}\) ,其中\(x^{(i)}=\left(x_{1}^{(i)}, x_{2}^{(i)}, \dots, x_{n_{i}}^{(i)}\right)\),这里$n_{(i)} $ 是第${i} $ 个邮件的单词个数。然后我们在这些参数下可以写出数据的似然函数,

\[

\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}

\]

关于每组参数最大化,可以得到各个参数的如下估计,

\[

\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 $ 个位置哪个词出现的特征分量 $x_{j} $ 是一个多项分布(取值个数 \(|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}

\]

尽管朴素贝叶斯算法可能不是最好的,但它通常都有不俗的表现。由于这个算法实现起来简单明了。绝对是首先值得一试的算法。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[生成式学习算法(四)之----朴素贝叶斯分类器]http://www.zyiz.net/tech/detail-91587.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值