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

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

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

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.pswp.cn/web/95006.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt/C++开发监控GB28181系统/视频点播主码流子码流/动态切换码流/支持海康大华/全网唯一

一、前言说明 目前市面上的国标监控系统,没有看到可以切换码流的,都是默认主码流,包括easynvr、livegbs、wvp等,很是奇怪为什么他们不做呢?难道没有用户反馈需要这个?我这就遇到过一些用户需要能够切换主码…

【 MYSQL | 基础篇 四大SQL语句 】资料位于文章末尾

摘要:本文先介绍数据库 SQL 的核心概念,接着阐述 SQL 通用语法与 DDL、DML、DQL、DCL 四大分类,随后详细讲解各类语句操作,包括 DDL 的数据库与表操作及数据类型,DML 的数据增删改,DQL 的查询语法与功能&am…

Webrtc支持FFMPEG硬解码之Intel

Intel QSV下载编译git clone https://github.com/lu-zero/mfx_dispatch.git1.使用CMake生产VS工程编译生成libmfx.lib文件 头文件为mfx文件夹libmfx---include---mfx---lib---libmfx.libWebrtc中ffmpeg的修改因为Webrtc中的ffmpeg是使用gn进行编译的,所以这里先找到…

【二叉树(DFS) - LeetCode】437. 路径总和 III

437. 路径总和 III 题解:DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullp…

【Python】shutil.make_archive() 方法详解

文章目录功能概述函数签名核心参数详解1. base_name2. format3. root_dir4. base_dir使用示例将 /home/user/project/data 目录打包为 data.tar.gz,并保存到 /home/user/backups/打包当前工作目录下的 docs 文件夹为 zip 文件替代方案总结shutil.make_archive() 是 …

CAN总线(Controller Area Network Bus)控制器局域网总线(二)

6、错误帧 总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备。7、过载帧 当接收方收到大量数据而无法处理时&#…

LeetCode 317 离建筑物最近的距离

LeetCode 317 题的详细题目信息如下:题目名称Shortest Distance from All Buildings(中文译名:离建筑物最近的距离)题目描述给你一个由 0、1 和 2 组成的二维网格,其中:0 代表空地1 代表建筑物2 代表障碍物…

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之PE之SystemPrompt:analysis_claude_code的简介、使用方法、案例应用之详细攻略 AI之CodeTool之Kode:Kode(claude_code风格)的简…

网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?

目录 1. 拦截器:Retrofit 的“超级管理员” 拦截器的本质 为什么用拦截器? 2. 日志拦截器:让请求和响应“现原形” 引入日志拦截器 实现日志拦截器 日志输出示例 生产环境注意事项 3. 重试拦截器:网络不稳定也能稳如狗 设计重试逻辑 集成到 Retrofit 优化重试策…

LeetCode - 283. 移动零

题目 283. 移动零 - 力扣(LeetCode) 思路 我们使用左右两个指针:左指针left指向已处理好的非零元素的末尾位置,右指针right用于遍历数组。 算法步骤: 初始化left为-1(表示还没有处理任何非零元素&…

Redis不同场景下的注意事项

Redis常见的 使用场景: 缓存系统(核心场景) 存储热点数据,减少数据库访问压力。提升接口响应速度。技术点: 用String/Hash 存储结构化数据结合过期时间(TTL)和缓存淘汰策略(如LRU)管理内存。解决缓存问题:穿…

【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN

背景意义 随着城市化进程的加快,高速公路建设与维护工作日益频繁,施工区域的安全管理成为亟待解决的重要问题。在高速公路施工区域,工人和设备的安全是首要考虑因素,而有效的物体检测系统能够显著提高施工现场的安全性与工作效率。…

如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全链路追踪如何让FastAPI微服务架构的每个请求都无所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全链路追踪是现代微服务架构中监控系统行为的核心技术,通…

Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式

文章目录测试环境机器配置被压缩文件WinRAR7zipLinux子系统准备极限压缩减小字典的极限压缩7zipWin11准备极限压缩7zip系统内置右键压缩菜单极限压缩总结:Win11 的压缩软件的最佳配置和使用方式测试环境 机器配置 Win11系统 16GB内存 8核CPU 被压缩文件 文件夹内…

CMake构建学习笔记22-libxml2库的构建

在上一篇文章《CMake构建学习笔记21-通用的CMake构建脚本》中,笔者封装了一个通用的cmake构建脚本cmake-build.ps1,那么这里笔者就尝试通过这个脚本来构建libxml2库。 libxml2是GNOME项目下的XML库,虽然比不上TinyXML-2轻量,但是…

虚拟私有网络笔记

VPN应用场景 ——VPN概述  利用公共网络来构建的私人专用网络称为虚拟私有网络(VPN, Virtual Private Network),用于构建VPN的公共网络包括Internet 、帧中继、ATM等。在公共网络上组建的VPN象企业现有的私有网络 一样提供安全性…

Python 轻量级 HTML 解析器 - lxml入门教程

文章目录初始化解析器路径查找查找所有标签查找指定 id 的标签查找指定 class 的标签查找包含指定 class 的标签复杂路径查找示例1示例2常见操作获取所有标签的链接获取 div 标签的文本内容, 其他标签类似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成视频扩散模型的多主体与动作定制化

VideoMage:文本生成视频扩散模型的多主体与动作定制化 paper title:VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University发表在CVPR 2025的工作 Code:链接 图1. 多主体与动作定制化…

OpenCV轮廓近似与Python命令行参数解析

在计算机视觉任务中,轮廓分析是目标检测、形状识别的核心步骤。而approxPolyDP函数作为轮廓简化的关键工具,能有效减少轮廓顶点数量,降低计算复杂度;同时,argparse库则能让Python脚本更灵活、易用。本文将结合具体案例…

基于Springboot在线音乐推荐平台

目录 一、项目介绍 二、功能介绍 三、核心代码 四、效果图 源码获取 前言 在经济繁荣的浪潮过去后,社会的焦点逐渐从物质追求转向了文化和生活品质的提升[1]。文化生活的繁荣成为人们关注的焦点之一,而音乐,作为文化的一部分&#xff0…