机器学习---朴素贝叶斯

朴素贝叶斯是一种用于分类和预测任务的算法,他的原理是基于贝叶斯定理。其中朴素的意思是假设各特征之间相互独立。这个实验我是用的老师课后作业的题目预测某天是否会打网球,假设每个特征独立。

目录

贝叶斯公式:

训练集:

处理训练集数据:

先验概率:

 后验概率:

 思路分析:

 代码及其运行结果截图:

 总代码及其运行截图:

总代码:

 运行结果截图:

实验中遇到的问题:

实验优缺点分析:

优点:

缺点:


贝叶斯公式:

 P(A|B)=\frac{P(B|A)P(B)}{P(A)}=\frac{P(Bi)P(A|Bi)}{\sum_{i=1}^{n}P(Bi)P(A|Bi) }

训练集:

处理训练集数据:

我在程序种用三个变量分别存储,定义一个字典ynum来存储每个预测类别的样本数量在这里也就是存储yes和no的数量,用xnum来存储每个预测类别的样本对应特征的数量。classes是个集合来存储预测的类别。

ynum = defaultdict(int)
xnum = defaultdict(lambda: defaultdict(int))
classes = set()

我们先把训练集处理一下得到每个样本种类的数量以及总的数量。看下面代码。通过遍历我们训练集中的数据,每次循环一个数据,假设我们取到第一个数据

sunnyhothighweakno

可以看到他有五个变量,我们就对这个进行处理,他的预测类别为no,就把他加入到集合中,再在ynum中对应no标签上加一,表示到这个数据no的数量。接下来就是依次取出sunny, hot, high, weak。我们先取到sunny,在xnum的no标签上的sunny上加上一,表示sunny分类为no的数量,下面依次得到就好了。

leny = len(y)for i in range(leny):fea = X[i]label = y[i]classes.add(label)ynum[label] += 1for fea1 in fea:xnum[label][fea1] += 1

最后我们得到处理完毕的数据。因为是字典型的数据,所以打印除其中的一部分看看。

先验概率:

根据以往经验和分析得到的概率

 P(C_i) = \frac{num}{n}

按照我的理解他就是统计每个类别出现的次数,除以总样本数,也就是该样本数除以总数,计算得到了每个类别的先验概率。

在我这个训练集中只有yes和no两种情况,那么他的先验概率也就是直接样本数除以总数得到。

    for label in classes:ynum[label] /= leny

 我们打印得到的后验概率得到:

如图所见,他两个分类的先验概率,分类为no的概率为5/14,分类为yes的概率为9/14。

 后验概率:

某件事已经发生,想要计算这件事发生的原因是由某个因素引起的概率

 思路分析:

 后验概率也就是说在某个已知条件下发生,也就是条件概率,这时候就要用到朴素贝叶斯公式

P(A|B)=\frac{P(B|A)P(B)}{P(A)}=\frac{P(Bi)P(A|Bi)}{\sum_{i=1}^{n}P(Bi)P(A|Bi) },由于相互独立,公式就简化为

P(A|B)=P(A)P(B)

对于每个测试集得到一个对应的预测分类,存储在predictions = [];我们每一次取到一个测试集数据。假设取到的是sunny, mild, normal, strong,我们要预测他是否会外出打乒乓球。我们就要遍历每一种类别得到这个数据预测为改类别的概率。我们用max_prob和predicted_class来记录预测概率最大的类别。因为我们是朴素贝叶斯,是假设每个特征之间相互独立的,所以计算起来就只需要把该类别对应的特征的概率累乘运行就可以得到该类别i下的后验概率,我们在所有类别后验概率中选取概率最大的那一个作为答案即可。

 代码及其运行结果截图:

def predict(X):predictions = []for fea in X:maxp = -0.01ans = Nonefor label in classes:p = ynum[label]for fea1 in fea:p *= xnum[label][fea1] / sum(xnum[label].values())if p > maxp:maxp = pans = labelpredictions.append(ans)return predictions

运行结果截图:

 总代码及其运行截图:

这边的测试集我就选取了两组:

['sunny', 'mild', 'normal', 'strong'], ['overcast', 'hot', 'high', 'weak']

总代码:

from collections import defaultdictynum = defaultdict(int)
xnum = defaultdict(lambda: defaultdict(int))
classes = set()
def xygl(X, y):leny = len(y)for i in range(leny):fea = X[i]label = y[i]classes.add(label)ynum[label] += 1for fea1 in fea:xnum[label][fea1] += 1for label in classes:ynum[label] /= leny#for label in classes:#    for feature in X[0]:#       print(label,fea, feature_counts[label][fea]);#for label in classes:#   print(label,"=",class_probabilities[label]);def predict(X):predictions = []for fea in X:maxp = -0.01ans = Nonefor label in classes:p = ynum[label]for fea1 in fea:p *= xnum[label][fea1] / sum(xnum[label].values())if p > maxp:maxp = pans = labelpredictions.append(ans)return predictionsT = ['outlook','temperature' ,'humidity', 'wind']X = [['sunny', 'hot', 'high', 'weak'],['sunny', 'hot', 'high', 'strong'],['overcast', 'hot', 'high', 'weak'],['rain', 'mild', 'high', 'weak'],['rain', 'cool', 'normal', 'weak'],['rain', 'cool', 'normal', 'strong'],['overcast', 'cool', 'normal', 'strong'],['sunny', 'mild', 'high', 'weak'],['sunny', 'cool', 'normal', 'weak'],['rain', 'mild', 'normal', 'weak'],['rain', 'mild', 'normal', 'strong'],['overcast', 'mild', 'high', 'strong'],['overcast', 'hot', 'normal', 'weak'],['rain', 'mid', 'high', 'strong']
]y = ['no', 'no', 'yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'no']xygl(X, y)test_data = []cnt = int(input("请输入测试集的数量:"))for t in range(cnt):sample = []for i in range(4):  # 假设每个样本有4个特征值test = input(f"特征为 {T[i]} : ")sample.append(test)test_data.append(sample)print("测试集数据为", test_data)predictions = predict(test_data)
lenp = len(predictions)
for i in range(lenp):print(f"测试集数据{i+1}:",test_data[i],"预测结果为",predictions[i])

 运行结果截图:

 上课测试数据运行结果:结果为no符合预期

实验中遇到的问题:

朴素贝叶斯算法的实现相比于决策树和ROC曲线都相对简单一点,又有给定公式,在算法的实现上相对容易。我在这个所以中遇到的问题主要在对数据集的选择上面,我原本打算直接采用之前的鸢尾花数据集的,但是我在实现算法之后,对测试集进行预测,发现这个程序的预测准确率非常低,几乎是对测试集中的预测都是错误的,朴素贝叶斯法虽然是假设每个特征之间相互独立的,但是每个特征之间的相关性对预测结果影响很大,然后就想起了老师上课小测的数据集,比较适合这个实验。

另一个遇到的问题就是数据的处理上面,刚开始没有想到用字典型,就导致我的程序处理数据比较麻烦,局限性比较强,后来学习了一下,改进了我的算法。

还有一个问题就是在测试的时候碰到超出训练集的数据的时候,这就说明我们的测试集不够完善,导致欠拟合,需要完善数据集。但是我们无法保障我们的训练集完善,这时候我们默认这个概率为1,根据公式来看p乘以1对该数据对我们的结果没有影响,也就是说我们相当于把该数据不考虑。

实验优缺点分析:

优点:

该算法的实现比较简单,因为假设每个特征相互独立,所以使得这个算法只需要简单的相乘就可以得到结果。相比于knn算法于决策树算法,他的时间和空间复杂度都是较小的,所以对比knn算法和决策树算法,在处理大规模数据上更具有优势,而且在每个特征之间相关性越小,朴素贝叶斯算法的预测结果就会更为准确。

缺点:

朴素贝叶斯算法的缺点也是最明显的,该算法假设了每个特征之间相互独立,而如果特征之间的相关性比较强,那朴素贝叶斯算法的预测准确率就会大大减低。而且在实验中的每一个特征值或多或少都有关联,所以朴素贝叶斯算法的局限性就比较强,容易造成欠拟合。

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

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

相关文章

最新版★重大升级★神点云连锁餐饮V2独立版点餐系统★公众号/h5/小程序前后端全套源码

提醒: 市场上流通很多老版本代码,一大堆问题且无法保证售后的源码,请各位买家一定要睁大眼睛,以防上当受骗!!!本系统源码全是经本人亲自测试与修复的完好版本,且本人用此版本源码已…

Java | Leetcode Java题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode partition(ListNode head, int x) {ListNode small new ListNode(0);ListNode smallHead small;ListNode large new ListNode(0);ListNode largeHead large;while (head ! null) {if (head.val < x…

第 1 天_二分查找【算法基础】

第 1 天_二分查找 前言34. 在排序数组中查找元素的第一个和最后一个位置题解官方33. 搜索旋转排序数组题解官方74. 搜索二维矩阵 前言 这是陈旧已久的草稿2021-11-09 19:33:44 当时在学习数据结构&#xff0c;然后再LeetCode上找了一个算法基础。 但是后来又没做了。 现在20…

使用LLaMA Factory来训练智谱ChatGLM3-6B模型

使用LLaMA Factory来训练智谱ChatGLM3-6B模型时&#xff0c;以下是一个训练过程&#xff1a; 1. 环境搭建 a. 安装Python和Anaconda 下载并安装适合你操作系统的Python版本&#xff08;推荐Python 3.10或更高版本&#xff09;。安装Anaconda&#xff0c;以管理Python环境和依…

【STM32+k210项目】基于AI技术智能语音台灯的设计(完整工程资料源码)

视频演示 基于AI技术智能语音台灯的设计 前言&#xff1a; 随着社会的快速发展&#xff0c;人们对家用电器智能化程度的要求越来越高。不管是对于学生人群还是对于工作加班者&#xff0c;台灯是每家每户必不可少的工具&#xff0c;长期处于光线太强或者过弱的环境中学习和一系列…

FreeRTOS二值信号量

目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量简介 三、二值信号量相关API 1、创建二值信号量 2、释放二值信号量 3、获取二值信号量 四、二值信号量实操 1、实验需求 2、CubeMX配置 3、代码实现 一、信号量的概念 1、信号量的基本概…

计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

本科毕业设计&#xff08;论文&#xff09;开题报告 课题名称 基于Spark的音乐推荐与数据分析系统 的设计与实现 课题类型 系统设计 学院 大数据与人工智能学院 班级 专业 数据科学与大数据技术 指导教师 职称 学生姓名 学号 重庆工程学院教务处制 1.课…

如何快速变得专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

智慧油田三维电子沙盘系统

深圳易图讯科技(www.3dgis.top)智慧油田三维电子沙盘系统采用三维GIS、大数据、云计算、虚拟现实、物联网、AI等前沿技术&#xff0c;支持无人机航拍、高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换&#xf…

【ESP32接入ATK-MO1218 GPS模块】

【ESP32接入ATK-MO1218 GPS模块】 1. 引言2. ATK-MO1218 GPS模块概述3. 接入ATK-MO1218 GPS模块的步骤4. 示例代码5. 结论1. 引言 在现代的嵌入式系统和物联网项目中,精确的位置信息是至关重要的。ATK-MO1218 GPS模块作为一款高性能的GPS/北斗双模定位模块,为开发者提供了强…

项目管理-计算题公式-补充【复习】

1.EMV决策树 定义&#xff1a;用决策树在若干备选行动方案中选择一个最佳方案。在决策树 中&#xff0c;用不同的分支代表不同的决策或事件&#xff0c;即项目的备选路径。每个决策或事件 都有相关的成本和单个项目风险(包括威胁和机会)。决策树分支的终点表示沿特 定路径发展的…

Xshell 7官网免费版下载与安装详细教程!学校/家庭使用免费哦~

一、 安装 1 卸载之前安装的xshell, 未安装忽略此步骤 2 解压本地文件&#xff0c;双击运行xshell**.exe, 按照提示安装 等候引导完成 3 点击下一步 4接受下一步 5 选择安装的路径 改成你自己的安装路径 6程序文件夹选择默认 7 取消勾选&#xff0c;激活之后操作 8 激活&…

Redis继续(黑马)

Redis持久化 RDB与AOF RDB记录是二进制数据&#xff0c;Redis停机时会触发保存&#xff0c;名称&#xff1a; dump.rdb 缺点&#xff1a;间歇式复制可能存在宕机数据更新丢失 AOF 记录的写操作命令&#xff0c;每秒记录一下&#xff0c;也存在数据更新丢失的可能&#xff0c;相…

视频剪辑批量转码技巧:如何将MP4视频快速转换为MP3音频的方法

在视频剪辑和音频处理的领域中&#xff0c;经常需要将视频文件转换为音频文件&#xff0c;特别是将MP4视频转换为MP3音频。这样的转换不仅可以减少文件大小&#xff0c;方便传输和存储&#xff0c;还可以在不损失音频质量的情况下&#xff0c;方便在各种设备上播放。下面&#…

Ubuntu18.04解决有线网卡连接问题(不更新内核成功版)

https://www.realtek.com/Download/List?cate_id584 &#xff08;需要翻一下&#xff09; 不想自己去下载&#xff0c;直接去我资源里下载我上传的包就好啦(&#x1f602;&#x1f602;&#x1f602;刚刚看了下别人下载要VIP还是自己去网站下很快的) 下载后解压&#xff0c;在…

基于Springboot的家教管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的家教管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

实验12:综合实验

1、实验目的及要求&#xff1a; 通过本次实验完成一个小型网络中配置设备。实现配置一个路由器、两个交换机和两台PC&#xff0c;以支持IPv4和IPv6连接&#xff1b;路由器和交换机必须安全管理&#xff0c;配置VLAN间路由、DHCP、以太网通道和端口安全。通过登录思科网络技术学…

设计模式 六大原则之开放封闭原则

文章目录 定义理解 小结 定义 开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的&#xff0c;但对于修改是封闭的。这意味着应该用抽象定义结构&#xff0c;用具体实现扩展细节&#xff0c;以此确保软件系统开发和维护过程的可靠性。 理解 怎么理解这个呢&#x…

PHP笔记

1. 搭建运行环境 1.1 挂载光盘 [rootredhat200 ~]# mount /dev/sr0 /mnt 1.2 配置仓库 # 查看仓库列表 [rootredhat200 ~]# dnf repolist# 进入到仓库目录 [rootredhat200 ~]# cd /etc/yum.repos.d/ # 编辑仓库文件 [rootredhat200 yum.repos.d]# vim base.repo # 查看仓库…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…