概率生成模型-朴素贝叶斯(Naive Bayes)

目录

1 前置概念

2 朴素贝叶斯算法

3 拉普拉斯平滑

4 总结


1 前置概念

  • 先验概率:在不知道事务特征的情况下,根据以往的经验,判断出这件事发生的概率,这个概率就是先验概率,即:P(y)=\phi_y
  • 后验概率:与先验概率相对应,是知道了事务特征判断出来的从而得出的事件发生的概率就是后验概率,即:P(y|x)=\phi_{x|y}
  • 联合概率:两件事同时发生的改率,比如A发生且B发生,可以写作:P(A,B)
  • 贝叶斯定理:贝叶斯定理起初是为了解决逆概率的问题,通过现象倒推本质,比如,如果在一个黑箱里摸球,箱中有3个红球7个黑球,可以轻易得出摸出红球的概率是0.3,现在假设不知道盒中有多少个黑球多少个红球,通过不断的摸球,不断的计算,摸球,再修正自己的结果,最终可以预测到黑盒中红球和黑球的比例。

贝叶斯公式如下:

P( A|B ) =\frac{P( A) P( B|A )}{P( B )}

分析这个公式,可以得到很多有意思的事情。首先P(A)叫做先验概率,P(A|B)叫做后验概率,而剩余的部分则剩下了:\frac{P\left( B|A \right)}{P\left( B \right)},观察这个部分,因为我们知道,条件概率公式是:P\left( B|A \right) =\frac{P\left( A,B \right)}{P\left( A \right)},即两事件的联合概率比上作为条件的那个事件单独的概率,带入条件概率公式可以得到剩余部分变成了:\frac{P\left( A,B \right)}{P\left( A \right) \cdot P\left( B \right)}

此时,分析A事件和B事件的关系可以得到:

  • 当A,B相互独立的时候,P(A)\cdot P(B)=P(A,B),此时\frac{P\left( B|A \right)}{P\left( B \right)}=1,后验概率就等于先验概率。
  • 当A,B相交时,两者存在重叠部分,P(A)\cdot P(B)> P(A,B),此时\frac{P\left( B|A \right)}{P\left( B \right)}< 1,后验概率就小于先验概率。
  • 当A,B相包含时,P(A)=P(A,B),或P(B)=P(A,B),此时\frac{P\left( B|A \right)}{P\left( B \right)}> 1,后验概率就大于于先验概率。

画出文氏图可以很清楚的看出这三种情况:

因此这个剩余部分\frac{P\left( B|A \right)}{P\left( B \right)}起到一个修正先验概率的作用,因此叫做可能性函数。

2 朴素贝叶斯算法

朴素贝叶斯是一种生成式模型,是在贝叶斯算法上做了简化,即假设定给定目标值的条件下,各个特征相互独立,这个简化使得各个特征对分类结果的影响较为平均,一定程度上降低了分类器的分类效果,但是极大的简化了算法的复杂度。引入CS229中的例子做解释。

使用朴素贝叶斯做垃圾邮件的分类器,首先构建特征向量,用特征向量来描述一封邮件。选取字典或者历史邮件中嘴常用的10000个词,一封邮件中出现的词标为1,未出现的词标为0,这样就得到了一个10000维的向量,每个元素的值为0或1,这个向量就是可以用来描述一封邮件的特征向量。

其中,x_i 是向量中第 i 个元素,x_i=1\left\{ word\ i\ appears\ in\ email \right\}

目标是建模计算出 P(x|y) 和 P(y) ,然后根据这两项计算出P(x)P\left( x \right) =\sum_{k=1}^K{P\left( x|y_k \right) P\left( y_k \right)},这样就可以使用贝叶斯公式计算出后验概率了。首先使用朴素贝叶斯的假设,假设 x_i 给定 y 的情况下,是相互独立的,因此:

P\left( x_1,x_2,x_3,...,x_i|y \right) =P\left( x_1|y \right) P\left( x_2|y \right) P\left( x_3|y \right) ...P\left( x_i|y \right) =\prod_{i=1}^n{P\left( x_i|y \right)}

模型参数化:

\phi _{i|y=1}=P\left( x_i=1|y=1 \right)

\phi _{i|y=0}=P\left( x_i=1|y=0 \right)

\phi _y=P\left( y=1 \right)

由此写出联合似然函数:

\mathcal{L}\left( \phi _y,\phi _{i|y=0},\phi _{i|y=1} \right) =\prod_{i=1}^m{P\left( x^{\left( i \right)},y^{\left( i \right)} \right)}

使用极大似然估计法求解得到:

\phi _{j|y=1}=\frac{\sum_{i=1}^m{1\left\{ x_{j}^{\left( i \right)}=1\land y^{\left( i \right)}=1 \right\}}}{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=1 \right\}}}

\phi _{j|y=0}=\frac{\sum_{i=1}^m{1\left\{ x_{j}^{\left( i \right)}=1\land y^{\left( i \right)}=0 \right\}}}{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=0 \right\}}}

\phi _y=\frac{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=1 \right\}}}{m}

因此,使用贝叶斯公式计算概率如下:

P\left( y=1|x \right) =\frac{P\left( x|y=1 \right) P\left( y=1 \right)}{P\left( x \right)} $$ $$ =\frac{\left( \prod_{i=1}^n{p\left( x_i|y=1 \right)} \right) P\left( y=1 \right)}{\left( \prod_{i=1}^n{P\left( x_i|y=1 \right)} \right) P\left( y=1 \right) +\left( \prod_{i=1}^n{P\left( x_i|y=0 \right)} \right) P\left( y=0 \right)}​​​​​​​

由此计算出后概率,选择后验概率最高的类就是朴素贝叶斯的分类结果。

但是这个计算方法有一个致命的问题,就是假如有一个单词第一次出现,他在特征向量中的索引是 a (随便取的字母无特殊含义),那么 \phi_{a|y=1}=0\phi_{a|y=0}=0,也就是说P(x_a=1|y=1)=0P(x_a=1|y=0)=0,这就导致带入贝叶斯公式后分子分母均为0,导致模型崩溃。

3 拉普拉斯平滑

为解决上提到的问题,引入了Laplace Smoothing。假设y的取值有k个,引入之后公式做如下调整:

\phi _y=\frac{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=1 \right\}}+1}{m+k}

即在分母加上y的取值范围大小,在分子加上1,分子+1是防止概率为0,分母+分类数是为了使得所有概率相加等于1。

修正各分量的公式如下:

\phi _{j|y=1}=\frac{\sum_{i=1}^m{1\left\{ x_{j}^{\left( i \right)}=1\land y^{\left( i \right)}=1 \right\}}+1}{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=1 \right\}}+2}

\phi _{j|y=0}=\frac{\sum_{i=1}^m{1\left\{ x_{j}^{\left( i \right)}=1\land y^{\left( i \right)}=0 \right\}}+1}{\sum_{i=1}^m{1\left\{ y^{\left( i \right)}=0 \right\}}+2}

4 总结

朴素贝叶斯是一个非常简单,非常 “quick and dirty” 的算法,他不需要多次迭代来学习数据,只需要计数就可以得出预测结果。写完这个博客感觉有点不知所云,所以我再来总结一下。

首先朴素贝叶斯最核心的一个思想就是朴素贝叶斯假设,也叫做条件独立性假设。朴素贝叶斯是一个最简单的概率图模型之一,概率图模型去解释最为简单明了,是一个y到x的有向概率图。或者也可以简单理解为在给定目标值y的情况下,各个特征x之间是相互独立的,用上面的例子解释就是,在一封邮件中,假设各个单词的出现概率是相互独立的,一个单词的出现对其他单词没有影响。这个假设的唯一目的就是为了简化计算,当特征数量足够多的时候,如果不使用这个假设,计算量会十分庞大。公式如下:

P\left( x_1,x_2,x_3,...,x_i|y \right) =P\left( x_1|y \right) P\left( x_2|y \right) P\left( x_3|y \right) ...P\left( x_i|y \right) =\prod_{i=1}^n{P\left( x_i|y \right)}

整个预测的核心方法就是使用贝叶斯定理对后验概率进行计算,就是计算在给定特征的条件下,预测目标取得各个目标值的概率:P\left( y|x \right)

P\left( y|x \right) =\frac{P\left( y \right) P\left( x|y \right)}{P\left( x \right)}​​​​​​​

其中,y如果取值是0或1,则是服从伯努利分布,如果y的取值范围为多个类别,则是服从类别分布(categorial distribution);如果x是离散型,则同样,两个特征则x服从伯努利分布,多个特征则x服从类别分布;如果x是连续型,则服从高斯分布。根据这些假设便可用MLE估计出P(x|y)P(y),然后用贝叶斯公式就可以计算出后验概率了。

<think>好的,我现在需要帮助用户理解朴素贝叶斯算法的原理和实现。首先,用户的问题是关于Naive Bayes的实现和应用场景,所以我得从基础开始解释,确保结构清晰。 首先,我应该回顾朴素贝叶斯的基本原理。记得它是基于贝叶斯定理,假设特征之间独立。这点很重要,虽然实际中特征可能不独立,但算法还是有效。需要提到数学公式,比如后验概率的计算,这里需要用LaTeX格式,根据用户的系统级指令,行内公式用$...$,独立公式用$$...$$。比如,贝叶斯定理可以写成$P(y|X) = \frac{P(X|y)P(y)}{P(X)}$,然后分解条件概率。 接下来,实现步骤需要分点说明。数据准备、计算先验概率、条件概率等。可能还需要提到拉普拉斯平滑,避免零概率问题。这里可以引用用户提供的引用[2],指出概率输出的问题,说明朴素贝叶斯作为估计器的局限性。 然后,代码示例部分。用户给的示例里有Python代码,所以我也要提供一个简单的实现,比如高斯朴素贝叶斯。同时,要提到scikit-learn中的实现,这样用户知道实际应用时可以用库。需要确保代码正确,符合语法要求,并解释关键步骤。 应用场景方面,文本分类、垃圾邮件过滤、情感分析都是常见用途。这部分需要结合引用[1]提到的分类效率和参数少的特点,说明为什么在这些场景适用。同时,也要提到假设特征独立的限制,可能影响结果,呼应引用[1]中的内容。 最后,相关问题部分,根据用户之前的例子,生成三个相关问题。比如优化方法、与逻辑回归的比较、处理连续特征的方法。这些问题可以帮助用户进一步学习。 还要注意引用标记,比如在提到错误率时引用[^1],概率估计问题引用[^2],交叉验证引用[^3]。确保引用自然,不破坏段落流畅。 检查是否有遗漏,比如是否覆盖了原理、实现步骤、代码、应用场景和优缺点。确保数学公式正确,代码格式正确,使用中文回答,结构清晰。可能还需要提到模型验证方法,如交叉验证,引用[3]中的内容。 总结一下,我需要分步骤解释原理,给出代码示例,讨论应用和限制,并生成相关问题。同时,正确使用引用,确保符合用户的所有格式要求。</think>### 朴素贝叶斯算法原理与实现 #### 1. 核心原理 朴素贝叶斯基于贝叶斯定理$P(y|X) = \frac{P(X|y)P(y)}{P(X)}$,并假设特征之间条件独立("朴素"假设)。对于输入特征$X=(x_1,x_2,...,x_n)$,分类目标为: $$ \hat{y} = \arg\max_{y} P(y) \prod_{i=1}^n P(x_i|y) $$ 这种独立性假设简化了计算,但也可能影响准确性[^1]。 #### 2. 实现步骤 1. **数据准备**:将特征离散化(对连续特征需使用高斯朴素贝叶斯) 2. **计算先验概率**:$P(y)$ 3. **计算条件概率**:$P(x_i|y)$ 4. **拉普拉斯平滑**:避免零概率问题 5. **预测计算**:通过最大后验概率决策 #### 3. Python代码示例 ```python import numpy as np from sklearn.naive_bayes import GaussianNB # 手动实现高斯朴素贝叶斯 class GaussianNaiveBayes: def fit(self, X, y): self.classes = np.unique(y) self.mean = {} self.var = {} self.priors = {} for c in self.classes: X_c = X[y == c] self.mean[c] = X_c.mean(axis=0) self.var[c] = X_c.var(axis=0) self.priors[c] = X_c.shape[0] / X.shape[0] def predict(self, X): posteriors = [] for c in self.classes: prior = np.log(self.priors[c]) likelihood = -0.5 * np.sum(np.log(2 * np.pi * self.var[c]) + ((X - self.mean[c])**2) / self.var[c], axis=1) posterior = prior + likelihood posteriors.append(posterior) return self.classes[np.argmax(posteriors, axis=0)] ``` #### 4. 典型应用场景 - **文本分类**:垃圾邮件检测(词频作为特征) - **推荐系统**:用户行为预测 - **医疗诊断**:症状与疾病关系建模 - **实时系统**:低计算资源场景[^1] #### 5. 优缺点分析 | 优势 | 局限性 | |------|--------| | 训练速度快(时间复杂度$O(np)$) | 独立性假设可能导致信息损失 | | 可处理高维数据 | 需要离散化处理连续特征 | | 对缺失数据鲁棒 | 概率估计可能不准确[^2] | | 适合增量学习 | 特征关联场景表现下降 | 实际应用中常通过以下方法改进: - 使用核密度估计处理连续特征 - 集成特征选择方法 - 结合交叉验证优化超参数[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值