【机器学习】十大算法之一 “朴素贝叶斯”

news2024/10/5 13:35:19

 

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=blog个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

 

        朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,它利用先验概率和条件概率推导出后验概率,从而进行分类。该算法被广泛应用于自然语言处理、垃圾邮件过滤和文本分类等领域,并且在很多数据挖掘竞赛中获得了优秀的结果。Python版本的朴素贝叶斯算法也被广泛使用,由于其易于实现和高效性能,成为了数据科学家和机器学习工程师的首选算法之一。

本文将详细讲解机器学习十大算法之一 “朴素贝叶斯”


 

目录

一、简介

二、发展史

三、算法原理、功能讲解

        1. 贝叶斯定理

        2. 朴素贝叶斯

        3. 拉普拉斯平滑

        4. 处理连续值特征

        5. 朴素贝叶斯分类器的生成

        朴素贝叶斯分类器的生成包括以下几个步骤:

        6. 朴素贝叶斯算法的假设

        7. 朴素贝叶斯算法的优点和缺点

        朴素贝叶斯算法具有以下优点:

        朴素贝叶斯算法的缺点主要有以下几个: 

四、实现朴素贝叶斯算法

        实现步骤

        完整代码

五、总结 


一、简介

        朴素贝叶斯算法是一种监督学习的算法,通过计算条件概率来预测或分类数据。它的核心思想是贝叶斯定理,即后验概率等于先验概率与似然函数的乘积除以证据因子。

        在文本分类的应用中,假设我们有一个文档和一个文档分类,我们想要判断这个文档属于哪个分类。我们可以将文档中的每个词都看作一个特征,每个特征的值为 0 或 1,0 表示该词不在文档中,1 表示该词在文档中。这样,我们就可以将每个文档表示为一个特征向量。然后,我们可以使用朴素贝叶斯算法来计算每个分类的条件概率,并选择条件概率最大的分类作为文档所属的分类。

二、发展史

        朴素贝叶斯算法最早可以追溯到18世纪的贝叶斯学派。但是,直到20世纪60年代,才有了将贝叶斯方法用于文本分类的尝试。最早的一篇文献是由Thomas Bayes的朋友Richard Price在1763年发表的《An Essay towards solving a Problem in the Doctrine of Chance》。它提出了贝叶斯规则,构成了朴素贝叶斯算法的核心。

        在20世纪60年代,刚刚问世的计算机开始被广泛使用,使得大规模文本分类成为可能。此时,发展起了文本分类领域的先驱性研究,G. Salton 等人提出了矢量空间模型和 TF-IDF 权重算法,但是它们都依赖于一个主题词典或类别词汇表。

        直到20世纪80年代,朴素贝叶斯算法成为文本分类中最重要的方法之一。 Paul Dressel 和 Donald Bienenstock 的著名论文《SVMs and the Bayes Kernel》中,他们通过 SVM 与朴素贝叶斯算法的比较得出,朴素贝叶斯算法相对于 SVM 算法有着更高的准确率。

        现在,朴素贝叶斯算法已经成为自然语言处理领域中最常用的算法之一。

三、算法原理、功能讲解

        朴素贝叶斯算法是一种基于概率论和统计学的算法。它的核心思想是概率,通过计算条件概率来预测或分类数据。在此之前,我们需要了解一下几个与朴素贝叶斯算法相关的概念。

        1. 贝叶斯定理

        贝叶斯定理是朴素贝叶斯算法的核心,它是一个概率公式,用于计算一个事件的后验概率。根据贝叶斯定理,事件 A 的后验概率等于先验概率 P(A),与另一个事件 B 发生的联合概率 P(B|A) 乘以一个正则因子,即:

        其中,P(A) 和 P(B) 是事件 A 和事件 B 的先验概率,P(B|A) 是给定事件 A 发生的情况下事件 B 发生的条件概率,P(A|B) 是在事件 B 发生的条件下事件 A 的后验概率。

        2. 朴素贝叶斯

        朴素贝叶斯算法假设所有特征之间是相互独立的。这一假设称为朴素贝叶斯假设,因此该算法称为朴素贝叶斯算法。

        对于一个文本分类问题来说,每个文档可以表示为一个特征向量。特征向量的每个维度都表示一个词,在该文档中出现(1)或未出现(0)。我们假设每个特征的取值都是二元的,即 0 或 1。因此,该算法可以将文档表示为一个特征数量为n的向量 X=(x_1,x_2,...,x_n)X=(x1​,x2​,...,xn​),其中每个特征都是 0 或 1。

        在朴素贝叶斯算法中,我们需要计算每个分类的条件概率,即:

        其中,k 是分类的编号,C 是分类的所有可能值,P(C_k|X) 是给定特征向量 X 时分类为 C_k 的概率,P(X|C_k) 是给定分类 C_k 时特征向量 X 出现的条件概率,P(C_k) 是分类 C_k 的先验概率,P(X) 是文档出现的概率。

        根据朴素贝叶斯假设,每个特征之间是相互独立的,因此可以将 P(X|C_k) 表示为:

        这样我们就可以计算每个分类的条件概率 P(C_k|X)。将条件概率最大的分类作为文档所属的分类。

        在实际应用中,我们需要对每个分类建立一个模型,该模型可以通过训练数据集中的文档来获得。训练数据集中的文档被分成 k 类,每个文档表示为一个特征向量,我们通过计算每个特征在每个分类中出现的次数来推导出每个分类的条件概率。这样,我们就可以使用朴素贝叶斯算法来预测分类。

        3. 拉普拉斯平滑

        在计算条件概率时,由于某个特征在某个分类中可能没有出现,因此该特征在该分类中的条件概率可能为 0。此时,当我们尝试计算某个文档可能属于哪个分类时,我们会因为概率计算出错而得到错误的结果。

        拉普拉斯平滑是一种解决这个问题的方法。基本思想是为某个分类和某个特征分配一个小的数量,这样可以避免条件概率为 0。

        假设我们有 N 个文档,其中 M 个文档属于分类 C_k,那么拉普拉斯平滑可表示为:

        其中,n 是分类的数量,n_{C_k}nCk​​ 是分类 C_k 中的文档数量,n_{x_i,C_k}nxi​,Ck​​ 是分类 C_k 中包含词 x_ixi​ 的文档数量,\alphaα 是平滑参数,通常取 1。

        4. 处理连续值特征

        对于一些连续值特征(例如房价、温度等),我们可以使用正态分布来拟合其值。在这种情况下,我们可以使用高斯朴素贝叶斯算法来计算连续值特征的条件概率。高斯朴素贝叶斯算法假设特征的值服从正态分布,因此可以使用高斯分布来拟合连续值特征。

        5. 朴素贝叶斯分类器的生成

        朴素贝叶斯分类器的生成包括以下几个步骤:

(1)计算每个类别的先验概率,即某个样本属于某一类别的概率。在朴素贝叶斯中,先验概率可以根据样本集中每个类别的样本数计算得到。

(2)计算每个特征与目标变量之间的条件概率。这就相当于计算每个类别下的每个特征值的概率。在朴素贝叶斯中,条件概率可以使用频率来估计,即将训练集中某个类别下某个特征值出现的次数除以该类别下总的样本数。

(3)对于待预测的新样本,根据所属类别的后验概率,将其分类为概率最大的那一类。

        6. 朴素贝叶斯算法的假设

        朴素贝叶斯算法的假设是:所有的特征都是独立的。即样本的特征之间没有任何关联。这个假设虽然在实际生活中不太现实,但是这个假设为朴素贝叶斯算法带来了高效性和可靠性。

        在实际应用中,朴素贝叶斯算法的独立性假设不一定能完全成立,但是在处理垃圾邮件过滤、文本分类等任务时,朴素贝叶斯算法的表现仍然优秀。

        7. 朴素贝叶斯算法的优点和缺点

        朴素贝叶斯算法具有以下优点:

(1)朴素贝叶斯算法是基于概率论的一种算法,具有可解释性和可理解性。

(2)算法实现简单,易于理解和实现。

(3)朴素贝叶斯算法在处理高维度数据时表现出色,适用于文本分类、垃圾邮件过滤等应用场景。

        朴素贝叶斯算法的缺点主要有以下几个: 

(1)朴素贝叶斯算法的独立性假设在实际应用中不一定成立,可能会带来误差。

(2)朴素贝叶斯算法对输入数据的质量要求较高,不适用于处理缺失数据等问题。

(3)朴素贝叶斯算法在处理少量数据时,可能会出现误判率较大的问题。

四、实现朴素贝叶斯算法

        实现步骤

        现在,我们来使用 Python 来实现朴素贝叶斯算法。本文将使用 scikit-learn 库来实现算法。

        首先,我们需要安装 scikit-learn 库,可以使用 pip 或 conda 来安装。

        在命令行中输入以下命令:

 pip install -U scikit-learn

        或

conda install scikit-learn

        接下来,我们将使用 scikit-learn 中的 load_iris 函数来加载 iris 数据集。这个数据集包含了三种不同的鸢尾花(setosa、versicolor、virginica)及其花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征。为了简单起见,我们将只使用前两个特征(即花萼长度和花萼宽度)。 

from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data[:, :2]  # 使用前两个特征
y = iris.target

        接下来,我们将数据集分成训练集和测试集。我们将采用训练集对模型进行训练,并在测试集上试模型的准确率。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

        接下来,我们将使用 GaussianNB 类来拟合模型。GaussianNB 类的 fit 方法用于拟合训练数据。拟合后,我们可以使用 predict 方法来预测新的样本所属的分类。

from sklearn.naive_bayes import GaussianNB

gnb = GaussianNB()
gnb.fit(X_train, y_train)

y_pred = gnb.predict(X_test)

        最后,我们可以使用 accuracy_score 函数来计算模型在测试集上的准确率。结果表明,模型在测试集上的准确率为 82.22%。 

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

        输出结果如下:

 Accuracy: 0.8222222222222222

        完整代码

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

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

# 将数据集拆分为训练集和测试集
train_data, test_data, train_target, test_target = train_test_split(X, y, test_size=0.3, random_state=0)

# 实例化模型
gnb = GaussianNB()

# 训练模型
gnb.fit(train_data, train_target)

# 预测测试集
pred = gnb.predict(test_data)

# 计算准确率
accuracy = accuracy_score(test_target, pred)

print("准确率为:", accuracy)

五、总结 

        本文讲解了 Python 版本的朴素贝叶斯算法,包括简介、发展史、算法功能详解、示例代码加运行结果等方面。

        朴素贝叶斯算法是一种基于概率论和统计学的算法,被广泛应用于自然语言处理、文本分类、垃圾邮件过滤、情感分析等领域。该算法通过计算条件概率来预测或分类数据。本文提供了一些在 Python 中使用朴素贝叶斯算法的示例代码,希望能帮助大家更好地理解该算法。

        因为我是直接用的分类器,所以本文没有朴素贝叶斯算法的底层源码,如果想了解最原始的源码,可以自行去寻找一下材料,简单易懂~

 

 

 

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

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

相关文章

Visual Studio Code Arduino资源占用和效率对比

Visual Studio Code&Arduino资源占用和效率对比 系统资源占用:编译效率: 这段时间在玩ESP32,闲来无事对比了一下Visual Studio Code后面简称VS和Arduino的效率和资源占用,只是大致的对比,没有斤斤计较。 配置为&am…

springboot集成swagger

文章目录 swagger概述swagger常用注解ApiImplicitParam swagger的集成方式集成swagger2.9集成swagger2.10集成swagger3 swagger概述 swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后…

Mysql数据库初体验

Mysql数据库初体验 一、数据库的基本概念1.数据(Data)2.表3.数据库4.数据库管理系统(DBMS)5.数据库系统 二、数据库系统发展史1.第一代数据库2.第二代数据库3.第三代数据库 三、当今主流数据库介绍四、数据库分类1.关系数据库2.关系型 SQL 数…

前端教程:Canvas怎样创建画布和绘制图形?

HTML5提供了一种全新的画布功能,即通过Canvas来让用户在网页中绘制图形、文字、图片等。Canvas表示画布,现实生活中的画布是用来作画的,HTML5中的Canvas与之类似,我们可以称它为“网页中的画布”。默认情况下,Canvas是…

【MySQL高级篇笔记-锁(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、概述 二、MySQL并发事务访问相同记录 1、读-读情况 2、写-写情况 3、读-写或写-读情况 4、并发问题的解决方案 三、锁的不同角度分类 1、从数据操作的类型划分:读锁、写锁 2、从数据操作的粒度划分&#xf…

攻防渗透第四章(谷歌语法)

一、常用谷歌黑客语法 制定网站的URL site: 包含特定字符的URL inurl: 网页标题中包含特定字符 intitle: 正文中指定字符 intext: 指定类型文件 filetype 开发语言判断 site:163.com filetype:php site:163.com filetype:jsp site:163.com filetype:asp site:163.com filetype…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件,它实现了 AMQP(高级消息队列协议)标准,并且支持多种语言和操作系统,包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…

实战:单点登录的两种实现方式,你学会了吗?

概念 单点登录(Single Sign-On,SSO)是一种身份验证服务,允许用户使用单个标识来登录多个应用程序或系统。如下图所示,用户只需要用户名/密码登陆一次就可以访问系统A、系统B和系统C。 在传统的登录方式中,…

HTML5 progress和meter控件

在HTML5中,新增了progress和meter控件。progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装、文件的复制等场景的进度。meter控件为计量条控件,表示某种计量,适用于温度、重量、金额等量化的表现。…

【CSS】文字扫光 | 渐变光

码来 可调整角度与颜色值来改变效果 <p class"gf-gx-color">我是帅哥</p> <style>.gf-gx-color {background: -webkit-linear-gradient(135deg,red,red 25%,red 50%,#fff 55%,red 60%,red 80%,red 95%,red);-webkit-text-fill-color: transparen…

中国物流成本高在哪里?怎么降低?

随着中国经济的快速发展&#xff0c;物流行业也得到了快速发展。然而&#xff0c;尽管中国物流行业的规模已经达到了世界领先水平&#xff0c;但中国物流成本也一直是业内关注的一个问题。那么&#xff0c;中国物流成本高在哪里&#xff1f;怎么降低呢&#xff1f;本文将从多个…

Surface渲染流程解析:如何实现车载智能座舱的高质量图像显示?

SurfaceFlinger简介 SurfaceFlinger是Android系统中负责图形渲染和显示的一个系统服务&#xff0c;SurfaceFlinger负责将来自多个应用程序的屏幕缓冲区组合成单个屏幕缓冲区&#xff0c;并将最终结果输出到系统的显示设备上。SurfaceFlinger在Android系统中是一个非常重要的服…

大数据分析案例-基于逻辑回归算法构建心脏病发作预测模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

C++基础:二维费用的背包问题

注意&#xff1a;如果你还没搞定&#xff08;指的是真正理解&#xff09;01背包&#xff0c;请不要看。看了脑壳更晕 什么是二维费用的背包问题&#xff1f;请看AcWing上的一道题&#xff1a; 有 N 件物品和一个容量是 V 的背包&#xff0c;背包能承受的最大重量是 M。 每件物…

【几分醉意赠书活动 - 05期】 | 《编程语言系丛图书》

个人主页&#xff1a; 陈老老老板的博客主页传送门 几分醉意.的博客主页传送门 赠书活动 | 第五期 本期好书推荐&#xff1a;《编程语言系列丛书》 粉丝福利&#xff1a;书籍赠送&#xff1a;共计送出30本 参与方式&#xff1a;关注公众号&#xff1a;码上天空 回复关键词&…

如果高考要考编程的话?不敢想,不敢想......

前几天不是高考嘛。 高考确实是当前时代下&#xff0c;比较公平的一个比武台了。说是人生中一次逆天改命的机会我觉得也不为过。 毋庸置疑&#xff0c;高考确实非常重要。但是其实我站在现在这个时间点&#xff0c;距离高考已经过去了 多年时间&#xff0c;回望这段经历的时候…

JavaWeb(HTML/CSS)

一.web概念概述 JavaWeb&#xff1a; 使用Java语言开发基于互联网的项目 做什么&#xff1a;做网页&#xff0c;其架构有; C/S: Client/Server 客户端/服务器端 是&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;对于用户来说…

Java入门 —— 打开Java世界的大门

目录 一. 了解Java 二.Java入门 三.变量 一. 了解Java 1.什么是程序 ——计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 2.Java是如何诞生的 ——1990年&#xff0c;sun公司启动了绿色计划&#xff0c;1992年sun公司创建了oak语言&#xff0c;后改名为Java…

Vue.js中的两大指令:v-on和v-bind,实现页面动态渲染和事件响应

Vue.js中的两大指令&#xff1a;v-on和v-bind&#xff0c;实现页面动态渲染和事件响应 一、Vue指令&#xff08;一&#xff09;v-bind指令&#xff08;二&#xff09;v-on指令1. 基本使用&#xff08;1&#xff09;最基本的语法 2. Vue中获取事件对象(了解)3. v-on 事件修饰符4…

Vue 利用Canvas标签实现动态验证码校验(前端必备附源码)

文章目录 一、前言二、Canvas简介- 什么是Canvas?- Canvas的基本使用 三、动态验证码的具体实现- 在项目中创建 SIdentify.vue 文件- 再创建要使用该组件的文件&#xff0c;App.vue 一、前言 当我们在平时进行登录或者注册账号的时候&#xff0c;往往都会遇到验证动态验证码的…