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

article/2025/10/15 22:13:01

朴素贝叶斯分类

    • 贝叶斯定理和基础概率论
    • 朴素贝叶斯
    • 高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别
    • 几种朴素贝叶斯实战
    • 总结

贝叶斯定理和基础概率论

概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述,比如彩票的中奖率是多少?概率值通常用P来表示,古典概率的取值范围在0~1之间。
P(A)=0就是表示事件A一定不会发生
条件概率是用形如P(A|B)来表示,它的含义是:如果事件B已经发生,那么事件A发生的概率是多少
联合概率是用形如P(AB),P(A,B),P(A ⋂ \bigcap B)来表示的,它是用来描述两个事件AB同时发生的概率。
事件之间的并的概率是用P(A ⋃ \bigcup B)来表示,即,事件A或事件B至少有一个事件发生的概率是多少
下面是一些概率计算原理
加法原理:
P(A ⋃ \bigcup B) = P(A) +P(B) - P(A ⋂ \bigcap B)
乘法原理:
P(A ⋂ \bigcap B) = P(B) ⋅ \cdot P(A|B)=P(A) ⋅ \cdot P(B|A)
贝叶斯定理:
P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)
如果不是很理解这些原理可以尝试用韦恩图来辅助理解
请添加图片描述
在介绍和实战朴素贝叶斯前,我们还需理解几个概念:先验概率,后验概率,似然度,标准化常量。下面我们用一个例子来理解吧。
已知有两个不透明的箱子,它们分别装着大小相同颜色不同的10个球。其中箱A中有4个红球,3个绿球,3黄球;箱B中有2个红球,7个绿球,1个黄球.
问:随机从任意一个箱子取出一个球,发现其颜色为红色,那么这颗球来自箱A的概率是多少?
面对这个概率问题,我们可以定义:事件A为“从箱A中取”,事件B“取到的球为红色”。那么我们就可以用贝叶斯公式来求解P(A|B)了。此时,贝叶斯公式中的每个元素就有了其他名称了,P(A|B)是后验概率,P(A)是先验概率,P(B|A)为似然度,P(B)为标准化量。
先验概率P(A)(从A箱取球):P(A) = 1 2 \frac {1} {2} 21
似然度P(B|A)(从A箱中取到的球为红色):P(B|A) = 2 5 \frac {2} {5} 52
标准化量P(B) (取到的球为红色):P(取到A箱) × \times ×P(从A箱中取到的球为红色)+
P(取到B箱) × \times ×P(从B箱中取到的球为红色)= 1 2 \frac {1} {2} 21 × \times × 2 5 \frac {2} {5} 52+ 1 2 \frac {1} {2} 21 × \times × 2 10 \frac {2} {10} 102= 3 10 \frac {3} {10} 103
P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)= ( 1 / 2 ∗ 2 / 5 ) 3 / 10 \frac {(1/2*2/5)} {3/10} 3/10(1/22/5)= 2 3 \frac {2} {3} 32
到这里我们会发现,如果任意取一个球,这个球来自箱A的概率为 1 2 \frac {1} {2} 21,但如果这个球的颜色为红色,那么它来自箱A的概率会变成 2 3 \frac {2} {3} 32

朴素贝叶斯

朴素贝叶斯是应用了贝叶斯定理进行的有监督学习的一种分类模型。其中贝叶斯公式 P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)中事件A被称为分类标签,事件B为数据特征。因为特征往往是多维的,所以P(B)演变成了n个特征的联合概率。因此,贝叶斯公式就变成了:P(y| x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn) = P ( x 1 , x 2 , . . x n ) P ( ∣ y ) P ( x 1 , x 2 , . . x n ) \frac {P(x1,x2,..xn)P(|y)} {P(x1,x2,..xn)} P(x1,x2,..xn)P(x1,x2,..xn)P(y)其中 x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn是数据的N维特征,y是预测标签。
那朴素贝叶斯是如何预测的呢?其实很简单,朴素贝叶斯预测分两步:1.遍历所有标签,用贝叶斯公式计算给定特征环境下出现该标签的后验概率2.获得最高的后验概率的标签,然后预测标签。
朴素贝叶斯为什么叫做朴素贝叶斯不直接叫贝叶斯呢?
其实它的朴素来自它的独立性的假设,朴素贝叶斯模型假设所有n维特征之间是互相独立的。就是怎么简单,霸道的假设。也正因这样的假设,大大简化了联合分布的计算难度。因此它的似然度函数就变成了计算各特征独自的条件概率了:P( x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn|y) = P( x 1 x_1 x1|y) × \times ×P( x 2 x_2 x2|y) × \times × × \times ×P( x n x_n xn|y)

高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别

这几种贝叶斯的主要区别在于训练似然度条件概率中的元素P( x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn|y) …的方法是假定符合某种分布的,然后通过训练集数据估计分布参数。其中高斯朴素贝叶斯使用的是高斯分布,也就是我们常用的正态分布;多项式朴素贝叶斯,顾名思义就是使用多项式分布作为似然度概率模型的分类器;而伯努利朴素贝叶斯使用的是伯努利分布作为似然度概率模型。因为伯努利分布也称为二值分布,所有伯努利分布只能描述二值结果,因此在该学习模型中要求数据中的所有特征都是布尔类型或者二值类型。下面我们就实战下这几种朴素贝叶斯分类。

几种朴素贝叶斯实战

from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_splitiris = load_iris()
x_data = iris.data
target = iris.target
lable_name = iris.feature_names
train_data, test_data, train_target, test_target = train_test_split(x_data, target, test_size=0.3)
# 高斯朴素贝叶斯
gnb = GaussianNB(priors=None)
gnb.fit(train_data, train_target)
gnb.predict(test_data)
scores = gnb.score(test_data, test_target)
print("模型的先验概率:", gnb.class_prior_)
print("特征的均值:", gnb.theta_)
print("特征的方差:", gnb.sigma_)
print(scores)
# 多项式贝叶斯
mnb = MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
mnb.fit(train_data, train_target)
mnb.predict(test_data)
scores = mnb.score(test_data, test_target)
print("************************************************")
print("每个类别平滑后的先验概率:", mnb.class_log_prior_)
print(scores)
# 伯努利贝叶斯
clf = BernoulliNB(alpha=1.0, binarize=5.0, fit_prior=True, class_prior=None)
clf.fit(train_data, train_target)
clf.predict(test_data)
scores = clf.score(test_data, test_target)
print("************************************************")
print("每个类别平滑后的先验概率:", clf.class_log_prior_)
print(scores)

请添加图片描述

总结

从训练结果来看,面对load_iris这个数据集的训练,高斯朴素贝叶斯的结果是最好的,其次是多项式贝叶斯,最后是伯努利贝叶斯。当然,也因为伯努利只能描述二值结果。面对不同的数据集,每个模型都有自己的优势,多项式贝叶斯就特别适合文本分类的场景,因为它实际衡量的是特征在不同标签之间的分布比例关系;而伯努利贝叶斯,在面对二值类型或者布尔类型的数据集也会有更好的结果。下面总结了一些常用的参数和方法。
高斯朴素贝叶斯

参数或对象解释
priors(参数)先验概率大小,如果没有给定,模型则根据样本数据自己计算
class_prior_模型的先验概率
class_count训练集标签数量
theta_特征的均值
sigma_特征的方差

多项式贝叶斯

参数或对象解释
alpha(参数)先验平滑因子,默认等于1
fit_prior(参数)是否去学习类的先验概率,默认是True
class_prior(参数):每个类别的先验概率,如果没有指定,则模型会根据数据自动学习
class_log_prior_平滑后的先验概率
feature_count_每个类别中各个特征出现的次数

伯努利贝叶斯

参数或对象解释
alpha(参数)先验平滑因子,默认等于1
binarize(参数)样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
fit_priorr(参数):是否去学习类的先验概率,默认是True
class_prior(参数)每个类别的先验概率,如果没有指定,则模型会根据数据自动学习
class_log_prior_平滑后的先验概率
feature_log_prob_给定特征类别的经验对数概率

http://chatgpt.dhexx.cn/article/j2tXarns.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;也…

SQL-多表关联查询详解

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