朴素贝叶斯学习

一、贝叶斯理论基础

(一)贝叶斯其人及理论背景

托马斯・贝叶斯(约 1701-1761)是英国数学家,贝叶斯方法源于他生前为解决 “逆概” 问题撰写的一篇文章。不过,他的研究在生前未受重视,直到死后,其作品才被世人认可,逐渐发展成机器学习领域的重要理论基础。

(二)正向概率与逆向概率

  1. 正向概率:已知事件的先验条件,计算某一结果发生的概率。比如,知道袋子里有 N 个白球和 M 个黑球,想知道伸手摸出黑球的概率,直接用黑球数量除以总球数(白球数量加黑球数量)就能得到。
  2. 逆向概率:事先不知道事件的先验条件(像袋子里黑白球的比例),通过观察已经发生的结果(比如摸出几个球的颜色),推测先验条件的概率分布。这是贝叶斯理论要解决的核心问题,也就是从 “结果” 反推 “原因”。

二、贝叶斯公式

(一)公式推导(以学生性别与着装为例)

1. 已知条件
  • 学校里男生占比 60%,女生占比 40%;
  • 所有男生都穿长裤;
  • 女生中一半人穿长裤,一半人穿裙子。
2. 正向概率问题

随机选一个学生,算他(她)穿长裤和穿裙子的概率:

  • 穿长裤的概率:用男生占比乘男生穿长裤的比例,加上女生占比乘女生穿长裤的比例,即 60%×100% + 40%×50% = 80%;
  • 穿裙子的概率:因为学生着装只有长裤和裙子两种情况,所以用 1 减去穿长裤的概率,得到 20%。
3. 逆向概率问题

迎面走来一个穿长裤的学生,推断他(她)是女生的概率:

  • 先算穿长裤的总人数(假设学校总人数为 U):U× 男生占比 × 男生穿长裤比例 + U× 女生占比 × 女生穿长裤比例;
  • 再算穿长裤的女生人数:U× 女生占比 × 女生穿长裤比例;
  • 最后用穿长裤的女生人数除以穿长裤的总人数,就能得到穿长裤的学生是女生的概率。而且计算过程中,学校总人数 U 会被抵消掉,不用考虑具体数值。

(二)贝叶斯公式通用形式

贝叶斯公式的核心是通过先验概率和条件概率,计算后验概率。简单来说,就是在知道事件 B 发生的情况下,想知道事件 A 发生的概率,等于在事件 A 发生的情况下事件 B 发生的概率,乘事件 A 本身发生的概率,再除以事件 B 发生的概率。

  • 后验概率:在事件 B 发生的条件下,事件 A 发生的概率;
  • 条件概率:在事件 A 发生的条件下,事件 B 发生的概率;
  • 先验概率:在没有其他信息时,事件 A 本身发生的概率;
  • 全概率:事件 B 发生的概率,可通过所有可能导致 B 发生的情况的概率之和计算。

三、朴素贝叶斯算法及实例

(一)朴素贝叶斯核心假设

朴素贝叶斯算法在贝叶斯公式的基础上,增加了 “特征独立性假设”:假设样本的各个特征之间相互独立,不会相互影响。这个假设能简化计算,让复杂的多特征概率问题变成单个特征概率的乘积,这也是 “朴素” 一词的由来。

(二)拼写纠正实例

1. 问题定义

当用户输入一个不在字典里的单词(记为 D,代表观测到的数据),要推测用户真正想输入的单词(记为 h,代表假设),也就是算在看到 D 的情况下,假设 h 成立的概率。

2. 概率计算

根据贝叶斯公式,在看到 D 的情况下 h 成立的概率,等于 h 本身发生的概率乘在 h 成立的情况下输入 D 的概率,再除以 D 发生的概率。

  • 对于不同的猜测(比如 h₁、h₂、h₃等),D 发生的概率是固定的,比较不同猜测的概率时可以忽略,所以只需比较 h 本身发生的概率乘在 h 成立的情况下输入 D 的概率;
  • h 本身发生的概率(先验概率):指猜测的单词 h 在正常文本中出现的频率,比如 “top” 出现的频率比 “tip” 高,那 “top” 的先验概率就更大;
  • 在 h 成立的情况下输入 D 的概率(似然概率):指用户想输入 h 却误输入 D 的概率,和字母在键盘上的位置、拼写相似度等有关。
3. 决策逻辑

计算不同猜测 h 的先验概率乘似然概率,选数值最大的 h 作为最终的纠正结果。比如用户输入 “tlp”,因为 “top” 的先验概率更高,且 “top” 误输成 “tlp” 的似然概率合理,所以优先推测用户想输入 “top”。

(三)垃圾邮件分类实例

1. 问题定义

给定一封邮件(记为 D,由 n 个单词 d₁、d₂、…、dₙ组成),判断它是不是垃圾邮件:

  • 假设 h₊:邮件是垃圾邮件;
  • 假设 h₋:邮件是正常邮件;
  • 比较在看到邮件 D 的情况下,h₊成立的概率和 h₋成立的概率,概率大的对应的类别就是分类结果。
2. 概率计算

根据贝叶斯公式和特征独立性假设:

  1. 先验概率计算
    • 垃圾邮件的先验概率:用邮件库中垃圾邮件的数量除以总邮件数量;
    • 正常邮件的先验概率:用邮件库中正常邮件的数量除以总邮件数量,也可以用 1 减去垃圾邮件的先验概率。
  2. 似然概率计算
    • 不做独立性假设时,要算在垃圾邮件中出现和当前邮件一模一样的邮件的概率,需要考虑每个单词出现的顺序和相互影响,计算起来很复杂;
    • 基于朴素贝叶斯的特征独立性假设,可简化成在垃圾邮件中每个单词出现的概率相乘。其中,某个单词在垃圾邮件中出现的概率,等于这个单词在所有垃圾邮件中出现的总次数除以所有垃圾邮件的总单词数。
  3. 后验概率比较
    • 同理,计算在正常邮件类别下,邮件 D 对应的概率(正常邮件的先验概率乘每个单词在正常邮件中出现的概率的乘积);
    • 比较垃圾邮件类别下的概率乘积和正常邮件类别下的概率乘积,前者大就判定为垃圾邮件,否则为正常邮件。

(四)算法应用练习(基于训练数据分类)

1. 已知条件(表 4.1 训练数据)
  • 特征 X₁的取值有 1、2、3 三种,特征 X₂的取值有 S、M、L 三种;
  • 类别标记有 1 和 - 1 两种;
  • 要学习朴素贝叶斯分类器,确定样本(2,S)、(1,L)、(3,L)对应的类别。
2. 核心计算步骤
  1. 计算先验概率
    • 统计训练集中类别为 1 和类别为 - 1 的样本数量,用类别为 1 的样本数除以总样本数,得到类别 1 的先验概率;用类别为 - 1 的样本数除以总样本数,得到类别 - 1 的先验概率。
  2. 计算条件概率
    • 对每个特征的每个取值,计算它在不同类别下的条件概率。比如,计算类别为 1 时,特征 X₁取 2 的频率;类别为 - 1 时,特征 X₂取 S 的频率;
    • 如果某个特征取值在某类别下没出现过(频率为 0),为了避免后续概率相乘结果为 0,要采用 “拉普拉斯平滑”。具体做法是,用该类别下该特征取对应值的样本数加 1,除以该类别总样本数加该特征的取值个数。
  3. 计算后验概率并分类
    • 对每个样本,分别计算它属于类别 1 和类别 - 1 的后验概率(不用考虑分母,只需计算先验概率乘对应特征取值的条件概率的乘积);
    • 哪个类别的后验概率大,就把样本归为哪个类别。

四、学习总结

  1. 贝叶斯核心思想:通过 “先验概率” 和 “似然概率” 计算 “后验概率”,实现从 “结果” 反推 “原因”,是一种基于概率的不确定性推理方法。
  2. 朴素贝叶斯的优势与局限
    • 优势:特征独立性假设简化了计算,对小规模数据表现较好,而且容易实现;
    • 局限:“特征独立” 的假设在现实场景中大多不成立(比如邮件里 “优惠” 和 “折扣” 高度相关),可能会影响分类的准确性;另外,要注意处理 “零概率” 问题(比如用拉普拉斯平滑)。
  3. 典型应用场景:除了拼写纠正、垃圾邮件分类,还能用于文本分类(如新闻分类)、情感分析、疾病诊断等领域,是机器学习中入门级但很实用的分类算法。
### 关于朴素贝叶斯算法的学习曲线 学习曲线是一种评估模型性能的重要工具,通常用来衡量随着训练样本数量增加时模型的表现变化情况。对于朴素贝叶斯算法而言,其学习曲线可以反映以下几个方面: #### 1. **定义与特性** 朴素贝叶斯算法的核心在于假设特征之间相互独立[^1]。这一假设虽然在现实中可能无法完全成立,但在许多场景下仍然表现良好。因此,在构建学习曲线时,可以通过观察不同规模的数据集上的误差率或准确性来分析模型的泛化能力。 #### 2. **学习曲线的特点** - 当数据量较小时,朴素贝叶斯可能会表现出较高的偏差(bias),因为此时模型尚未充分捕捉到数据分布的本质。 - 随着数据量逐渐增大,模型会更加接近真实概率分布,从而降低测试错误率并趋于平稳状态。 以下是通过 Python 实现的一个简单例子展示如何绘制朴素贝叶斯学习曲线: ```python import numpy as np from sklearn.model_selection import learning_curve from sklearn.naive_bayes import GaussianNB import matplotlib.pyplot as plt # 假设 X 和 y 是已有的数据集 gnb = GaussianNB() train_sizes, train_scores, test_scores = learning_curve( gnb, X, y, cv=5, scoring='accuracy', n_jobs=-1, train_sizes=np.linspace(0.1, 1.0, 10)) train_mean = np.mean(train_scores, axis=1) test_mean = np.mean(test_scores, axis=1) plt.plot(train_sizes, train_mean, label="Training Accuracy", color="blue") plt.plot(train_sizes, test_mean, label="Cross-validation Accuracy", color="green") plt.xlabel("Number of Training Samples") plt.ylabel("Accuracy Score") plt.title("Learning Curve for Naive Bayes Classifier") plt.legend(loc="best") plt.grid() plt.show() ``` 上述代码片段展示了如何利用 `sklearn` 库中的函数生成朴素贝叶斯分类器的学习曲线图,并将其可视化出来以便直观理解模型随样本数增长的变化趋势[^2]。 #### 3. **解释** 从图形上看: - 如果两条线都较低且差距不大,则说明可能存在欠拟合现象; - 若交叉验证得分远低于训练得分则表明过拟合风险较高;而理想状况应是两者均高且差异较小。 此外值得注意的是,“属性条件独立性假设”虽简化了计算复杂度却也可能引入一定误差,特别是在实际应用场景中此假定未必严格成立的情况下[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值