【CS229笔记】Naive Bayes朴素贝叶斯算法

Naive Bayes 朴素贝叶斯算法

朴素贝叶斯是课程中所介绍的另一种生成式学习算法。它针对的是输入x是离散的情况。

为了讲解朴素贝叶斯算法,我们设想决定设计一个电子邮件垃圾邮件过滤器,我们希望对邮件进行分类。这个和之前的分类任务有所不同,这个是文本分类。它并没有体重、面积、房间数这种如此明显的特征,它有的只是一堆文本而已,那么首先我们需要考虑如何构建特征向量?

特征向量的构建

我们利用一个特征向量来表示一个电子邮件,这个向量的长度等于字典里面的单词数,例如字典中有35000个单词,那么这个向量就有35000维。如果电子邮件包含字典中的第i个单词,那么 x i = 1 x_i=1 xi=1,否则就是 x i = 0 x_i=0 xi=0。编码到特征向量的词汇的集合称之为词汇表,特征向量的维度和词汇表的容量是一致的。

生成模型的构建

现在我们要构建一个生成模型,所以我们需要对 p ( x ∣ y ) p(x|y) p(xy)来建模。但是如果词汇表中有50000个单词( x 1 , x 2 , . . . , x 50000 x_1,x_2,...,x_{50000} x1,x2,...,x50000),那么特征向量就会有 2 50000 2^{50000} 250000种可能,如果说我们采用多项式分布对x进行建模的话,那么我们就会有 2 50000 − 1 2^{50000}-1 2500001个参数需要确定(每一种结果输出的概率),这么多参数要拟合是不可行的。

我们需要做出一个very strong的假设(大概就是假定数据比较接近某种理想态的意思),我们将假设在给定y条件下, x i x_i xi是条件独立的,即 p ( x 1 , x 2 , . . . , x 50000 ∣ y ) = p ( x 1 ∣ y ) p ( x 2 ∣ y ) . . . p ( x 50000 ∣ y ) p(x_1,x_2,...,x_{50000}|y)=p(x_1|y)p(x_2|y)...p(x_{50000}|y) p(x1,x2,...,x50000y)=p(x1y)p(x2y)...p(x50000y),这个假设称之为朴素贝叶斯假设,由此产生的算法是朴素贝叶斯分类器。这个假设通俗理解就是:对于一封垃圾邮件,“buy”这个单词并不影响"price"这个单词出现的概率。【提醒:条件独立和独立不是一个东西,具体可见https://zhuanlan.zhihu.com/p/58593725,下面将这篇文章的阐述摘录出来了】

条件独立和独立并不等价
  • 独立推不出条件独立:有两枚正反概率均为 50% 的硬币,设事件 A 为第一枚硬币为正面,事件 B 为第二枚硬币为正面,事件 C 为两枚硬币同面。A 和 B 显然独立,但如果 C 已经发生,即已知两枚硬币同面,那么 A 和 B 就不(条件)独立了。
  • 条件独立推不出独立:有一枚硬币正面的概率为 99%,另一枚反面的概率为 99%,随机拿出一枚投掷两次,事件 A 为第一次为正面,事件 B 为第二次为正面,事件 C 为拿出的是第一枚硬币。可以算出来 P(B) = 0.5 但 P(B|A) = 0.9802,说明 A 和 B 不独立,但如果 C 已经发生,即已知了拿出的是第一枚硬币,那么 A 和 B 就(条件)独立了。

再说回模型的事儿,现在我们已知 p ( x 1 , . . . , x 50000 ∣ y ) = ∏ i = 1 n p ( x i ∣ y ) p(x_1,...,x_{50000} \mid y)=\prod_{i=1}^{n}{p(x_i \mid y)} p(x1,...,x50000y)=i=1np(xiy),那么此模型由以下参数决定: ϕ i ∣ y = 1 = p ( x i = 1 ∣ y = 1 ) {\phi}_{i \mid y=1}=p(x_i=1 \mid y=1) ϕiy=1=p(xi=1y=1) ϕ i ∣ y = 0 = p ( x i = 1 ∣ y = 0 ) {\phi}_{i \mid y=0}=p(x_i=1 \mid y=0) ϕiy=0=p(xi=1y=0)以及 ϕ y = p ( y = 1 ) {\phi}_{y}=p(y=1) ϕy=p(y=1)。此时联合似然函数为 L ( ϕ y , ϕ j ∣ y = 0 , ϕ j ∣ y = 1 ) = ∏ i = 1 n p ( x i ∣ y ) L(\phi_y,\phi_{j \mid y=0},\phi_{j \mid y=1})=\prod_{i=1}^{n}{p(x_i \mid y)} L(ϕy,ϕjy=0,ϕjy=1)=i=1np(xiy)

各个参数的极大似然估计如下所示:

在这里插入图片描述

ϕ i ∣ y = 1 {\phi}_{i \mid y=1} ϕiy=1表示的是垃圾邮件中出现某个词的频率(垃圾邮件中出现某个词的邮件数/垃圾邮件数目)

那么计算出所有的参数之后,进行预测时,我们只需要简单的计算下图这个式子,然后找出使得后验概率较高的那个类别。

在这里插入图片描述

朴素贝叶斯同样可以应用于连续特征值,只需要我们将连续特征值离散化就可以了。当原始的连续值属性没有通过多元正态分布很好地建模时,离散化特征并使用朴素贝叶斯(而不是 GDA)通常会产生更好的分类器。

  • PS. 吴恩达认为朴素贝叶斯的效果实际上并不优于逻辑回归,但是在效率上(无迭代)更好

没见过的单词

有那么一个不怎么常见的单词“nips”,它从在你的训练集中出现过(也许你的字典或者是你的词汇表有,但是你的训练集里面确实没有),那么这个时候算出来的参数就是下面这个样子:

在这里插入图片描述

进而导致计算 p ( y = 1 ∣ x ) p(y=1 \mid x) p(y=1x)的时候,会算出来一个0/0的结果,这个时候预测将会无法进行了。

在这里插入图片描述

事实上,因为训练集中没见过某个单词,就认为这个单词出现的概率是0。这样本身就是不合理的,因此我们需要拉普拉斯平滑来处理这个问题。

Laplace smoothing 拉普拉斯平滑

对于一个可能取值为 { 1 , . . . , k } {\{1,...,k\}} {1,...,k}的变量,给定一组样本数据 { z ( 1 ) , . . . , z ( m ) } \{z(1),...,z(m)\} {z(1),...,z(m)},那么这个时候我们对每个值出现的概率 ϕ j = p ( z = i ) \phi_j=p(z=i) ϕj=p(z=i)进行极大似然估计的结果就是:

在这里插入图片描述

但是这样会导致如果样本数据中没有对应的结果,那么 ϕ j \phi_j ϕj就等于0,这与我们常规认知不符。因此我们使用拉普拉斯平滑。具体做法就是将 ϕ j \phi_j ϕj的估计方法变一下,变成下面这个式子:

在这里插入图片描述

这个方法解决了未出现取值的概率估计为0的问题,同时满足了所有取值的概率加起来等于1的要求。在某些条件下,拉普拉斯平滑给出了 ϕ j \phi_j ϕj的最优估计量【k的取值并不是可能取值的最大值,而是可能取值的数量】。

那么对于朴素贝叶斯分类器,参数的极大似然估计调整为以下式子【 ϕ y \phi_y ϕy没有必要做拉普拉斯平滑,一般它不会是0】:

在这里插入图片描述

【个人未解决的疑问:拉普拉斯平滑的依据是什么?为什么它就会是最优估计量?】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值