Python28-3 朴素贝叶斯分类算法

朴素贝叶斯算法简介

朴素贝叶斯(Naive Bayes)算法是一种基于贝叶斯定理的分类算法。它广泛应用于文本分类、垃圾邮件检测和情感分析等领域。该算法假设特征之间是独立的,这个假设在实际情况中可能并不完全成立,但Naive Bayes在许多实际应用中仍表现良好。

贝叶斯定理描述了后验概率的计算方法,公式如下:

在分类问题中,A表示类别,B表示特征向量。Naive Bayes算法通过最大化后验概率来进行分类:

由于特征之间独立的假设,后验概率可以简化为:

其中,( P(c) ) 是先验概率,可以通过样本中的类别频率估计;( P(x_i|c) ) 是条件概率,可以通过类别中特征的频率估计。

Python实现和可视化示例

下面是一个使用Python实现朴素贝叶斯分类算法的示例,并对其结果进行可视化。我们将使用scikit-learn库来简化实现过程,并使用经典的鸢尾花数据集进行分类。我们首先加载鸢尾花数据集并将其拆分为训练集和测试集。然后,我们使用scikit-learn中的GaussianNB类创建一个高斯朴素贝叶斯分类器,并对训练集进行训练。接下来,我们对测试集进行预测并计算准确率。最后,我们通过混淆矩阵和决策边界的可视化来展示分类结果。

# 导入必要的库
import numpy as np  # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于数据可视化
from sklearn.datasets import load_iris  # 从scikit-learn库导入加载鸢尾花数据集的函数
from sklearn.model_selection import train_test_split  # 从scikit-learn库导入拆分数据集的函数
from sklearn.naive_bayes import GaussianNB  # 从scikit-learn库导入高斯朴素贝叶斯分类器
from sklearn.metrics import accuracy_score, ConfusionMatrixDisplay  # 从scikit-learn库导入计算准确率和显示混淆矩阵的函数

# 加载数据集
iris = load_iris()  # 加载鸢尾花数据集,iris 是一个包含数据和目标值的字典对象
X, y = iris.data, iris.target  # 将数据集中的数据赋值给 X,将目标值赋值给 y

# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用train_test_split函数将数据集拆分为训练集和测试集,测试集占30%,随机种子设为42以保证结果可复现

# 创建高斯朴素贝叶斯分类器
gnb = GaussianNB()  # 实例化一个高斯朴素贝叶斯分类器对象

# 训练模型
gnb.fit(X_train, y_train)  # 使用训练集数据训练模型

# 进行预测
y_pred = gnb.predict(X_test)  # 使用测试集数据进行预测

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)  # 计算预测结果的准确率
print(f"Accuracy: {accuracy:.2f}")  # 输出准确率,保留两位小数

# 混淆矩阵可视化
disp = ConfusionMatrixDisplay.from_estimator(gnb, X_test, y_test, display_labels=iris.target_names, cmap=plt.cm.Blues)
# 创建混淆矩阵显示对象,并使用测试集的预测结果和真实结果
plt.title("Confusion Matrix")  # 设置图表标题
plt.show()  # 显示混淆矩阵图表

# 绘制特征空间中的决策边界
def plot_decision_boundaries(X, y, model):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1  # 计算特征1的取值范围
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1  # 计算特征2的取值范围
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
    # 创建一个网格,用于绘制决策边界

    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])  # 对网格上的每个点进行预测
    Z = Z.reshape(xx.shape)  # 将预测结果的形状重塑为与网格相同

    plt.contourf(xx, yy, Z, alpha=0.3)  # 绘制决策边界
    plt.scatter(X[:, 0], X[:, 1], c=y, s=30, edgecolor='k')  # 绘制样本点
    plt.title("Decision Boundaries")  # 设置图表标题
    plt.xlabel('Feature 1')  # 设置x轴标签
    plt.ylabel('Feature 2')  # 设置y轴标签
    plt.show()  # 显示图表

# 由于鸢尾花数据集有4个特征,我们只选取前两个特征来绘制决策边界
X_train_2d = X_train[:, :2]  # 选择训练集的前两个特征
X_test_2d = X_test[:, :2]  # 选择测试集的前两个特征
gnb_2d = GaussianNB()  # 实例化一个新的高斯朴素贝叶斯分类器对象
gnb_2d.fit(X_train_2d, y_train)  # 使用前两个特征的训练集数据训练模型

plot_decision_boundaries(X_test_2d, y_test, gnb_2d)  # 绘制测试集的决策边界

运行结果:

图片

混淆矩阵(Confusion Matrix)是用于评估分类模型性能的工具。它通过对实际类别和预测类别进行对比,详细展示了分类模型的性能表现。混淆矩阵是一个方阵,矩阵中的每个元素表示在某个实际类别和某个预测类别之间的实例数量。具体来说,混淆矩阵可以帮助我们了解以下几个方面:

  1. True Positives (TP): 正确预测为正类的样本数量。

  2. True Negatives (TN): 正确预测为负类的样本数量。

  3. False Positives (FP): 错误预测为正类的样本数量(实际上是负类)。

  4. False Negatives (FN): 错误预测为负类的样本数量(实际上是正类)。

在示例中,我们有以下的混淆矩阵,表示模型在三类鸢尾花上的分类结果:

          Setosa Versicolor Virginica
Actual
Setosa       19        0         0
Versicolor    0       12         1
Virginica     0        0        13
  • Setosa: 19个样本被正确分类为Setosa。

  • Versicolor: 12个样本被正确分类为Versicolor。

  • Virginica: 13个样本被正确分类为Virginica,1个样本被错误分类为Versicolor。

图片

上图是针对数据前两维特征进行分类的结果。可以看出与混淆矩阵所展现的情况并不一致。这是因为上述两种情况使用的特征维度不同,在决策边界图中,我们只使用了前两个特征(X_train[:, :2] 和 X_test[:, :2])来绘制二维平面中的决策边界,而混淆矩阵的分类结果是基于所有特征(鸢尾花数据集有四个特征)。其次,在决策边界图中数据点在二维平面中的分布可能无法完全代表高维空间中的数据分布。


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

java笔记(30)——反射的 API 及其 使用

文章目录 反射1. 什么是反射2. 获取class字段(字节码文件对象)方式1方式2方式3应用 3. 获取构造方法和权限修饰符前期准备获取所有的公共构造方法获取所有的构造方法获取无参构造方法获取一个参数的构造方法获取一个参数的构造方法获取两个参数的构造方法…

Java面试题--JVM大厂篇之G1 GC的分区管理方式如何减少应用线程的影响

目录 引言: 正文: 1. 区域划分(Region) 2. 并行和并发回收 3. 区域优先回收(Garbage First) 4. 可预测的停顿时间 5. 分阶段回收 6. 复制和压缩 实际效果: 场景举例 1. 减少单次GC的影响 2. 支持高并发环境 3. 优…

数学建模(1):期末大乱炖

1 概述!! 1.1 原型和模型 原型:客观存在的研究对象称为原型,也称为“系统”、“过程”。 机械系统、电力系统、化学反应过程、生产销售过程等都是原型; 研究原型的结构和原理, 从而进行优化、预测、评价…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python: 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm,MPA)[1] 该算法由Faramarzi等于2020年提出,其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

【MySQL】Linux下MySQL的目录结构、用户、权限与角色

一、Linux下MySQL的目录结构 1、MySQL相关目录 数据库文件存放路径:/var/lib/mysql数据库命令存放路径:/user/bin和/user/sbin配置文件目录:/usr/share/mysql-8.0/、/usr/share/mysql/和/etc/my.cnf 2、假设我们创建了一个数据库dbtest1&a…

使用evo工具比较ORB-SLAM3的运行轨迹(从安装到解决报错)

ORB-SLAM2和ORB-SLAM3怎么跑出来,之前都有相关的保姆级的教程,下来给大家介绍一款evo工具,给科研加速!!! 文章目录 1.下载evo2.生成轨迹3.evo别的功能使用 1.下载evo 输入命令下载 pip install -i https…

你真的会udf提权???数据库权限到系统权限 内网学习 mysql的udf提权操作 ??msf你会用了吗???

我们在已经取得了数据库的账号密码过后,我们要进一步进行提取的操作,我们mysql有4钟提权的操作。 udf提权(最常用的)mof提权启动项提权反弹shell提权操作 怎么获取密码操作: 怎么获取密码,通过sql注入获取这个大家都应该知道了&a…

百强韧劲,进击新局 2023年度中国医药工业百强系列榜单发布

2024年,经济工作坚持稳中求进、以进促稳、先立后破等工作要求。医药健康行业以不懈进取的“韧劲”,立身破局,迎变启新。通过创新和迭代应对不确定性,进化韧性力量,坚持高质量发展,把握新时代经济和社会给予…

零基础开始学习鸿蒙开发-读书app简单的设计与开发

目录 1.首页设计 2.发现页面的设计 3.设置页面的设计 4.导航页设计 5.总结: 6.最终的效果 1.首页设计 Entry Component export struct home {State message: string 首页build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.B…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点,有学者在小波分析基础上引入调频算子构成了线性调频小波变换,线调频小波一方面继承了小波变换的理论完善性,另一方面用一个新的参数(线调频参数)刻…

构建高效业财一体化管理体系

构建高效业财一体化管理体系 业财一体化战略意义 提升决策质量 强化数据支撑:通过整合业务与财务数据,为决策提供准确、实时的信息基础,确保分析的深度与广度。促进业务与财务协同:打破信息孤岛,实现业务流程与财务管…

Django 定义模型执行迁移

1,创建应用 Test/app8 python manage.py startapp app8 2,注册应用 Test/Test/settings.py 3,配置路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(app8/, include(a…

Linux服务器上安装CUDA11.2和对应的cuDNN 8.4.0

一、检查 检查本机是否有CUDA工具包,输入nvcc -V: 如图所示,服务器上有CUDA,但版本为9.1.85,版本过低,因此博主要重装一个新的。 二、安装CUDA 1.查看服务器最高支持的CUDA版本 在命令行输入nvidia-smi查看显卡驱动…

Mining Engineering First Aid Riding

4个最主要的日常技能:Mining 采矿 Engineering 工程 First Aid 急救 Riding 骑术 4个最主要的日常技能

C# 信号量的使用

学习来源:《.net core 底层入门》 第六章第9节:信号量 案例:主线程负责添加数据,子线程负责获取数据 使用SemaphoreSlim(轻信号量)实现: using System; using System.Collections.Generic; us…

AI写作变现指南:从项目启动到精通

项目启动 1. 确定目标客户群体 首先,明确谁是我们的目标客户。以下是一些潜在的客户群体: 大学生:他们需要写论文、报告、演讲稿等。 职场人士:包括需要撰写商业计划书、市场分析报告、项目提案等的专业人士。 自媒体从业者&…

TiDB-从0到1-BR工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、BR工具 BR工具全称backup & restore,如同MySQL可以通过mysqldump和xtrabackup进行备份…

入门JavaWeb之 JDBC 连接数据库

JDBC:Java Database Connectivity,Java 数据库连接 需要 jar 包支持: java.sql javax.sql mysql-connector-java(连接驱动,必须导入) 在 MySQL 先建个 jdbc 数据库后 USE jdbc; 执行后再 CREATE TABLE…

Java_日志

日志技术 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中) 可以随时以开关的形式控制日志启停,无需侵入到源代码中去进行修改。 日志技术的体系结构 日志框架:JUL、Log4j、Logback、其他实现。 日志接口&#xf…

youlai-boot项目的学习(3) 本地redis、MinIO的安装与配置

youlai-boot项目除了使用mysql数据库、还有redis,以及OSS服务,OSS除了云OSS服务,还有自部署的MinIO服务。 前面我们已经安装好了mysql数据库,那么我们来看看本地redis、MinIO服务怎么部署 环境 mac OS, iterm2&#…