当前位置: 首页 > news >正文

朴素贝叶斯:用 “概率思维” 解决分类问题的经典算法

一、贝叶斯:从 “逆概” 问题走来的数学家

要理解朴素贝叶斯,得先回到它的 “源头”—— 贝叶斯公式,以及它要解决的核心问题:逆概问题

1. 贝叶斯的 “生不逢时”

托马斯・贝叶斯(Thomas Bayes,约 1701-1761)是英国数学家,他生前为解决 “逆概” 问题写了一篇文章,却在死后才被世人认可。正是这篇文章,奠定了 “贝叶斯方法” 的基础,成为如今机器学习、统计学、人工智能领域的核心思想之一。

2. 正向概率 vs 逆向概率:贝叶斯要解决的核心

我们先从两个简单的例子,理解 “正向” 与 “逆向” 的区别 —— 这是贝叶斯思想的关键。

  • 正向概率:已知 “因”,求 “果” 的概率。 比如:袋子里有 N 个白球、M 个黑球(已知 “因”:黑白球比例),伸手摸一个,问摸出黑球的概率(求 “果”:事件概率)。 这是我们从小学习的概率问题,直接用 “符合条件的数量 / 总数量” 就能计算。

  • 逆向概率:已知 “果”,求 “因” 的概率。 比如:事先不知道袋子里黑白球的比例(未知 “因”),但闭着眼摸出了 1 个黑球、2 个白球(已知 “果”:观测结果),问袋子里黑白球可能的比例是多少? 这就是贝叶斯要解决的 “逆概” 问题 —— 通过观测到的结果,反推背后 “原因” 的概率。

二、贝叶斯公式:用一个 “穿长裤” 的例子看懂推导

光说概念太抽象,我们用 PPT 里的 “校园男女生长裤 / 裙子” 例子,一步步推导出贝叶斯公式。这个例子特别直观,新手也能跟上。

已知条件

  • 校园里男生占 60%(P (Boy)=0.6),女生占 40%(P (Girl)=0.4);
  • 男生全部穿长裤(P (长裤 | Boy)=1.0,“|” 表示 “在… 条件下”);
  • 女生一半穿长裤、一半穿裙子(P (长裤 | Girl)=0.5)。

问题:迎面走来一个穿长裤的学生,他是女生的概率是多少?

也就是求 P (Girl | 长裤)—— 已知 “穿长裤” 这个 “果”,反推 “是女生” 这个 “因” 的概率。

step 1:计算 “穿长裤的男生” 和 “穿长裤的女生” 数量

假设校园总人数为 U,那么:

  • 穿长裤的男生数量 = U × P (Boy) × P (长裤 | Boy) = U × 0.6 × 1.0 = 0.6U;
  • 穿长裤的女生数量 = U × P (Girl) × P (长裤 | Girl) = U × 0.4 × 0.5 = 0.2U。

step 2:计算 “穿长裤的总人数”

穿长裤的总人数 = 穿长裤的男生 + 穿长裤的女生 = 0.6U + 0.2U = 0.8U。

step 3:推导 “穿长裤的人是女生” 的概率

“穿长裤的人是女生” 的概率 = 穿长裤的女生数量 / 穿长裤的总人数,代入上面的结果:
\(P(Girl|长裤) = \frac{U \times P(Girl) \times P(长裤|Girl)}{U \times P(Boy) \times P(长裤|Boy) + U \times P(Girl) \times P(长裤|Girl)}\)

这里发现一个关键:总人数 U 可以消掉!因为 U 是常数,不影响概率比例。于是公式简化为:
\(P(Girl|长裤) = \frac{P(Girl) \times P(长裤|Girl)}{P(Boy) \times P(长裤|Boy) + P(Girl) \times P(长裤|Girl)}\)

step 4:提炼出通用的贝叶斯公式

观察上面的简化公式,分母其实是 “穿长裤” 这个事件的总概率 P (长裤)(即所有可能 “原因” 导致 “穿长裤” 的概率之和)。 由此推广到通用场景:对于任意 “原因 H” 和 “结果 D”,贝叶斯公式为:
\(P(H|D) = \frac{P(H) \times P(D|H)}{P(D)}\)

公式中各个部分的含义:

  • P (H|D):后验概率(Posterior)—— 已知结果 D,反推原因 H 的概率(这是我们最终想求的);
  • P (H):先验概率(Prior)—— 在没有观测到结果 D 时,原因 H 本身发生的概率(比如 “女生占 40%”);
  • P (D|H):似然概率(Likelihood)—— 在原因 H 成立的条件下,出现结果 D 的概率(比如 “女生穿长裤的概率 50%”);
  • P (D):证据概率(Evidence)—— 结果 D 发生的总概率(所有原因导致 D 的概率之和,计算时可忽略,因为比较不同 H 时它是常数)。

三、朴素贝叶斯:“朴素” 在哪?

贝叶斯公式解决了 “逆概” 问题,但如果要处理多特征的分类任务(比如判断一封邮件是否为垃圾邮件,邮件包含多个单词),直接用贝叶斯公式会很复杂 —— 因为要计算 “多个特征同时出现” 的联合概率。

这时候,朴素贝叶斯的 “朴素” 假设就派上用场了: 假设所有特征之间相互独立,互不影响

正是这个 “朴素” 的假设,把复杂的联合概率简化成了 “单个特征概率的乘积”,让计算量大幅降低。比如判断邮件是否为垃圾邮件时,“邮件包含‘中奖’” 和 “邮件包含‘转账’” 这两个特征,被假设为独立事件。

四、实例 1:拼写纠正 —— 帮用户 “猜” 对单词

我们每天用输入法时,偶尔会输错单词(比如把 “top” 输成 “tlp”),输入法怎么知道我们真正想输什么?朴素贝叶斯就是背后的 “猜词逻辑” 之一。

问题定义

已知用户输入了一个不在字典中的单词 D(比如 “tlp”),求 “用户真正想输入的单词 h” 的概率,即 P (h|D)。我们需要找出概率最大的 h 作为纠正结果。

用朴素贝叶斯计算

根据贝叶斯公式:
\(P(h|D) = \frac{P(h) \times P(D|h)}{P(D)}\)

由于 P (D)(用户输入 D 的总概率)对所有候选 h 都是常数,比较不同 h 的概率时可忽略,因此只需计算:
\(P(h|D) \propto P(h) \times P(D|h)\)

其中:

  1. P (h):先验概率—— 单词 h 在日常使用中出现的频率。比如 “top” 比 “tip” 更常用,所以 P (top) > P (tip);
  2. P (D|h):似然概率—— 想输入 h,却输成 D 的概率(比如 “top” 输成 “tlp” 的概率,取决于两个单词的字符差异,差异越小概率越大)。

举个例子:用户输入 “tlp”,该纠正为 “top” 还是 “tip”?

  • 先看 P (D|h):“tlp” 和 “top” 差 1 个字符(l→o),和 “tip” 也差 1 个字符(l→i),所以 P (D|top) ≈ P (D|tip);
  • 再看 P (h):“top” 在语料中出现的频率远高于 “tip”,即 P (top) > P (tip);
  • 因此,P (top)×P (D|top) > P (tip)×P (D|tip),最终纠正为 “top”。

五、实例 2:垃圾邮件分类 —— 给邮件 “贴标签”

垃圾邮件分类是朴素贝叶斯最经典的应用之一。我们的目标是:给定一封邮件 D,判断它是垃圾邮件(h+)还是正常邮件(h-)。

问题定义

需比较两个后验概率:P (h+|D)(邮件是垃圾邮件的概率)和 P (h-|D)(邮件是正常邮件的概率),哪个大就归为哪一类。

step 1:拆解邮件特征

邮件 D 由多个单词组成(比如 D 包含 “中奖”“转账”“领取” 三个单词,记为 d1=“中奖”,d2=“转账”,d3=“领取”)。根据朴素贝叶斯的 “特征独立” 假设:
\(P(D|h+) = P(d1|h+) \times P(d2|h+) \times P(d3|h+)\)

(即 “垃圾邮件中同时出现 d1、d2、d3” 的概率,等于 “垃圾邮件中出现 d1”“垃圾邮件中出现 d2”“垃圾邮件中出现 d3” 的概率乘积)。

step 2:计算关键概率

  1. 先验概率 P (h+) 和 P (h-): 假设我们有一个邮件库,里面有 1000 封邮件,其中 300 封是垃圾邮件,700 封是正常邮件。那么: P(h+) = 300/1000 = 0.3,P(h-) = 700/1000 = 0.7。

  2. 似然概率 P (d|h+) 和 P (d|h-): 统计单词 d 在垃圾邮件 / 正常邮件中出现的频率。比如:

    • 垃圾邮件中 “中奖” 出现了 150 次,垃圾邮件总单词数为 10000,所以 P (“中奖”|h+) = 150/10000 = 0.015;
    • 正常邮件中 “中奖” 出现了 10 次,正常邮件总单词数为 50000,所以 P (“中奖”|h-) = 10/50000 = 0.0002。
  3. 计算 P (D|h+) 和 P (D|h-): 假设邮件 D 包含 “中奖”“转账”,且 P (“转账”|h+) = 0.02,P (“转账”|h-) = 0.0005。那么: P(D|h+) = 0.015 × 0.02 = 0.0003; P(D|h-) = 0.0002 × 0.0005 = 0.0000001。

step 3:比较后验概率

根据贝叶斯公式,忽略 P (D) 后: P(h+|D) ∝ P(h+) × P(D|h+) = 0.3 × 0.0003 = 0.00009; P(h-|D) ∝ P(h-) × P(D|h-) = 0.7 × 0.0000001 = 0.00000007。

显然,P (h+|D) > P (h-|D),因此这封邮件被判定为垃圾邮件

六、实战演练:从训练数据学朴素贝叶斯分类器

PPT 中给出了一个经典的训练数据案例,我们来简化理解如何用它学习分类器。

已知训练数据

样本序号特征 X1(取值 {1,2,3})特征 X2(取值 {S,M,L})类别 Y({1,-1})
11S-1
21M-1
31M1
41S1
51S-1
62S-1
72M-1
82M1
92L1
102L1
113L1
123M1
133M1
143L1
153L-1

任务:确定 x=(2, S) 的类别 Y

即求 P (Y=1|X1=2,X2=S) 和 P (Y=-1|X1=2,X2=S),哪个大归哪类。

step 1:计算先验概率 P (Y=1) 和 P (Y=-1)
  • 总样本数 15,Y=1 的样本有 9 个,所以 P (Y=1)=9/15=0.6;
  • Y=-1 的样本有 6 个,所以 P (Y=-1)=6/15=0.4。
step 2:计算条件概率(似然)

根据朴素假设,P (X1=2,X2=S|Y=k) = P (X1=2|Y=k) × P (X2=S|Y=k)(k=1 或 - 1)。

  • 对 Y=1: Y=1 的样本中,X1=2 的有 3 个(样本 8、9、10),所以 P (X1=2|Y=1)=3/9=1/3; Y=1 的样本中,X2=S 的有 0 个,所以 P (X2=S|Y=1)=0/9=0; 因此,P (X1=2,X2=S|Y=1)= (1/3) × 0 = 0。

  • 对 Y=-1: Y=-1 的样本中,X1=2 的有 2 个(样本 6、7),所以 P (X1=2|Y=-1)=2/6=1/3; Y=-1 的样本中,X2=S 的有 3 个(样本 1、5、6),所以 P (X2=S|Y=-1)=3/6=0.5; 因此,P (X1=2,X2=S|Y=-1)= (1/3) × 0.5 = 1/6 ≈ 0.1667。

step 3:比较后验概率
  • P(Y=1|x) ∝ 0.6 × 0 = 0;
  • P(Y=-1|x) ∝ 0.4 × (1/6) ≈ 0.0667。

因此,x=(2, S) 的类别为Y=-1

七、课堂练习:动手验证你的理解

试试用上面的训练数据,解决 PPT 中的两个问题:

  1. 当 X1=1,X2=L 时,属于哪一类?
  2. 当 X1=3,X2=L 时,属于哪一类?

(提示:步骤和上面一致,先算先验概率,再算条件概率,最后比较后验概率。答案可以在评论区交流哦~)

八、总结:朴素贝叶斯的 “简单与强大”

朴素贝叶斯之所以能成为经典算法,核心在于它的 “平衡”—— 简单却有效:

优点

  1. 计算快:无需迭代训练,只需统计概率,适合大规模数据;
  2. 数据需求低:少量数据就能训练,尤其适合样本稀缺场景;
  3. 可解释性强:基于概率公式,结果容易理解(比如 “因为包含‘中奖’,所以有 90% 概率是垃圾邮件”)。

缺点

  1. “朴素” 假设的局限性:现实中特征往往不独立(比如 “中奖” 和 “转账” 常同时出现在垃圾邮件中),可能影响精度;
  2. 对高频特征敏感:如果某个无关高频词(如 “的”“是”)未被过滤,可能干扰分类。

适用场景

  • 文本分类(垃圾邮件、情感分析、新闻分类);
  • 拼写纠正、推荐系统;
  • 小规模数据的快速分类任务。
http://www.dtcms.com/a/349858.html

相关文章:

  • ​Visual Studio + UE5 进行游戏开发的常见故障问题解决
  • 【区间DP】P1063 [NOIP 2006 提高组] 能量项链
  • 基于深度学习的人声分离系统设计与实现
  • Apache Commons Math_Java科学计算的利器
  • AP服务发现中两条重启检测路径
  • 南京魔数团:AR技术引领远程协作新纪元
  • C++ Core Guidelines 核心理念
  • ios webgl音频问题
  • 深入解析:为什么应该避免使用 atoi、atol 和 atof 函数
  • 集成算法概述与分类
  • 大数据毕业设计选题推荐-基于大数据的超市销售数据统计分析系统-Hadoop-Spark-数据可视化-BigData
  • 【opengl 实践】 windows下vscode配置遇到的问题
  • week4-[二维数组]幻方检测
  • 【Android】Activity和Fragment之间的通讯
  • 大型电动化工程机械设备智能施工试验场的网络设计方案
  • java基础(十五)计算机网络
  • 【栈 - LeetCode】739.每日温度
  • 深入理解JVM垃圾收集器:垃圾收集器
  • Vue3 + Golang Gin 实现客服实时聊天系统(WebSocket + Socket.IO 详解)
  • Maven、Spring Boot、Spring Cloud以及它们的相互关系
  • iptables 防火墙技术详解
  • 如何通过虚函数实现多态?
  • 文入门Ubuntu:从零到精通的Linux之旅
  • 数学建模-整数规划(IP)
  • FunASR语音识别框架流式识别模型切换
  • SpringBoot的条件装配原理
  • SpringBoot3集成Oauth2.1——10重启程序Token失效(RSA持久化)
  • Java项目-苍穹外卖_Day1
  • Visual Studio 2022调试Eigen库查看矩阵与向量的值
  • 大模型知识点之矩阵乘以向量