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

article/2025/10/15 21:33:59
一、介绍

贝叶斯定理是英国数学家托马斯·贝叶斯提出的,为了解决一个“逆概率”问题。

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

贝叶斯算法和决策树、SVM 一样,是分类算法。用来衡量标签和特征之间的概率关系,属于有监督学习算法。

因为贝叶斯是基于概率论的算法,了解算法之前,需要了解概率论的几个概念:

  • 联合概率:A事件和B事件同时发生的概率,P(AB)或者P(A,B)、P(A∩B)
  • 条件概率:P(B|A): A事件发生的条件下,B事件发生的概率; P(A|B): B事件发生的条件下,A事件发生的概率
  • 先验概率:事件发生前的预判概率。可以是基于历史数据的统计,可以由背景常识得出,也可以是人的主观观点给出。一般都是单独事件概率,如P(A),P(B)
  • 后验概率:事件发生后求的反向条件概率;或者说,基于先验概率求得的反向条件概率。概率形式与条件概率相同。

P(AB) = P(BA)

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

通过 P ( A ∣ B ) P(A|B) P(AB)来求 P ( B ∣ A ) P(B|A) P(BA): P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) {P(B|A)}=\frac {P(A|B)*P(B)}{P(A)} P(BA)=P(A)P(AB)P(B)

分母可以根据全概率公式分解为:
在这里插入图片描述
最终公式变为:
在这里插入图片描述
举例说明
假设以下是医院病人的症状和职业的特征,对应疾病标签也如图所示:
在这里插入图片描述
那么,现在又来了第7个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
根据贝叶斯公式计算:

P(A|B) = P(B|A) P(A) / P(B)
P(感冒|打喷嚏x建筑工人)= P(打喷嚏x建筑工人|感冒) x P(感冒)/ P(打喷嚏x建筑工人)# 假定"打喷嚏""建筑工人"这两个特征是独立的,因此,上面的等式就变成了
P(感冒|打喷嚏x建筑工人)= P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒)/ P(打喷嚏) x P(建筑工人)其中:
P(打喷嚏|感冒):感冒发生的条件下,是打喷嚏引起的概率【查表可知3个样本,2个是打喷嚏】= 2/3=0.66P(建筑工人|感冒):感冒发生的条件下,是建筑工人的概率【查表可知3个样本,1个是建筑工人】= 1/3=0.33P(感冒):6个样本中有3个是感冒= 3/6=0.5
P(打喷嚏)=3/6=0.5
P(建筑工人)=2/6=0.33所以:   
P(感冒|打喷嚏x建筑工人)= 0.66 x 0.33 x 0.5 / 0.5 x 0.33= 0.66

因此,这个打喷嚏的建筑工人,有 66% 的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。

朴素贝叶斯中的“朴素”一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。

朴素贝叶斯分类的优缺点
优点:

  • (1) 算法逻辑简单,易于实现
  • (2)分类过程中时空开销小

缺点:

  • 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
  • 而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
二、朴素贝叶斯的种类
  1. 高斯朴素贝叶斯:如果特征 x 是连续型变量。可以假设 x 服从高斯分布(正态分布)。根据正态分布的概率密度函数即可计算出P(X | Y=1);

  2. 多项式朴素贝叶斯:假设概率分布是服从一个简单多项式分布。多项式分布具体解释为:实验包括 n 次重复试验,每项试验都有不同的可能结果。在任何给定的试验中,特定结果发生的概率是不变的。比如:掷骰子在[1,2,3,4,5,6]中取值,6 种结果互不干涉,且只要样本量足够大 ,概率都是 1/6 。这就是一个多项分布;

  3. 伯努利朴素贝叶斯:就是数据集中可以存在多个特征,但每个特征都是二分类的,可以以布尔变量表示,也可以表示 为{0,1}或者{-1,1}等任意二分类组合。比如抛硬币。

参考

https://zhuanlan.zhihu.com/p/78297343

https://zhuanlan.zhihu.com/p/26262151

https://zhuanlan.zhihu.com/p/34687829

https://my.oschina.net/airship/blog/1519643

https://www.cnblogs.com/chenqionghe/p/12598786.html

https://mp.weixin.qq.com/s/lusrr-e9gtrZo63cuETOzg


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

相关文章

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

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

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

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

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

数据集:数据集采用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. …

【栈和队列】

大家好,这里是针对栈和队列做的一些总结归类,主要是介绍了栈和队列的相关操作,特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步! 文章目录 一:栈1.1 栈的概念及结构1.2 栈的实现1.3 典型案例…

栈、队列

顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈项元素在顺序栈中的位置。通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C…

栈、队列、数组

栈 定义 #include <stdio.h>/* 栈只允许在栈顶插入删除操作的线性表Last Insert First Out. */// 顺序栈#define MaxSize 10typedef struct {int data[MaxSize]; // 静态数组存放栈元素int top; // 栈顶指针 } SqStack; 栈顶指针指向栈顶元素的栈 空为-1 // 栈顶指针指…

使用SQL进行两个表关联查询(inner)

结果显示 公司类型表 公司表 实现方式 SELECTt_company.id,cName, typeName, cDescribe, t_company.modifyTime, t_company.createTime FROMt_company INNER JOIN t_company_type ON t_company.cType t_company_type.id代码解析 SELECT 显示字段,如果两个表都有字段,则需要…

sql进行两个关联表,根据其中一个表的一个属性进行条件查询查询

我最近遇到了表的查询,但是通过查询发现,网上的sql的大神,写的文章到底是什么玩意? 我打算自己写一个sql专栏,特意讲解sql的使用,来帮助大家 这篇文章技术指导为sql进行两个关联表,根据其中一个表的一个属性进行条件查询查询 假设只有两张表,其中一张表最后一个外键连…

SQL关联查询详解,SQL JOIN详解

关联查询&#xff0c;也称为多表查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;也…