深入理解贝叶斯分类与朴素贝叶斯模型(Naive Bayes, NB):从基础到实战

news2025/6/9 18:04:13

目录

贝叶斯分类

公式

决策规则

优点

贝叶斯分类器的例子——垃圾邮件问题

1. 特征(输入):

2. 类别:

3. 数据:

4. 模型训练:

注:类别先验概率

5. 模型预测:

朴素贝叶斯模型

模型定位&模型假设

模型算法

例子

sklearn朴素贝叶斯代码实现


贝叶斯分类

公式

在贝叶斯分类中,我们关注的是样本属于某个类别的概率。设x是输入特征向量,C_k是类别。根据贝叶斯公式,我们可以计算后验概率 P(C_k|x)

P(C_k|x) = \frac{P(x|C_k)P(C_k)}{P(x)}

其中,

  • P(C_k|x)是在给定输入 x 的条件下,属于类别C_k的概率。
  • P(x|C_k)是在给定类别C_k的条件下,输入 x 的概率(类别条件概率)。
  • P(C_k)是类别 C_k的先验概率。
  • P(x)是输入x的概率。

决策规则

选择具有最高后验概率P(C_k|x)的类别作为最终的分类结果。

优点

贝叶斯分类器的优点之一是它对小样本数据具有较好的鲁棒性,而且能够自然地处理多类别问题。然而,它的性能可能会受到输入特征之间的独立性假设的影响。在实际应用中,朴素贝叶斯分类器(Naive Bayes Classifier)是一种常见的贝叶斯分类器,其中假设特征之间是相互独立的。

贝叶斯分类器的例子——垃圾邮件问题

我反正看了上面那些个公式,不慎理解,虽然是数学专业的但是对于类别分布仍然有一些迷茫,所以这里举一个例子

假设我们要使用朴素贝叶斯分类器来判断一封电子邮件是否为垃圾邮件(Spam)或非垃圾邮件(Ham),我们可以使用以下特征:

1. 特征(输入):

  • x_1​: 邮件中包含词语 "money" 的概率。
  • x_2​: 邮件中包含词语 "free" 的概率。
  • x_3​: 邮件中包含词语 "meeting" 的概率。

2. 类别:

  • C_1​: 垃圾邮件(Spam)。
  • C_2​: 非垃圾邮件(Ham)。

3. 数据:

我们有一个已标记的训练数据集,其中包含一些垃圾邮件和非垃圾邮件。对于每封邮件,我们统计了x_1,x_2,x_3的取值。

4. 模型训练:

于每个类别C_k,我们计算先验概率 P(C_k)。对于每个特征x_i和类别C_k,我们计算类别条件概率 P(x_i|C_k)(这里的计算后面在朴素贝叶斯那里有详细说明)。

注:类别先验概率

类别的先验概率是指在没有任何观测数据的情况下,我们对每个类别的初始信念或概率。这个先验概率表示我们在了解任何具体数据之前对各个类别的预期信念。

数学上,假设有K个类别,类别的先验概率表示为P(C_k),其中k = 1,2,3,...,K

在实际问题中,我们可以通过观察训练数据集中每个类别的样本数量,来估计先验概率。具体而言,如果训练数据中类别C_k出现的次数为N_k,总样本数为 N,那么类别C_k的先验概率 P(C_k)可以估计为:

P(C_k) = \frac{N_k}{N}

在训练模型时,这些先验概率是模型的一部分,用于计算后验概率。在实际应用中,如果没有特定的先验知识,有时候也会使用均匀先验,即假设每个类别的先验概率相等。这意味着P(C_k)对于每个k都相等。

5. 模型预测:

对于一封新的邮件,我们计算它属于每个类别的后验概率P(C_k|x)。选择具有最高后验概率的类别作为最终的分类结果。

在朴素贝叶斯分类器中,特征之间的独立性假设是一个简化,但在实际应用中,该方法在垃圾邮件过滤等任务上表现良好。

朴素贝叶斯模型

模型定位&模型假设

贝叶斯模型属于生成式模型,它对样本的观测值和类别状态的联合分布p( \boldsymbol{x},y)进行建模。在实际应用中,联合分布转换成为类别的先验分布p(y)与类条件分布p( \boldsymbol{x}|y)乘积的形式:

p( \boldsymbol{x},y)=p(y)p( \boldsymbol{x}|y)

前者可以分别使用伯努利分布(二分类)和类别分布(多分类)建模先验概率,但是类条件分布p( \boldsymbol{x}|y)的估计一直是贝叶斯模型的难题。

注:在贝叶斯分类中,朴素贝叶斯模型通常涉及到计算后验概率,其中分母是用于归一化的。在实际计算中,我们通常只关注后验概率的相对大小,因此并不需要计算完整的分母。这种做法被称为"朴素",因为它简化了计算,假设特征之间是独立的,从而避免了计算联合概率分布的复杂性。

在文本分类任务中为例解决类条件分布p( \boldsymbol{x}|y)的估计的难题,需要对文本的类条件分布做进一步简化。一种通常的做法是忽略文本中的词序关系,假设各个特征词的位置都是可以互换的,即词袋模型(Bag Of Word,BOW)。基于这一假设类条件分布可以用多项式分布刻画。基于以上条件的贝叶斯模型,称为朴素贝叶斯模型(naive Bayes, NB),它的本质用混合的多项式分布刻画文本分布

朴素贝叶斯模型是一种简化的贝叶斯分类器,对观测向量\boldsymbol{x}和类别y的联合分布

p(x,y) = p(y)p(x|y)

进行建模。通常假设类别变量y(类别先验概率)服从伯努利分布(0-1分布)或分类分布(多分类问题),并根据实际任务对p(\boldsymbol{x}|y)(类别条件概率)进行合理假设。在图像分类任务中,常常将p(\boldsymbol{x}|y)假设为服从高斯分布,而在文本分类中任务中,p(\boldsymbol{x}|y)常见的分布假设有两种:多项分布模型和多变量伯努利分布模型。其中多变量伯努利分布假设只关心特征项是否出现,而不记录出现的频次,在实际应用中效果不及多项分布假设。因此,在文本分类任务中,不加特别说明的朴素贝叶斯模型往往都是基于多项式分布假设的朴素贝叶斯模型。

模型算法

首先将一个文档x表示为一个词的序列

x=[w_1,w_2,...,w_{|\boldsymbol{x}|}]

在条件独立性假设下,p(\boldsymbol{x}|y)可以具有多项分布的形式:

p(\boldsymbol{x}|c_j)=p([w_1,w_2,...,w_{|\boldsymbol{x}|}]|c_j)=\prod _{i=1}^Vp(t_i|c_j)^{N(t_i,\boldsymbol{x})}

其中,V是词汇表维度,t_i表示词汇表中的第i个特征项。令\theta_{i|j}=p(t_i|c_j)表示在c_j类条件下t_i出现的概率,N(t_i,\boldsymbol{x})表示在文档\boldsymbol{x}t_i的词频。

同时,我们以多分类问题为例,假设类别y服从类别分布:

p(y=c_j) = \pi_j

根据多项式分布模型假设,p(\boldsymbol{x},y)的联合分布为

p(\boldsymbol{x},y=c_j) = p(c_j)p(\boldsymbol{x}|c_j)=\pi_j\prod _{i=1}^V\theta_{i|j}^{N(t_i,\boldsymbol{x})}

其中\boldsymbol{x},\theta均为模型参数。

朴素贝叶斯模型基于最大似然估计算法进行参数学习,给定训练集\{x_k,y_k\}_{k=1}^N,模型以对数似然函数L(\pi,\theta)=log\prod_{k=1}^Np(x_k,y_k)作为优化目标。对优化目标求导置零,求解得到模型的参数估计值为:

\pi_j=\frac{\sum_{k=1}^NI(y_k=c_j)}{\sum_{k=1}^N\sum{j'=1}^CI(y_k=c_{j'})}=\frac{N_j}{N}

\theta_{i|j}=\frac{\sum_{k=1}^NI(y_k=c_j)N(t_j,x_k)}{\sum_{k=1}^NI(y_k=c_j)\sum_{i'=1}^VN(t_{i'},x_k)}

从参数估计的结果例可以看出,在多项式分布假设下,频率正是概率的最大似然估计值,例如,类别概率\pi_i的最大似然估计结果是训练集中第j类样本出现的频率;类条件下特征想概率的最大似然估计结果是第j类文档中所有特征项中t_i出现频率。为了防止零概率的出现,常常对\theta_{i|j}进行拉普拉斯平滑:

\theta_{i|j}=\frac{\sum_{k=1}^NI(y_k=c_j)N(t_j,x_k)+1}{\sum_{k=1}^NI(y_k=c_j)\sum_{i'=1}^VN(t_{i'},x_k)+V}

例子

利用朴素贝叶斯模型,在降维后的文本分类训练集(表5.7)上进行模型学习,分别令t_1=计算机,t2 = 排球,t3 = 运动会,t4 = 高校,t5 = 大学,y = 1表示教育类,y = 0表示体育类,可以得到如下参数估计结果。

\pi_jp(y=1)=0.5p(y=0)=0.5
\theta_{i|j}\theta_{1|1}=p(t_1|c_1)=\frac{2+1+0+0+1}{3+0+0+1+2+5}=\frac{4}{11}p(t_1|y=0)=1/10
p(t_2|y=1)=\frac{1}{11}p(t_2|y=0)=3/10
p(t_3|y=1)=\frac{1}{11}p(t_3|y=0)=3/10
p(t_4|y=1)=\frac{2}{11}p(t_4|y=0)=1/10
p(t_5|y=1)=\frac{3}{11}p(t_5|y=0)=2/10

基于上述模型参数,对test_d1的文本表示为x_1,它与教育类和体育类的联合概率分别为

p(x_1,y=1)=p(y=1)p(t_5|y=1)^2=0.037

p(x_1,y=0)=p(y=0)p(t_5|y=0)^2=0.020

根据贝叶斯分布可得属于两类的后验概率分布为:

p(y=1|x_1) = 0.649

p(y=0|x_1)=0.351

所以可以预测test\_d_1属于教育类。

同理可以计算得test\_d_2属于体育类。

sklearn朴素贝叶斯代码实现

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 示例数据(文本和对应的标签)
corpus = [
    ("This is a positive statement", "positive"),
    ("I feel great", "positive"),
    ("This is a negative statement", "negative"),
    ("I don't like this", "negative"),
    ("I feel awful", "negative")
]

# 将数据分为训练集和测试集
texts, labels = zip(*corpus)
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)

# 将文本转换为词频向量
vectorizer = CountVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)
X_test_vectorized = vectorizer.transform(X_test)

# 训练朴素贝叶斯模型
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train_vectorized, y_train)

# 在测试集上进行预测
y_pred = nb_classifier.predict(X_test_vectorized)

# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 打印分类报告
print("\nClassification Report:")
print(classification_report(y_test, y_pred))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1278263.html

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

相关文章

进程间通信 管道

在Linux中,管道是一种通信机制,用于将一个程序的输出直接连接到另一个程序的输入。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,它可以克服使用文件进行通信的两个问题,具体表现为限制管道的大…

基于SSM的生鲜在线销售系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

[传智杯 #2 决赛] 补刀

题目描述 UIM 在写程序的空闲玩一款 MOBA 游戏。 当敌方的小兵进入到我方防御塔的范围内,就会持续受到防御塔造成的伤害;当然我方英雄也可以对它造成伤害。当小兵的血量降到了 0 或者更低,就会被击杀。为了获得经验,UIM 希望在防…

Vmware 中的Centos7.9 和 主机共享文件夹

1.开启虚拟机的共享文件夹功能。 虚拟机->设置->选项-共享文件夹:【总是启用】 2.添加一个共享文件夹 3. 虚拟机中创建一个文件夹 mkdir share cd share pwd /www/backup/share4.挂载共享文件夹 /usr/bin/vmhgfs-fuse .host:/share /www/backup/share -o s…

Java 设计模式系列:代理模式

文章目录 介绍静态代理基本介绍应用实例静态代理优缺点 动态代理基本介绍JDK 中生成代理对象的 API Cglib 代理基本介绍实现步骤 介绍 1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象 2&#xff09…

深入理解原码、反码、补码(结合C语言)

一、引出问题 在学习C语言单目操作符中~按位取反的过程中&#xff0c;对这样一段代码的结果产生了疑惑&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 0;int b ~a;//按位取反printf("%d\n", b);return 0; }输出结果…

系列十七、理解SpringBoot中的starter 自定义一个starter

一、概述 作为后端Java程序员&#xff0c;基本上公司的日常开发都是基于SpringBoot进行的&#xff0c;我们使用SpringBoot也是沉醉于它的各种各样的starter带给我们的便利&#xff0c;这些starter为我们带来了众多的自动化配置&#xff0c;通过这些自动化配置&#xff0c;我们可…

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档&#xff1a;WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件&#xff0c;在main.js中引入&#xff0c;初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

半监督语义分割综述

paper link&#xff1a;https://arxiv.org/pdf/2302.09899.pdf 1. Introduction 图像分割是最古老、研究最广泛的计算机视觉 (CV) 问题之一。图像分割是指将图像划分为不同的非重叠区域&#xff0c;并将相应的标签分配给图像中的每个像素&#xff0c;最终获得ROI区域位置及其类…

【智能家居】二、添加火灾检测模块(烟雾报警功能点)

可燃气体传感器 MQ-2 和 蜂鸣器 代码段 controlDevice.h&#xff08;设备控制&#xff09;smokeAlarm.c&#xff08;烟雾报警器&#xff09;buzzer.c&#xff08;蜂鸣器&#xff09;mainPro.c&#xff08;主函数&#xff09;运行结果 可燃气体传感器 MQ-2 和 蜂鸣器 代码段 …

基于机器深度学习的交通标志目标识别

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 智能交通系统&#xff08;ITS&#xff09;&#xff0c;包括无人驾驶车辆&#xff0c;尽管在道路…

OrangePi 5:ROS2 Humble中使用激光雷达

OrangePi 5&#xff1a;ROS2 Humble中使用激光雷达 文章目录 OrangePi 5&#xff1a;ROS2 Humble中使用激光雷达1、硬件准备2、ROS2 Humble安装2.1 使用集成脚本安装2.2 按ROS2官方指导安装2.3 ROS2安装验证 3、YDLIDAR X2激光雷达驱动安装3.1 YDLIDAR X2激光雷达介绍3.2 YDLID…

go第三方包发布(短精细)

1、清除其他依赖项 $ go mod tidy # 清除不必要的依赖依赖清除完成后&#xff0c;查看go.mod文件配置是否规范 module github.com/fyupeng/rpc-go-netty go 1.19 require ( )2、本地版本创建 $ git tag v0.1.0 # 本地 创建标签3、版本提交 $ git push github v0.1.0 # 推送…

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意&#xff1a; 思路&#xff1a; 代码&#xff1a; D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意&#xff1a; 给你一个n和q&#xff0c;n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况&#xff0c;q为查询次数…

Docker部署Plik临时文件上传系统并且实现远程访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik8. 结语 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上…

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Flask使用线程异步执行耗时任务

1 问题说明 1.1 任务简述 在开发Flask应用中一定会遇到执行耗时任务&#xff0c;但是Flask是轻量级的同步框架&#xff0c;即在单个请求时服务会阻被塞&#xff0c;直到任务完成&#xff08;注意&#xff1a;当前请求被阻塞不会影响到其他请求&#xff09;。 解决异步问题有…

C语言--每日选择题--Day32

如果大家对读研究生和就业不知道如何抉择&#xff0c;我的建议是看大家的经济基础&#xff0c;如果家里不是很需要你们工作&#xff0c;就读研提升自己的学历&#xff0c;反之就就业&#xff1b;毕竟经济基础决定上层建筑&#xff1b; 第一题 1. 下面代码的结果是&#xff1a;…