朴素贝叶斯案例

一、朴素贝叶斯算法:

朴素贝叶斯算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法,基于贝叶斯后验概率建立的模型,它用于解决分类问题。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。

它的主要思想是,通过历史数据,对每个类别建立经验概率公式,然后当新样本进来时,用各个类别的概率经验公式分别进行预测,最终,属于哪个类别的概率最大,就认为是哪个类别。

二、计算条件概率

朴素贝叶斯算法的核心内容即使贝叶斯公式,也就是计算特征在类别下的条件概率的计算,贝叶斯原理为,在已知发生B条件下,发生A的概率为:

P(A):为先验概率,即在B事件发生之前,对A事件发生概率的预判。

P(A|B):为后验概率,即在B事件发生之后,对A事件发生概率的重新评估。

P(B|A)/P(B):为可能性函数,是一个调整因子,使得预估概率更加接近真实概率。可以理解为:P(B)P(A∣B) = P(B∣A)P(A),即:发生B,且发生A = 发生A且发生B。

换个表达形式就会明朗很多,如下:

所以贝叶斯公式可以表示为:后验概率=先验概率 * 调整因子

三、预测精度的计算与评估

estimator.score():一般最常见使用的是准确率,即预测结果正确的百分比。

也可以使用召回率(Recall),真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)

其他分类标准,F1-score,反映了模型的稳健型,F1值是准确率和召回率的调和平均数。

也可以使用分类模型评估API: sklearn.metrics.classification_report

sklearn.metrics.classification_report(y_true,y_pred,target_names=None)

  y_true:真实目标值

  y_pred:估计器预测目标值

  target_names:目标类别名称

  return:每个类别精确率与召回率

四、编程实现贝叶斯分类算法,并对简单应用样本数据实现预测分类

算法过程描述:

我们以西瓜的特征为变量,好坏质量为二元结果,准备数据如下:

定义一个名数组进行数据集的存储。数据集的每一行表示一个西瓜的属性,包括色泽、根蒂、敲击、纹理、脐部和触感。最后一行表示西瓜是好瓜还是坏瓜。

并且申请一个字典存放特征features(特征)的可能值,并为最终的二元结果申请一个列表标签 labels(标签)。

以上查看数据,即标签的分布比例。

from pprint import pprint
import numpy as np
dataset = np.array([# 色泽,根蒂,敲击,纹理,脐部,触感, 好坏['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']
])features = {'色泽': ['青绿', '乌黑', '浅白'],'根蒂': ['蜷缩', '稍蜷', '硬挺'],'敲击': ['浊响', '沉闷', '清脆'],'纹理': ['清晰', '稍糊', '模糊'],'脐部': ['凹陷', '稍凹', '平坦'],'触感': ['硬滑', '软粘']
}labels = ["好瓜", "坏瓜"]class Bayes:def __init__(self, features: dict, labels: list) -> None:self.features = featuresself.labels = labelsself.feature_classes = list(self.features.keys())self.condi_prob = {}self.prior_prob = {}self._statistic = {}self._samples = 0for i in self.labels:self.prior_prob[i] = 1 / len(self.labels)self.condi_prob[i] = {}self._statistic[i] = 0for j in self.feature_classes:self.condi_prob[i][j] = {}for k in self.features[j]:self.condi_prob[i][j][k] = 1 / len(self.features[j])self._statistic['.'.join([i, j, k])] = 0def bayes_prob(self, arr):plist = []for i in self.labels:idx = 0p = self.prior_prob[i]for j in self.feature_classes:p *= self.condi_prob[i][j][arr[idx]]idx += 1plist.append(p)return plistdef train(self, X, Y):rows, cols = X.shapefor i in range(rows):self._statistic[Y[i]] += 1for j in range(cols):self._statistic['.'.join([Y[i], self.feature_classes[j], X[i, j]])] += 1self._samples += 1for i in self.labels:self.prior_prob[i] = (self._statistic[i] + 1) / (self._samples+len(self.labels))for j in self.feature_classes:for k in self.features[j]:self.condi_prob[i][j][k] = (self._statistic['.'.join([i, j, k])] + 1) / (self._statistic[i] + len(self.features[j]))def predic(self, X):rows, cols = X.shaperes = []for i in range(rows):y = self.bayes_prob(X[i])res.append(y)res = np.argmax(res, axis=1)res = [self.labels[x] for x in res]return np.array(res)def show_params(self) -> str:pprint(self.prior_prob)pprint(self.condi_prob , sort_dicts=False)# pprint(self._statistic)if __name__ == "__main__":X = dataset[:, :6]Y = dataset[:, 6]print(X)print(Y)clf = Bayes(features, labels)clf.show_params()clf.train(X, Y)clf.show_params()Yp = clf.predic(X)print(f"原始:{Y}\n预测:{Yp}\n准确率:{np.sum(Y==Yp)/len(Y)}")

进行初始化,初始化函数来构建一个朴素贝叶斯分类器,接收两个参数:features和labels。

将features和labels分别赋值给实例变量,计算特征类的列表,并初始化self.condi_prob(条件概率)、self.prior_prob(先验概率)、self._statistic(统计信息)和self._samples(样本数量)。

函数遍历labels中的每个标签,并计算先验概率,遍历features中的每个特征,并初始化一个空字典,用于存储特征在标签下的条件概率。

函数遍历features中的每个特征和每个可能的特征值,并计算条件概率。同时,它将特征值与标签组合成一个字符串,并将其作为键添加到字典中,初始值为0。

接下来训练朴素贝叶斯分类器。

第一部分遍历所有样本,统计每个类别和每个特征值出现的次数。使用两个字典`_statistic`和`_samples`来存储这些统计信息。

第二部分计算先验概率和条件概率。先验概率是指在给定类别的情况下,某个特征值出现的概率。条件概率是指在给定某个特征值的情况下,某个类别出现的概率。使用贝叶斯公式来计算这些概率。

然后,准备计算贝叶斯的概率函数。初始化一个空列表,用于存储每个类别的贝叶斯概率。遍历类标签列表,对于每个类标签,计算先验概率。遍历特征类别列表,对于每个特征类别,计算条件概率。将计算出的条件概率乘以先验概率,并将结果添加到返回值列表中。

定义一个分类器, 申请一个空列表,用于存储每个样本的预测结果。调用前面我们提到的计算贝叶斯的概率函数方法计算当前行的概率分布。返回数组中每行的最大值的下标,即预测结果。最后将预测结果转换为对应的类别标签存储为一维数组。

在训练前后我们可以分别显示模型参数。打印两个字典,计算先验概率、条件概率,下图为训练前模型参数:

下图为训练后模型参数:

以下是模型的两次预测结果及准确率,趋于一致:

具体来说,原始的标签包括了17个样本,其中有8个属于"好瓜"类别,9个属于"坏瓜"类别。预测的结果与原始标签进行了比较,其中有14个样本的预测结果与原始标签一致,3个样本的预测结果与原始标签不一致。

根据比较结果计算得到的准确率为0.8235,召回率为0.875。这个准确率表明,贝叶斯算法在这个测试数据集上的分类表现较为良好,但仍有改进的空间。

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

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

相关文章

【Python】已解决:ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 在Python编程中,ModuleNotFoundError是一个常见的错误,它通常发生…

C语言中的进制转换

基础概念 进制又称数制,是指用一组固定的符号和统一的规则来表示数值的方法,在C语言中,可以使用不同的前缀来表示不同的进制: 二进制:以0b或0B为前缀(部分编译器可能不支持)八进制&#xff1a…

【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)

文章目录 一、文章概览(一)问题的提出(二)文章工作 二、理论背景(一)密度比估计DRE(二)去噪扩散模型 三、方法(一)推导分类和去噪之间的关系(二&a…

LVGL8.3动画图像(太空人)

LVGL8.3 动画图像 1. 动画图像本质 我们知道电影属于视频,而电影的本质是将一系列动作的静态图像进行快速切换而呈现出动画的形式,也就是说动画本质是一系列照片。所以 lvgl 依照这样的思想而定义了动画图像,所以在 lvgl 中动画图像类似于普…

能理解你的意图的自动化采集工具——AI和爬虫相结合

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

浅聊Cookie

前言 在客户端使用Nuxt的useFetch调用接口并存储cookie&#xff0c;发现一些趣事~ cookie存储需要遵守同源策略~ 理论我们是知道的&#xff0c;但具体是怎么一回事呢~ 实现 在Nuxt中是这样的~ 直接访问 Nuxt <template><div>{{ data }}</div> </te…

【python】python学生成绩数据分析可视化(源码+数据+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

c#使用自带库对字符串进行AES加密、解密

文章目录 1 代码1.1 定义Aes加密类块1.2 在主函数中调用 2 获取Key和IV2.1 基本方法2.2 自定义Key2.3 技术方面的原理 参考文章&#xff1a; C#软件加密实例&#xff1f; 。 参考官文&#xff1a; Aes 类。 在使用C#的自带的System.Security.Cryptography.Aes模块进行加密和解…

Spdlog日志库的安装配置与源码解析(Linux)

为什么使用日志库而不是控制台输出&#xff1f; 日志库通常提供了更丰富的功能&#xff0c;比如可以设置日志输出级别、输出到不同的目标&#xff08;比如控制台、文件、网络等&#xff09;&#xff0c;以及格式化输出等。 使用日志库可以使代码更易于维护。通过统一的日志接口…

Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符&#xff0c;今天我们使用pytesseract.image_to_data来检测文本并显示 实战教程 和上一次一样&#xff0c;添加opencv-python和pytesseract库 首先我们先来了解一下pytesseract.image_to_data pytesseract.image_to_data(…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口切换SMB共享WMI管道DCOM组件Impacket套件CS插件

红队内网攻防渗透 1. 内网横向移动1.1 WMI进行横向移动1.1.1 利用条件:1.1.1 利用详情1.1.1.1 wmic1.1.1.1.1 正向shell上线1.1.1.1.2 反向shell上线1.1.1.2 cscript(不建议使用)1.1.1.3 wmiexec-impacket1.1.1.4 cs插件1.2 SMB横向移动1.2.1 利用条件:1.2.2 利用详情1.2.2…

基于YOLOv5的火灾检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

基于YOLOv5的火灾检测系统的设计与实现 概述系统架构主要组件代码结构功能描述YOLOv5检测器视频处理器主窗口详细代码说明YOLOv5检测器类视频处理类主窗口类使用说明环境配置运行程序操作步骤检测示例图像检测视频检测实时检测数据集介绍数据集获取数据集规模YOLOv5模型介绍YOL…

对日期的处理

对日期的处理 对编码进行统一&#xff0c;在脚本最开始&#xff1a; # -*- coding: utf-8 -*-这里涉及到两个操作&#xff0c;一个是将数据进行标准化&#xff0c;比如有些日期是2024/05/06这并不符合日期的标准格式&#xff0c;需要转换成这样的2024-05-06 def tran_std(st…

java基于ssm+jsp 社区疫情防控管理信息系统

1前台首页功能模块 社区疫情防控管理信息系统&#xff0c;在社区疫情防控管理信息系统可以查看首页、物品信息、论坛信息、新闻资讯、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 用户登录、用户注册&#xff0c;通过注册填写账号、密码、姓名、身份证、…

正则表达式,linux文本三剑客

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容&#xff0c;按行进行匹配 文本三剑客&#xff1a; grep 过滤文本内容 sed 针对文本内容进行增删改查 awd 按行取列 一.grep命令 作用就是使用正则表达式来匹配文本内容 -m 数字&#xff1a;匹配…

在linux系统中使用docker、mysql实例

systemctl 是一个命令行工具&#xff0c;用于控制和管理基于 systemd 的 Linux 发行版中的系统和服务。 启动服务 &#xff1a;使用 systemctl start [service-name] 开始一个服务。 如启动docker&#xff1a;systemctl start docker 停止服务 &#xff1a;使用 systemctl st…

直播预约丨《袋鼠云大数据实操指南》No.3:数据资产管理实操,如何有效进行数据治理

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

[Shell编程学习路线]——While循环应用技巧 (详细讲解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 基本结构 图示原理 示例 测试 …

链动2+1模式:解锁用户留存与复购的增长密码

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的软件开发公司&#xff0c;专注于为用户打造卓越的产品体验。今天&#xff0c;我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式&#xff0c;以及它是如何助力我们提升用户留存和复购率的。 尽管链…

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…