这一节我们将通过学习贝叶斯公式、朴素贝叶斯、文本分类案例三部分来了解垃圾邮件识别的算法原理。
- 首先,我们将理解贝叶斯公式,这是垃圾邮件识别中关键的数学基础;
- 接着,我们将介绍朴素贝叶斯算法,它建立在贝叶斯公式的基础上;
- 最后,我们将通过一个文本分类案例,演示如何应用这些算法原理来实现垃圾邮件的识别,从而深入理解算法在实际应用中的过程、原理。
通过这三部分的学习,将对朴素贝叶斯算法的原理有更加深刻的理解,为实现后续功能提供算法理论支撑。
2026-08-12 课件内容排版变动:原来的三部分内容都放在下面,不用跳转到新的链接了。
1. 贝叶斯公式(Bayes)
贝叶斯公式是概率论中的一个重要公式,它以18世纪英国数学家托马斯·贝叶斯(Thomas Bayes)的名字命名。它用于计算在给定一些先验信息的情况下,估计某一事件的概率。
贝叶斯公式在许多领域中都有广泛的应用,包括统计学、机器学习、人工智能、自然语言处理、医学诊断、金融建模等,在许多实际问题中都是一种有力的工具。
接下来,我们通过一个例子来逐步去理解相关的概率公式(概率、条件概率、联合概率、贝叶斯概率):
| 样本数 | 职业 | 体型 | 是否喜欢 |
|---|---|---|---|
| 1 | 程序员 | 超重 | 不喜欢 |
| 2 | 产品 | 匀称 | 喜欢 |
| 3 | 程序员 | 匀称 | 喜欢 |
| 4 | 程序员 | 超重 | 喜欢 |
| 5 | 美工 | 匀称 | 不喜欢 |
| 6 | 美工 | 超重 | 不喜欢 |
| 7 | 产品 | 匀称 | 喜欢 |
1.1 概率
概率是描述事件发生可能性的一种数学和统计概念。它通常用来衡量某个事件发生的可能性或概率。概率可以是一个介于0和1之间的数值,其中0表示事件绝对不会发生,1表示事件肯定会发生,而0.5表示事件发生的可能性为50%。
例如:
喜欢的概率是多少?记作:P(喜欢)=4/7
职业是产品的概率是多少?记作:P(职业=产品)=2/7
“P” 在概率表示中是 “Probability“(概率)的缩写。
1.2 条件概率
条件概率考虑的问题是:在事件 A 已经发生的条件下计算事件 B 的发生概率,记作:P(B|A)
例如:在喜欢的条件下(事件A),职业是程序员的概率?
记作:P(职业=程序员|喜欢)
- 在喜欢条件下,将样本限制在了 2、3、4、7 号样本;
- 在 2、3、4、7 号样本中职业是程序员的有 2 个;
- 故:P(职业=程序员|喜欢) = 2/4 = 1/2
P(A|B) 和 P(B|A) 相同吗?
答案:不同
P(喜欢|职业=程序员)=2/3,很显然与 P(职业=程序员|喜欢)是不同的。
1.3 联合概率
联合概率表示两个事件共同发生的概率。事件 A 与 B 的联合概率表示为 P(AB) 、P(A,B) 、P(A∩B)。计算公式如下::

例如:职业是程序员(事件A)并且体型匀称(事件B)的概率是多少?
记作:P(职业=程序员,体型=匀称)
套公式:P(职业=程序员,体型=匀称) = P(职业=程序员) * P(体型=匀称|职业=程序员)
- 数据集中,共有 7 个样本
- 职业是程序员有 1、3、4 共 3 个样本,则其概率为:3/7
- 在职业是程序员的条件下,体型是匀称只有 3 号样本,共 1 个样本,则其概率为:1/3
- 则即是程序员又体型匀称的概率为:3/7 * 1/3 = 1/7

灰色的椭圆表示 A 事件的发生概率,红色的椭圆表示 B 事件的发生概率,它们相交的部分表示事件 A 和 B 同时发生的概率。
注意:P(AB) 和 P(BA) 是等价的。
1.4 贝叶斯公式
我们前面提到过,P(A|B) 和 P(B|A) 是不同的,但是这两者之间有存在一定的关系。贝叶斯公式就是用来描述 P(A|B) 和 P(B|A) 之间的转换关系。即:从已知的条件概率中推导出另一个条件概率。

例如:我们要计算 P(喜欢|职业=程序员,体型=超重) 的概率值是多少?
| 编号 | 职业 | 体型 | 喜欢的概率? |
|---|---|---|---|
| 1 | 程序员 | 超重 | ? |
根据贝叶斯公式,我们可以将上面的计算过程转换为如下:

其中:
- P(职业=程序员,体型=超重|喜欢)=P(体型=超重|喜欢) * P(职业=程序员|喜欢,体型=超重)
- P(职业=程序员,体型=超重) = P(职业=程序员) * P(体型=超重|职业=程序员)
计算过程:
- P(体型=超重|喜欢) = 1/4
- P(职业=程序员|喜欢,体型=超重) = 1/1
- P(喜欢) = 4/7
- P(职业=程序员,体型=超重 = 3/7*2/3 = 2/7
- 最后得到:P(喜欢|职业=程序员,体型=超重) = 1/2 = 0.5
我们通过对数据的观察,发现在喜欢和不喜欢中各有一例 [职业=程序员,体型=超重] 样本,即:喜欢的概率为 0.5。
最后,让我们再通俗的去理解下贝叶斯公式,当我们想知道 P(A|B) 时,即:在 B 的条件下 A 的概率。首先,我们就需要根据历史数据来进行估计,估计过程如下:
- P(A) 表示先验概率,即:只通过历史数据大体来得到一个参考概率值;
- P(B|A) 将会更深层次的利用历史数据中,各个不同维度数据的概率信息来校准初步估计得到的概率值 P(A),从而得到后验概率;
- 分母 P(B) 的目的仅仅是为了归一化,使得概率值为 0-1 之间。
2. 朴素贝叶斯(Naive Bayes)
当我们将贝叶斯公式应用到实际问题中时,我们发现存在问题。接下来,我们结合下面的数据来看看存在哪些问题。数据如下:
| 样本数 | 职业 | 体型 | 是否喜欢 |
|---|---|---|---|
| 1 | 程序员 | 超重 | 不喜欢 |
| 2 | 产品 | 匀称 | 喜欢 |
| 3 | 程序员 | 匀称 | 喜欢 |
| 4 | 程序员 | 超重 | 喜欢 |
| 5 | 美工 | 匀称 | 不喜欢 |
| 6 | 美工 | 超重 | 不喜欢 |
| 7 | 产品 | 匀称 | 喜欢 |
2.1 特征条件独立性假设
假设:我们要计算 P(喜欢|程序员,超重)
| 编号 | 职业 | 体型 | 喜欢的概率? |
|---|---|---|---|
| 1 | 程序员 | 超重 | ? |
基于贝叶斯公式的计算过程如下:

其中:P(职业=产品,体型=超重|喜欢) = P(体型=超重|喜欢) * P(职业=产品|喜欢,体型=超重)
我们的数据集中,只有 2 个特征,在实际应用场景中,可能会存在几百、几千个特征,此时联合概率的计算就会变得非常复杂。如何简化这个计算过程?办法就是给贝叶斯公式增加了一个假设:
特征条件独立性假设
即:职业和体型这两个特征之间是不存在关系的,相互独立的。经过这个假设之后,贝叶斯就叫做朴素贝叶斯。其计算过程变化如下:
P(职业=产品,体型=超重|喜欢) = P(体型=超重|喜欢) * P(职业=产品|喜欢)
至此,我们应该明白了,增加了 “朴素” 假设的贝叶斯能够更好的适应实际的应用场景。总结该假设带来的影响主要有以下两点:
- 计算:假设特征条件独立性可以将联合概率分布拆分为各个特征的条件概率,这样可以大大简化计算;
- 偏差:由于特征条件独立性假设,如果数据中存在显著的特征相关性,朴素贝叶斯可能会引入一定的偏差。然而,在实践中,它通常表现得相当鲁棒,特别是在大量数据可用的情况下。
2.2 拉普拉斯平滑系数
在实际应用朴素贝叶斯时,过程如下:
- 统计训练集中,每个分类下的各个特征的条件概率;
- 新样本需要预测类别时,我们只需要查表并套用朴素贝叶斯公式即可
针对上面的数据集,我们需要统计如下概率值:
P(喜欢)
P(不喜欢)
P(职业=产品|喜欢)
P(职业=美工|喜欢)
P(职业=程序员|喜欢)
P(体型=超重|喜欢)
P(体型=匀称|喜欢)
P(职业=产品|不喜欢)
P(职业=美工|不喜欢)
P(职业=程序员|不喜欢)
P(体型=超重|不喜欢)
P(体型=匀称|不喜欢)
此时,如果要计算某个样本到底属于喜欢、不喜欢,只需要查表计算相应的概率值即可:
| 编号 | 职业 | 体型 | 喜欢 or 不喜欢? |
|---|---|---|---|
| 1 | 程序员 | 超重 | ? |

接下来,我们看下问题:在前面根据数据集进行相关条件概率统计时,我们发现由于采样的样本数量的原因,P(职业=美工|喜欢) 在数据集中是无法统计得到的,这也就意味着该值为 0,如果进行如下计算:
| 编号 | 职业 | 体型 | 喜欢 or 不喜欢? |
|---|---|---|---|
| 1 | 美工 | 超重 | ? |

上面的概率计算是为 0 的,即:概率为0的问题,这个显然是不合适的。怎么解决这个问题?这就使用到了拉普拉斯平滑系数。公式如下:

拉普拉斯平滑的目标是为每个类别下的每个特征引入一个小的概率值,以确保每个特征在每个类别下都有非零的概率。
例如:
- P(职业=程序员|喜欢) = 2/4,经过拉普拉斯平滑之后为:(2 + 1) / (4 + 3) = 3/7,其中 3 为该特征的数量;
- P(职业=美工|喜欢) = 0/4,经过拉普拉斯平滑之后为:(0+1)/(4+3) =1/7
此时,我们发现通过拉普拉斯平滑给数据集中不存在的条件概率引入了一个较小的非零概率。
如何理解拉普拉斯平滑的有效性?
- 未平滑的概率估计会导致在训练数据中没有出现的特征对分类结果产生过大的影响,因为它们的概率为零。平滑后,即使某个特征在训练数据中很少出现,它仍然会对分类产生一定的影响,但影响不会过于夸大,从而提高了模型的泛化能力。
- 拉普拉斯平滑确保了不同特征的相对大小关系在一定程度上得以保留。未平滑的概率估计可能会导致某些特征的概率远远高于其他特征,而平滑后,概率差距会减小,使得分类器更能够准确地考虑各个特征的贡献。
最后,我们总结下为什么要使用拉普拉斯平滑系数?
在朴素贝叶斯中,每个特征的条件概率是通过统计训练数据中的频率来估计的。如果在训练数据中某个特征在某个类别下从未出现,那么这个特征的条件概率将会变成零。这种情况下,如果在测试数据中遇到了这个特征,就无法进行有效的分类,因为概率为零。
3. 朴素贝叶斯文本分类案例
我们通过一个案例,来了解朴素贝叶斯如何实现垃圾邮件分类。步骤为:
- 文本转换为数值
- 朴素贝叶斯训练
- 朴素贝叶斯推理
我们使用到的训练数据如下:
| 样本 | 标签 |
| 您中奖了!点击链接领取您的百万大奖。 | 垃圾 |
| 免费试用我们的产品,不满意全额退款。 | 垃圾 |
| 您的银行账户需要紧急验证,请点击以下链接。 | 垃圾 |
| 会议通知:下周的会议安排。 | 正常 |
| 我在超市买了一些食物。 | 正常 |
| 明天我们将一起庆祝生日。 | 正常 |
待预测类别的数据如下:
| 样本 | 标签 |
| 您的百万大奖正在等待您的领取。 | ? |
3.1 文本转换为数值
对所有的文本进行分词,去除停用词,得到每一邮件分词之后的结果:
| 样本 | 标签 |
| [‘中奖’, ‘点击’, ‘链接’, ‘领取’, ‘百万’, ‘大奖’] | 垃圾 |
| [‘免费’, ‘试用’, ‘产品’, ‘满意’, ‘全额’, ‘退款’] | 垃圾 |
| [‘银行’, ‘账户’, ‘需要’, ‘紧急’, ‘验证’, ‘请’, ‘点击’, ‘以下’, ‘链接’] | 垃圾 |
| [‘会议’, ‘通知’, ‘下周’, ‘会议’, ‘安排’] | 正常 |
| [‘超市’, ‘买’, ‘食物’] | 正常 |
| [‘明天’, ‘一起’, ‘庆祝’, ‘生日’] | 正常 |
什么是停用词?
停用词(Stop Words)是自然语言处理(NLP)中的一个概念,指的是在文本中经常出现的,但通常被忽略或删除的常见词语。这些词语通常对文本分析和处理任务没有特定的信息或含义,因此在文本处理过程中通常被过滤掉,提高处理效率。常见的停用词通常包括:连接词、冠词、代词、介词和其他高频词汇,例如 “的”、”是”、”在”、”我”、”你”、”他们”等。这些词在句子中频繁出现,但往往不提供有关文本主题或内容的有用信息。
我们把这些词去重,组合成一个词表(共30个词):
['中奖', '点击', '链接', '领取', '百万', '大奖', '免费', '试用', '产品', '满意', '全额', '退款', '银行', '账户', '需要', '紧急', '验证', '请', '以下', '会议', '通知', '下周', '安排', '超市', '买', '食物', '明天', '一起', '庆祝', '生日']
接下来,我们统计每个邮件中包含词表中的词的个数多少,从而将文本内容转换为数值表示:
[ [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1] ]
- 转换之后的向量中的每一个分量和词表中的词是一一对应的;
- 如果某个位置为 1、2 或者其他值则表示词表中对应位置的词在当前文档中出现的次数;
至此,我们就将所有的训练文档转换为数值表示。这里需要大家理解的是,将文档转换为数值向量并不是仅仅有上面这一种方法。
3.2 朴素贝叶斯训练
训练过程就是统计先验概率和每个特征词条件概率的过程,例如:P(领取|垃圾) 表示所有垃圾邮件中领取出现的次数占所有的词的比重:
| 先验概率 | 特征词条件概率 |
| P(垃圾) = 1/2 | P(领取|垃圾)=0.039215686 |
| P(正常) = 1/2 | P(百万|垃圾)=0.039215686 |
| P(大奖|垃圾)=0.039215686 | |
| … | |
| P(领取|正常)=0.0238095 | |
| P(百万|正常)=0.0238095 | |
| P(大奖|正常)=0.0238095 | |
| … |
至此,我们就训练结束了。
3.3 朴素贝叶斯推理
将待预测类别的文本数据转换为数值表示:
| 样本 | 标签 |
| 您的百万大奖正在等待您的领取。 | ? |
分词之后的结果:
| 样本 | 标签 |
| [‘百万’, ‘大奖’, ‘正在’, ‘等待’, ‘领取’] | ? |
转换为数值表示:
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
P(领取|垃圾) * P(百万|垃圾) * P(大奖|垃圾) * P(垃圾) = 0.039215686**3 = 6.0308628144529635e-05
P(领取|正常) * P(百万|正常) * P(大奖|正常) * P(正常) = 0.023809500**3 = 1.3497421984707377e-05
很显然属于垃圾邮件的分数较高,最终:
| 样本 | 标签 |
| 您的百万大奖正在等待您的领取。 | 垃圾 |
至此,我们已经通过朴素贝叶斯得到了垃圾邮件分类的结果。



冀公网安备13050302001966号