朴素贝叶斯分类的概念(一)

article/2025/10/15 15:52:36

朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集.速度快,可调参数少.非常适合为分类问题提供快速粗糙的基本方案.

作为一个数学小白,乍一听到朴素贝叶斯这个名词时一般都是晕的,根据多年的初等数学学习经验,贝叶斯应该是一个人,但是"朴素"是什么鬼?是不是还有不朴素的贝叶斯?其实我看这个模型已经好多次了.每一次看到那堆数学公式的时候我都是直接跳过看结论的.不过现在想想学习这件事情不能这么马虎,这么基础的一个概念,放在茫茫大算法中算是小儿科的存在,如果连这个都没搞懂那以后的机器学习算法还怎么看,以后论文还怎么看?于是我开始对贝叶斯定理做了一个较为完整的学习.也和大家一起分享一下

首先要说一下贝叶斯定理

在说贝叶斯定理前先说几个专有名词

  1. 条件概率,条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B),读作“在B条件下A的概率”。举个例子,事件A是这个人是女生,事件B是这个人扎小辫子.那么P(A|B)就是在这个人扎小辫子的情况下,这个人是女生的概率
  2. 先验概率,先验概率是指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现的概率。
  3. 全概率公式:全概率公式为概率论中的重要公式,它将对一复杂事件A的概率求解问题转化为了在不同情况下发生的简单事件的概率的求和问题。内容:如果事件B1、B2、B3…Bn 构成一个完备事件组,即它们两两互不相容,其和为全集;并且P(Bi)大于0,则对任一事件A有P(A)=P(A|B1)P(B1)+P(A|B2)P(B2)+...+P(A|Bn)P(Bn)或p(A)=P(AB1)+P(AB2)+...+P(ABn)),其中A与Bn的关系为交)
  4. 条件独立:如果P(X,Y|Z)=P(X|Z)P(Y|Z),或等价地P(X|Y,Z)=P(X|Z)则称事件X,Y对于给定事件Z是条件独立的,也就是说,当Z发生时,X发生与否与Y发生与否是无关的.

贝叶斯定理也可以简单的表示为

P(A|B)=P(A)P(B|A)/P(B)

或者它的复杂版本

这个公式有啥实际应用价值呢?听着貌似有点绕但好像并没有什么鸟用啊.

我引用百度百科的一个例子来说明

贝叶斯定理在检测吸毒者时很有用。假设一个常规的检测结果的敏感度与可靠度均为99%,也就是说,当被检者吸毒时,每次检测呈阳性(+)的概率为99%。而被检者不吸毒时,每次检测呈阴性(-)的概率为99%。从检测结果的概率来看,检测结果是比较准确的,但是贝叶斯定理却可以揭示一个潜在的问题。假设某公司将对其全体雇员进行一次鸦片吸食情况的检测,已知0.5%的雇员吸毒。我们想知道,每位医学检测呈阳性的雇员吸毒的概率有多高?令“D”为雇员吸毒事件,“N”为雇员不吸毒事件,“+”为检测呈阳性事件。可得

  • P(D)代表雇员吸毒的概率,不考虑其他情况,该值为0.005。因为公司的预先统计表明该公司的雇员中有0.5%的人吸食毒品,所以这个值就是D的先验概率。

  • P(N)代表雇员不吸毒的概率,显然,该值为0.995,也就是1-P(D)。

  • P(+|D)代表吸毒者阳性检出率,这是一个条件概率,由于阳性检测准确性是99%,因此该值为0.99。

  • P(+|N)代表不吸毒者阳性检出率,也就是出错检测的概率,该值为0.01,因为对于不吸毒者,其检测为阴性的概率为99%,因此,其被误检测成阳性的概率为1-99%。

  • P(+)代表不考虑其他因素的影响的阳性检出率。该值为0.0149或者1.49%。我们可以通过全概率公式计算得到:此概率 = 吸毒者阳性检出率(0.5% x 99% = 0.00495)+ 不吸毒者阳性检出率(99.5% x 1% = 0.00995)。P(+)=0.0149是检测呈阳性的先验概率。用数学公式描述为:

  • 根据上述描述,我们可以计算某人检测呈阳性时确实吸毒的条件概率P(D|+):

P(D|+) = P(+|D)P(D)/(P(+|D)P(D)+P(+|N)P(N))=0.99 *0.005/0.0149=0.332215

尽管我们的检测结果可靠性很高,但是只能得出如下结论:如果某人检测呈阳性,那么此人是吸毒的概率只有大 约33%,也就是说此人不吸毒的可能性比较大。我们测试的条件(本例中指D,雇员吸毒)越难发生,发生误判的可能性越大。

但如果让此人再次复检(相当于P(D)=33.2215%,为吸毒者概率,替换了原先的0.5%),再使用贝叶斯定理计算,将会得到此人吸毒的概率为98.01%。但这还不是贝叶斯定理最强的地方,如果让此人再次复检,再重复使用贝叶斯定理计算,会得到此人吸毒的概率为99.8%(99.9794951%)已经超过了检测的可靠度。

所以大家可以看到在检测学上,先验条件很重要,很多人都会潜意识的认为P(A|B)约等于P(B|A),实际上这两个关系差别有可能会非常大.吸毒的人检测到的敏感度是阳性的概率是99%,那么大家潜意识里面就会认为敏感度检测到阳性99%就是吸毒的了.实际上这个是有问题的.拿我一开始举的例子来说,穿裙子的人是女生的概率为99%,但是女生一定会穿裙子吗?这得看今天一共有多少人穿裙子来了.

写到这里要补充一段了,我把以上的文字给了一位不懂贝叶斯的人看了一遍,她提了两个问题:

在百度百科关于吸毒者的这个例子里面有这么一段

我们测试的条件(本例中指D,雇员吸毒)越难发生,发生误判的可能性越大。但如果让此人再次复检(相当于P(D)=33.2215%,为吸毒者概率,替换了原先的0.5%),再使用贝叶斯定理计算,将会得到此人吸毒的概率为98.01%。但这还不是贝叶斯定理最强的地方,如果让此人再次复检,再重复使用贝叶斯定理计算,会得到此人吸毒的概率为99.8%(99.9794951%)已经超过了检测的可靠度。

她的问题是:为什么这个人再一次复检的时候吸毒概率是98%了?如果换到我另外一个例子里面的话,第一次检测到一个人是女孩子如果她穿裙子的概率是33%,那么第二次再检查一下这个女孩子她穿裙子的概率就是98%了吗?完全不符合逻辑啊

当时我被她这个举例一把问懵了.好像很有道理的样子.但是实际上是举例子的问题,在吸毒者的那个例子里面,吸毒者第一次检测是阳性,但是这个结果可能是环境误差导致的,下一次检测的时候是否是阳性是概率性问题.但是一个人检测到是女孩子,那么下一次她再检测不是女孩子的概率我只能说很低,除非她这个过程抽空去做了一个变性手术.这里面的最大问题是事件"这个人是个女孩子"和"检测"这个动作的关系,检测这个动作往往都带有时间和空间属性,在吸毒者的事件里面,我们把这个事件表述的详细一些,假设我们的检测时间间隔半天,并且使用A仪器进行检测.那么"雇员在上午使用A仪器检测到是阳性"这个事件就里面的时间和地点就会影响到事件的最终结果,因此是一个相对随机的事件.但是换到"这个人上午在操场上检测到是女孩子"这个事件,我不认为这个人下午去教室里面就会检测到是男孩子.所以在时间空间上并没有影响.所以百度的这个例子是有一定的实际运用场景下给出的.需要具体问题具体分析.

说完了贝叶斯定理,下面来说一说朴素贝叶斯定理是什么玩意儿

朴素贝叶斯定理的朴素,是指给定目标下,贝叶斯定理中的各个条件互相独立,即公式中的B1,B2,.....Bn互相独立

再回忆一下刚才我们写到的什么是条件独立,条件独立的公式:P(X,Y|Z)=P(X|Z)P(Y|Z)

好了,又到了举例子的时间了.我们举例恒大今天对战权健的比赛

根据贝叶斯定理

P(恒大赢球|上郜林,上金英权,上曾诚,上高拉特) = P(恒大赢球)*P(上郜林,上金英权,上曾诚,上高拉特|恒大赢球)/P(上郜林,上金英权,上曾诚,上高拉特)

再根据朴素贝叶斯的规则:所有的条件都是独立的.也就是说

P(上郜林,上金英权,上曾诚,上高拉特|恒大赢球) = P(上郜林|恒大赢球)*P(上金英权|恒大赢球)*P(上曾诚|恒大赢球)*P(上高拉特|恒大赢球)

P(上郜林,上金英权,上曾诚,上高拉特) = P(上郜林)*P(上金英权)*P(上曾诚)*P(上高拉特)

将这个代入原式中,可以得到

P(恒大赢球|上郜林,上金英权,上曾诚,上高拉特) = P(上郜林|恒大赢球)*P(上金英权|恒大赢球)*P(上曾诚|恒大赢球)*P(上高拉特|恒大赢球)*P(恒大赢球)/P(上郜林)*P(上金英权)*P(上曾诚)*P(上高拉特)

根据样本数据,我们可以很轻易的统计到等式右边的几个概率.

这里就会有同学问了:"等等等等,为啥要假设条件之间是相互独立的呢?"

因为实际的统计中,条件远远不止这么几个,如果有几十个条件的话,想要求出类似于P(上郜林,上金英权,上曾诚,上高拉特|恒大赢球)的概率就会发现由于数据的稀疏性,统计出来的结果往往很有可能是0.这样的统计结果是不合适也是没有意义的.

因此朴素贝叶斯的朴素实际上指的就是条件独立性的假设.这个假设实际上非常的强势,因为现实生活中条件之间或多或少会有一些联系.这个假设虽然使得算法变得简单了,但是有时候也会出现一些分类不准的问题.

根据我们最终得到的朴素贝叶斯的公式,我们会发现所有的统计维度都是二维的,因此朴素贝叶斯分类的存储的时空开销很小,这个也是朴素贝叶斯算法的优势之一

因为朴素贝叶斯算法的强制假设并不符合现实情况,所以在条件个数比较多或者条件之间关联性比较大的情况下分类效果会明显变差

这一章我们详细的介绍了什么是朴素贝叶斯,包括贝叶斯是啥,朴素又是啥,为啥会这么用,公式是怎么推导出来的.在下一个章节中,我将会详细的介绍一下朴素贝叶斯分类中的集中典型算法,包括高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯,树增强型朴素贝叶斯等朴素贝叶斯算法.


http://chatgpt.dhexx.cn/article/bra0Zfyi.shtml

相关文章

Python3 实现朴素贝叶斯分类

Python3 实现朴素贝叶斯分类 贝叶斯定理朴素贝叶斯源代码样例测试 贝叶斯定理 贝叶斯定理是由已知事件概率和条件概率计算未知条件概率的概率推理算法,其公式如下: 其中,P(Bi|A)是要计算的目标条件概率,表示事件 A 发生的条件下…

浅谈贝叶斯分类

贝叶斯分类 贝叶斯分类是一类分类算法的总称,以贝叶斯定理为基础。其中我们较为熟悉的朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。 贝叶斯网络 贝叶斯网络是一种概念图模型。概率图模型就是用图论和概率论的知识,利…

基于Python实现的图片贝叶斯分类器分类

使用流程及应用展示: 1. 选择图片: 控制台版本从命令行输入 当直接回车时将读取默认路径图片(./assets/生活照-武.jpg),相对路径是从打开程序的文件夹开始的,若输入路径无效或不可读将继续询问输入 GUI 从文件浏览器…

【贝叶斯分类4】贝叶斯网

文章目录 1. 半朴素贝叶斯分类器知识回顾2. 贝叶斯网学习笔记2.1 引言2.2 知识卡片2.3 概率图模型(PGM)2.3.1 引言2.3.2 为什么引入概率图?2.3.3 概率图的三个基本问题(表示,学习,推断) 2.4 贝叶斯网2.4.1 贝叶斯网的表达2.4.2 结…

机器学习算法-朴素贝叶斯分类

机器学习算法--朴素贝叶斯分类 引入贝叶斯决策论条件概率和全概率公式贝叶斯推断和朴素贝叶斯推断拉普拉斯平滑 代码实例1、言论过滤器2、垃圾邮件过滤器 代做 引入 贝叶斯决策论(Bayesian decision theory)是概率论框架下实施决策的基本方法。对分类任务来说,在所有…

【ML】贝叶斯分类和朴素贝叶斯分类

一、介绍 贝叶斯定理是英国数学家托马斯贝叶斯提出的,为了解决一个“逆概率”问题。 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种…

机器学习之朴素贝叶斯分类

朴素贝叶斯分类 贝叶斯定理和基础概率论朴素贝叶斯高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别几种朴素贝叶斯实战总结 贝叶斯定理和基础概率论 概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述&…

机器学习--朴素贝叶斯分类函数

一、前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独…

机器学习之贝叶斯算法图像分类

数据集:数据集采用Sort_1000pics数据集。数据集包含1000张图片,总共分为10类。分别是人(0),沙滩(1),建筑(2),大卡车(3),恐龙&#xff…

使用 Python 进行朴素贝叶斯分类

定义 在机器学习中,贝叶斯分类器是一种简单的概率分类器,它基于应用贝叶斯定理。朴素贝叶斯分类器使用的特征模型做出了很强的独立性假设。这意味着一个类的特定特征的存在与其他所有特征的存在是独立的或无关的。 独立事件的定义: 两个事件…

数据分类《二》贝叶斯分类

本博客是参考《数据仓库与数据挖掘技术》以及诸多道友的blog。仅作为自己学习的一个总结。 贝叶斯分类是一种基于统计学的分类方法,可以预测一个类成员关系的可能性。数据挖掘主要使用两种分类,朴素贝叶斯和贝叶斯网络方法。前者使用贝叶斯进行预测&…

贝叶斯分类及其代码

学期末的综述报告我选择了贝叶斯分类,既然已经写了就将它分享一下。 主要目的就是以教促学。 如有问题欢迎在评论区进行讨论。 随着现代社会信息技术的发展,对于数据的挖掘越来越重要,分类是数据挖掘中应用领域极其广泛的技术之一[1]&#…

栈和队列、

目录 1、栈: 1.1、栈的概念及结构: 1.2、栈的实现: 1.2.1、test.c源文件: 1.2.2、Stack.c源文件: 1.2.3、Stack.h头文件: 1.3、例题1: 2、队列: 2.1、队列的概念及结构&…

栈和队列——表达式求值大全

表达式求值 一.关于三种表达式的分类 中缀表达式:即我们最为常见的表达式,运算符号位于参与运算的连个操作数中间的表达式称作中缀表达式前缀表达式:前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将…

栈与队列-

基础 stl中栈和队列不是容器,而是容器适配器。它们提供接口,由其他容器实现。 20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否…

数据结构----栈和队列

xdm这玩意我不会导入,只能截图了。 目录 栈篇 1.1栈 1.2.栈操作数据元素的两种动作: 2.代码实现 2.1初始化和销毁 2.2插入 2.3删除和判空 2.4返回栈顶值,计算栈长 队列篇 3.1队列 4.代码实现 4.1初始化和销毁和判空 4.2入列 4.3出列 4.4…

栈(Stack)和队列(Queue)详解

1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 “一对一” 数据的线性存储结构,如图 1 所示。 图 1 栈存储结构示意图 从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘…

栈和队列--栈

1、顺序栈 一组地址连续的存储单元加一个标识栈顶元素的指针。 #define MaxSize 50 //定义栈中最大元素个数 typedef struct{ ElemType data[MaxSize];//存放栈中的元素int Top;//栈顶指针 }SqStack;栈空:s.top-1 栈满:s.topMaxSize-1 栈长&#xff…

什么是栈?什么是队列?栈与队列的特点

栈 栈(Stack)是限定在仅在表尾插入的线性表。 因此对于栈来说,表尾具有特殊的含义。我们把表尾称作栈顶(top),把表头称作栈底(bottom)。不含元素的栈称为空栈。 想象一下进栈的顺序…

栈和队列——相关例题

文章目录 一、栈例题——模拟栈具体实现1. 模板1.1 代码注解1.2 实现代码 2. STL2.1 代码注解2.2 实现代码 二、栈例题——表达式求值具体实现1. 实现思路2. 代码注解3. 实现代码 三、单调栈例题——单调栈具体实现1. 实现思路2. 实现代码 四、队列例题——模拟队列具体实现1. …