【机器学习】朴素贝叶斯算法

目录

什么是朴素贝叶斯算法?

算法引入 

贝叶斯定理

朴素贝叶斯分类器

工作原理

优缺点

应用场景

实现示例

基本步骤:


在机器学习的世界里,朴素贝叶斯算法以其简单性和高效性而著称。尽管它的名字听起来有点复杂,但实际上它是一种基于概率论的简单分类算法。今天,我们就来深入了解一下朴素贝叶斯算法的工作原理、优缺点以及如何应用它。 

什么是朴素贝叶斯算法?

朴素贝叶斯算法(Naive Bayes Algorithm)是一种基于贝叶斯定理的简单概率分类器。它假设所有特征之间相互独立,这个假设虽然在现实中往往不成立,但在很多情况下,朴素贝叶斯分类器仍然能够表现得非常好。

朴素贝叶斯算法是基于贝叶斯定理的分类算法。贝叶斯定理是一种描述随机事件A和B的条件概率的公式。在朴素贝叶斯中,我们假设特征之间相互独立,即一个特征的出现不影响其他特征的出现。这个假设被称为“朴素”的假设,也是算法名称的由来。


算法引入 

有一天,老师布置了一个非常困难的作业,于是小明向班级内其他30人发送群发消息,“今天的作业怎么做,能不能借我抄一抄,谢谢!”。然后班级内30人分别给出了回复,其内容分为答案与情书。其中回复是作业答案的为16份。同时小明也收到了意外且深情的告白,其中情书数量是13份。但是唯独小明的白月光发来的信息没有看懂,于是小明就想能不能按照关键词给白月光的回复进行分类呢,看看到底是作业答案还是情书。

于是小明从其他的29份中选取了一些关键词,从作业和情书中选取了4个关键词,分别是喜欢、明天、红豆、辛苦。然后从这16份答案与13份情书中分别统计出现的次数,并且计算概率。

得到概率之后,我们就可以进行计算:

回复是作业的概率=P(作业)* P(红豆|作业)*P(喜欢|作业)=0.0183

回复是作业的概率=P(情书)* P(红豆|情书)*P(喜欢|情书)=0.0506

小明发现回复是情书的概率大于回复是作业的概率,0.0506>0.0183,所以得出结论,白月光给小明发的内容是情书。


拉普拉斯平滑: 

我们再接着看这样的一个例子:“好喜欢你,好喜欢你”、“好喜欢你,辛苦你了”,我们选取“喜欢”与“辛苦”为关键词,我们根据上面的的例子,我们进行计算概率:

P(作业)* P(喜欢|作业)^3*P(辛苦|作业)=0.000177

P(情书)* P(喜欢|情书)^3*P(辛苦|情书)=0.000000

但是我们发现第二句话是很明显的告白,但是因为在情书中“辛苦”关键字没有出现,所以会导致P(辛苦|情书) =0,通过这样的算法,这很明显得到了错误的预测,那么我们如何去解决这个问题呢,我们可以利用拉普拉斯平滑技巧,也就是在每一个关键词上人为增加一个出现的次数(如图:黄色部分)。这样会保证每一项都不为0,按照通过拉普拉斯平滑技巧处理过的次数,进行重新计算关键词的概率,再此概率基础上再进行计算会得到正确的结果了。


贝叶斯定理

贝叶斯定理描述了给定事件B发生的条件下,事件A发生的概率,公式如下:

P(A|B)=\frac{P(B)*P(B|A)}{P(A)}\frac{P(B)*P(B|A)}{P(A)}

其中:

  • P(A∣B) 是在事件B发生的条件下事件A发生的概率。
  • P(B∣A) 是在事件A发生的条件下事件B发生的概率。
  • P(A) 是事件A发生的概率。
  • P(B) 是事件B发生的概率。

朴素贝叶斯分类器

在分类问题中,朴素贝叶斯分类器的目标是找出给定输入特征下,哪个类别的概率最高。假设我们有特征集合 X={x1​,x2​,...,xn​} 和类别集合 C={c1​,c2​,...,ck​},朴素贝叶斯分类器会计算:

P(ci​∣X)=P(X)P(X∣ci​)P(ci​)​

其中:

  • P(ci​∣X) 是给定特征集合X的条件下,类别 ci​ 发生的概率。
  • P(X∣ci​) 是给定类别 ci​ 的条件下,特征集合X发生的概率。
  • P(ci​) 是类别 ci​ 的先验概率。
  • P(X) 是特征集合X的先验概率,通常可以忽略,因为它对所有类别都是相同的。

由于特征之间是条件独立的,我们可以将P(X∣ci​) 展开为:

P(X∣ci​)=P(x1​∣ci​)P(x2​∣ci​)...P(xn​∣ci​)


工作原理

朴素贝叶斯算法的核心是计算给定输入特征下,每个类别的概率,然后选择概率最高的类别作为预测结果。具体步骤如下:

  1. 数据预处理:将数据转换为算法可以处理的格式,如文本数据需要进行分词、去除停用词等。

  2. 计算先验概率:先验概率是指在没有观察到任何特征的情况下,每个类别的概率。

  3. 计算条件概率:对于每个类别,计算在该类别下观察到每个特征的概率。

  4. 应用贝叶斯定理:结合先验概率和条件概率,计算后验概率,即在观察到特征的情况下,每个类别的概率。

  5. 分类决策:选择后验概率最高的类别作为预测结果。


优缺点

优点

  • 简单高效:算法实现简单,计算效率高,适合处理大量数据。
  • 对小规模数据表现良好:在数据量不大的情况下,朴素贝叶斯往往能取得不错的效果。
  • 需要的样本量较少:与其他机器学习算法相比,朴素贝叶斯需要的训练样本量较少。

缺点

  • 特征独立性假设:特征独立性假设在实际应用中往往不成立,这可能会影响分类的准确性。
  • 对输入数据的表达形式敏感:算法对输入数据的表达形式非常敏感,如文本数据的分词方式等。

应用场景

  1. 文本分类:通过计算文档中每个词属于某个类别的概率,来确定文档的分类。
  2. 垃圾邮件检测:通过分析邮件内容,判断邮件是否为垃圾邮件。
  3. 情感分析:通过分析用户评论,判断用户的情感倾向。


实现示例

基本步骤:

  1. 数据准备:收集数据并将其分为训练集和测试集。
  2. 特征提取:从数据中提取特征。
  3. 计算先验概率:计算每个类别的概率。
  4. 计算条件概率:计算每个特征在每个类别下的条件概率。
  5. 应用贝叶斯定理:使用贝叶斯定理计算后验概率。
  6. 分类决策:选择具有最高后验概率的类别作为预测类别。

以下是使用Python的scikit-learn库实现朴素贝叶斯分类器的简单示例:

from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 创建并训练模型
model = GaussianNB()
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

在这个示例中,我们使用了sklearn库中的GaussianNB类,它假设特征遵循高斯分布。load_iris函数用于加载鸢尾花数据集,这是一个常用的分类数据集。然后,我们将数据集分为训练集和测试集,并使用GaussianNB模型进行训练和预测。

请注意,这个例子是一个简化的版本,实际应用中可能需要进行更多的数据预处理步骤,比如特征缩放、缺失值处理等。此外,根据数据的特性,可能需要选择不同的朴素贝叶斯模型,如多项式朴素贝叶斯或伯努利朴素贝叶斯。


朴素贝叶斯算法虽然简单,但在很多实际应用中都能取得不错的效果。理解其工作原理和适用场景,可以帮助我们在适当的问题上选择合适的工具。希望这篇文章能帮助大家更好地理解和应用朴素贝叶斯算法。

:算法引入及图片来源于[5分钟学算法] #02 朴素贝叶斯 写作业还得看小明_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器翻译基础与模型 之二: 基于CNN的模型

一、CNN网络 相比于全连接网络,卷积神经网络最大的特点在于具有局部连接(Locally Connected)和权值共享(Weight Sharing)的特性。 1.1 卷积核与卷积操作 1.2 步长与填充 1.3 池化 以上关于CNN的基础概念和技术就不…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…

C总结测评

测评代码&#xff1a;month_11/test_19/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 第一题&#xff1a;该程序输出的是多少&#xff1f; #include <stdio.h> int main() {unsigned char i 7;//0~255int j 0;for (; i > 0; i - 3){j;}printf("%d\n",…

神经网络中常用的激活函数(公式 + 函数图像)

激活函数是人工神经网络中的一个关键组件&#xff0c;负责引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。没有激活函数&#xff0c;神经网络中的所有计算都是线性变换&#xff0c;而线性模型的表达能力有限&#xff0c;无法处理复杂的任务。 激活函数…

在CentOS中,通过nginx访问php

其实是nginx反向代理到php-fpm&#xff0c;就像nginx反向代理到tomcat。 1、安装PHP-FPM 1.1 安装 yum install php yum install php-fpm php-common 这里只安装了php-fpm&#xff0c;根据需要安装php模块&#xff0c;比如需要访问mysql则添加安装 php-mysqlnd。 1.2 启动…

前端—Cursor编辑器

在当今快速发展的软件开发领域&#xff0c;效率和质量是衡量一个工具是否优秀的两个关键指标。今天&#xff0c;我要向大家推荐一款革命性的代码编辑器——Cursor&#xff0c;它集成了强大的AI功能&#xff0c;旨在提高开发者的编程效率。以下是Cursor编辑器的详细介绍和推荐理…

windows远程桌面打开rdp显卡调用

前情提要 服务器在公网环境&#xff0c;带宽只有30M。 远程桌面多开图形业务调试&#xff0c;设置RDP服务端使用GPU。 压缩传输带宽避免造成卡顿。 如果是内网&#xff0c;也可以用&#xff0c;还可以提供一个注册表键值&#xff0c;修改后提高fps帧率&#xff08;公网不推…

使用C++和QT开发应用程序入门以及开发实例分享

目录 1、搭建开发环境(VS2010和QT4.8.2) 2、创建一个QT窗口 3、在QT窗口中添加子窗口 4、QT界面布局 5、QT信号(SIGNAL)和槽(SLOT) 6、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/…

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…

php:使用socket函数创建WebSocket服务

一、前言 闲来无事&#xff0c;最近捣鼓了下websocket&#xff0c;但是不希望安装第三方类库&#xff0c;所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…

(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器

目录 1.业务逻辑实现 1.1 登录校验技术——会话 1.1.1Cookie 1.1.2session 1.1.3JWT令牌技术 2.参数配置化 3.yml格式配置文件 4.过滤器Filter 5.拦截器Interceptor 1.业务逻辑实现 Day10-02. 案例-部门管理-查询_哔哩哔哩_bilibili //Controller层/*** 新增部门*/Pos…

数字IC后端设计实现之Innovus place报错案例 (IMPSP-9099,9100三种解决方案)

最近吾爱IC社区星球会员问到跑place_opt_design时会报错退出的情况。小编今天把这个错误解决办法分享给大家。主要分享三个方法&#xff0c;大家可以根据自己的实际情况来选择。 数字IC后端低功耗设计实现案例分享(3个power domain&#xff0c;2个voltage domain) **ERROR: (I…

麒麟网络负载均衡与高可用方案实践

安装 teamd 包。 yum -y install teamd Copy 一、配置TEAMING 查看两个网卡信息 ifconfig Copy 注意&#xff1a;根据实际网卡设备名称情况调整代码&#xff01;不同环境下网卡名称略有不同&#xff01; 根据查询的结果&#xff0c;两张网卡设备名称分别为 enp0s2 和 enp…

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…

深述C++模板类

1、前言 函数模板是通用函数的描述&#xff0c;类模板是通用类的描述&#xff0c;使用任意类型来描述类的定义。和函数模板有很多相似的地方&#xff0c;关于函数模板可以看我之前写过的一篇文章&#xff1a;简述C函数模板。这里就不过多赘述。 2、模板类的基本概念 模板类的…

利用Python爬虫获取1688搜索词推荐:技术与实践

在电子商务领域&#xff0c;关键词的选择对于产品的曝光和销售至关重要。1688作为中国领先的B2B电子商务平台&#xff0c;提供了丰富的搜索词推荐功能&#xff0c;帮助商家优化关键词策略。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;获取1688平台的搜索词推荐&…

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…

从Stream的 toList() 和 collect(Collectors.toList()) 方法看Java的不可变流

环境 JDK 21Windows 11 专业版IntelliJ IDEA 2024.1.6 背景 在使用Java的Stream的时候&#xff0c;常常会把流收集为List。 假设有List list1 如下&#xff1a; var list1 List.of("aaa", "bbbbbb", "cccc", "d", "eeeee&qu…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…