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

article/2025/10/15 22:10:44

本博客是参考《数据仓库与数据挖掘技术》以及诸多道友的blog。仅作为自己学习的一个总结。

贝叶斯分类是一种基于统计学的分类方法,可以预测一个类成员关系的可能性。数据挖掘主要使用两种分类,朴素贝叶斯和贝叶斯网络方法。前者使用贝叶斯进行预测,后者是一个带有注释的有向无环图,以有效表示大变量集的联合概率分布,适用于分析大量变量之间的相互关系,贝叶斯理论应用于文档分类,医疗诊断,预测,推理和归纳等数据挖掘应用中。

朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理。另外,它是一种生成模型(generative model),采用直接对联合概率P(x,c)建模,以获得目标概率值的方法。

文章目录

预备知识

  1. 先验概率与后验概率
  2. 贝叶斯定理

朴素贝叶斯分类器

  1. 何为朴素:属性条件独立假设
  2. 分类准则
  3. 离散型与连续属性值的分别处理

例子讲解

拉普拉斯修正

预备知识

先验概率与后验概率

翻译:在贝叶斯统计推断论中,一个未确定数目的先验概率分布(一般简称为先验)是一种表达了某人对于该数目的信仰的一种概率分布,这种信仰是没有考虑到一些(当前的)证据的。

解释:通俗来说,对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。

举例来说,假如你考试没及格,老师要求大家拿卷子回家给爸妈签字,按照你已有的对爸妈脾气的了解,以及他们对自己成绩的要求,你在不考虑其它任何因素的情况下,自己已经有了一个对把卷子拿回家给他们签字的后果预估(先验):

  • 被胖揍一顿:70%
  • 被简单地数落一下:20%
  • 被温情地鼓励:10%

暂停,让我们再来看看后验概率是什么:

In Bayesian statistics, the posterior probability of a random event or an uncertain proposition is the conditional probability that is assigned after the relevant evidence or background is taken into account.  "Posterior", in this context, means after taking into account the relevant evidence related to the particular case being examined.

翻译:在贝叶斯推断中,一个随机事件的后验概率是指:当与事件相关的一些证据或背景也被考虑进来时的条件概率。“后验”在这个语境下即指的是在考虑了与要被检验的特定事件相关的证据。

所以后验概率就是在先验概率的基础上加了一层“考虑”:结合我们已有的知识,将与待检验事件(即我们正在估计概率的随机事件)相关的因素也考虑进去后,我们队随机事件的概率的预估。

回到卷子签字的例子。

假设,你惶恐地拿着卷子回到家中,还没开口说考试的事,就看到爸爸妈妈在那儿雀跃,好似疯了一样。你一问,他们告诉你说家里中了1亿的大奖,以后就直接过上荣华富贵的生活啦!

这时,你小眼珠子一转,根据当前家里中了亿元大奖的情况,对把不及格试卷给爸妈签字的后果有了新的预估(后验):

被胖揍一顿:0%
被简单地数落一下:0%
被温情地鼓励:100%
没错,因为你觉得按现在家里的情况来看,爸妈会觉得你这一次考试没及格算个屁,以后直接花钱把你送到国外去留学,回来继承家产就是了,什么考试啥的见鬼去吧~~

 这就是先验概率和后验概率的区别:先验概率基于已有知识对随机事件进行概率预估,但不考虑任何相关因素(P©)。后验概率基于已有知识对随机事件进行概率预估,并考虑相关因素(P(c|x))。

  • 贝叶斯定理(Bayesian Theorem)

贝叶斯定义(摘自维基百科):

In probability theory and statistics, Bayes’ theorem (alternatively Bayes’ law or Bayes’ rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person’s age.

翻译:在概率论与统计学中,贝叶斯定理(或称贝叶斯法则、贝叶斯规则)描述了一个事件的可能性,这个可能性是基于了预先对于一些与该事件相关的情况的知识。举例来说,如果癌症和年龄有关,那么使用贝叶斯定理的话,相比根本不了解关于此人的任何其他信息,知道了它的年龄的话就可以用来更准确地帮助评估它得癌症与否的概率。

那么其实很明显了,这里的“可能性”也是考虑了与随机事件相关的因素的,所以贝叶斯定理所阐述的也就是后验概率的获得方法。

那么,落实到实际的问题当中,我们想获得的核心结果其实也就是P(c|x),即我们想知道,在考虑了一些现有的因素后,随机事件会以多大概率出现各种情况,通过参考这个结果,我们针对性地作出决策。

朴素贝叶斯分类器

何为“朴素”:属性条件独立性假设

由于朴素贝叶斯分类器在这种naive的假设下仍能在实际问题中取得比较好的效果,因此这个假设的不合理性可以暂时放下不谈。

离散型属性与连续型属性值的分别处理:

如果是离散型属性,我们只需要计算每个属性取值占所有样本的数量比例就行

如果xi是连续值属性,那么我们肯定不能这样做,而是采用概率密度函数,即假定p(si)

例子

假设我们的任务是根据一个西瓜的特征来在它被吃之前判断它是否是个好瓜。现在我们有以下数据集:

现在,基于已有的数据,我们想利用朴素贝叶斯算法训练出一个分类器,以判断一个具有特征{色泽=青绿,根蒂=蜷缩,敲声=浊响,纹理=清晰,脐部=凹陷,触感=硬滑,密度=0.697,含糖率=0.460}的测试样例瓜([Math Processing Error] x_{test}x 
test)是否为好瓜。

其次,我们计算每个属性值的条件概率[Math Processing Error] P(x_i|c)P(x i∣c):

对于离散值属性:

è¿éåå¾çæè¿°

对于连续值属性:

è¿éåå¾çæè¿°

最后,我们计算测试瓜x test

è¿éåå¾çæè¿°

很明显,测试瓜是好瓜的概率0.038远大于测试瓜是坏瓜的概率6.80×[Math Processing Error] 10^{-5}10 
−5 ,于是分类器判断测试瓜为好瓜。


拉普拉斯修正(Laplacian correction)

朴素贝叶斯分类器在实际使用中还需要注意的一个问题是:若某个离散类型的属性值在训练集中没有与某个类同时出现过,那么当我们使用对其进行估计时,会等于0,而若某个样本只是在属性i上恰好取值为[Math Processing Error] x_ix i,但是它其它的属性非常符合这个类型c的特征,于是在用最后的连乘式计算该样本属于该类的概率时,不管其它的属性如何取值,就会因为p(xi|c)这一个零值导致分类器认为该样本属于这个类型c的概率为0,这显然是不合理的。

比如在上面的西瓜训练集中,好瓜当中暂时没有具备特征{敲声=清脆}的样本,于是对于一个“敲声=清脆”的测试例:

那么,不管该测试瓜在其它属性上有多么接近好瓜,都会被直接判定为是好瓜的概率为0。

这个问题本质上是由于我们的训练集不够完整,没有包括足够多的样本。但是,为了避免这个问题的出现,我们通常还是在估计概率值时,对其进行“平滑”(smoothing)操作,通常使用“拉普拉斯修正”(Laplacian correction)。
 


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

相关文章

贝叶斯分类及其代码

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

SQL-多表关联查询详解

为了在工作中能更顺利的使用多表关联查询&#xff0c;今天这篇博客就写这个内容了。 在讲解多表关联查询之前&#xff0c;先生成测试表。 登录scott用户&#xff0c;运行以下语句生成测试表。 create table ex1 as select * from emp; create table ex2 as select * from dept…

Mysql如何对两张表的相同字段,同时查询两张数据表

前言 假设现在有两张数据表 表1如下&#xff1a; 表2如下&#xff1a; 表1和表2同时都再mysql的情况下&#xff0c;只有他们的uuid是一样的&#xff0c;其他字段信息不同&#xff0c;现在需要用sql语句根据uuid&#xff0c;同时将符合要求的数据查询出来&#xff0c;怎么做呢&…

SQL- join多表关联

一、SQL 连接(JOIN) 1、笛卡尔积 &#xff08;1&#xff09;当多张表进行连接查询&#xff0c;没有任何条件限制的时候&#xff0c;最终查询结果条数&#xff0c;是多张表条数的乘积 如A表15条&#xff08;行&#xff09;数据&#xff0c;B表20条&#xff08;行&#xff09;…

SQL语言多表关联查询

新建两张表&#xff1a; 表1&#xff1a;student 截图如下&#xff1a; 表2&#xff1a;course 截图如下&#xff1a; &#xff08;此时这样建表只是为了演示连接SQL语句&#xff0c;当然实际开发中我们不会这样建表&#xff0c;实际开发中这两个表会有自己不同的主键。&…