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

news2024/9/24 3:20:25

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

目录

贝叶斯公式:

训练集:

处理训练集数据:

先验概率:

 后验概率:

 思路分析:

 代码及其运行结果截图:

 总代码及其运行截图:

总代码:

 运行结果截图:

实验中遇到的问题:

实验优缺点分析:

优点:

缺点:


贝叶斯公式:

P(A|B)=\frac{P(B|A)P(B)}{P(A)}=\frac{P(Bi)P(A|Bi)}\sum_{n}^{i=1} 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] += 1
        for fea1 in fea:
            xnum[label][fea1] += 1

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

先验概率:

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

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

在我这个训练集中只有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_{n}^{i=1} P(Bi)P(A|Bi)}

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

 代码及其运行结果截图:

def predict(X):
    predictions = []

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

运行结果截图:

 总代码及其运行截图:

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

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

总代码:

from collections import defaultdict

ynum = 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] += 1
        for fea1 in fea:
            xnum[label][fea1] += 1

    for 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.01
        ans = None
        for label in classes:
            p = ynum[label]
            for fea1 in fea:
                p *= xnum[label][fea1] / sum(xnum[label].values())
            if p > maxp:
                maxp = p
                ans = label
        predictions.append(ans)
    return predictions


T = ['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])

 运行结果截图:

实验中遇到的问题:

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

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

实验优缺点分析:

优点:

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

缺点:

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

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

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

相关文章

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中,除了对视频本身的编辑和修改,元数据的管理和修改同样重要。元数据,如标题、艺术家、专辑封面等,不仅提供了视频文件的基本信息,还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

微信答题链接怎么做_新手也能快速上手制作

在数字营销日新月异的今天,如何有效吸引用户参与、提升品牌曝光度,成为了每一个营销人都在思考的问题。而微信答题链接,作为一种新兴的互动营销方式,正以其独特的魅力,在营销界掀起一股新的热潮。今天,就让…

XSS Challenges 靶场通关解析

前言 XSS Challenges(跨站脚本攻击挑战)是一种用于学习和测试跨站脚本(XSS)漏洞的实验性平台。这些挑战旨在帮助安全研究人员和开发人员了解XSS漏洞的工作原理、检测方法和防御技巧。 通常,XSS Challenges平台提供一…

高德地图在vue3项目中使用:实现画矢量图、编辑矢量图

使用高德地图实现画多边形、矩形、圆&#xff0c;并进行编辑保存和回显。 1、准备工作 参考高德地图官网&#xff0c;进行项目key申请&#xff0c;链接: 准备 2、项目安装依赖 npm i amap/amap-jsapi-loader --save3、地图容器 html <template><!-- 绘制地图区域…

使用脚本启动AppImage应用程序

因为特殊需求不能直接双击运行appimage程序&#xff0c;需要用到脚本启动 1.创建一个.desktop文件 2.添加以下内容 [Desktop Entry] //这是一个配置的开始 TypeApplication //定义了应用程序的类型&#xff0c;这里是Application Namemyapp //应用程序的名称 //应用…

ASP.NET网络商店销售管理系统的设计与实现

摘 要 随着软件技术的不断进步和发展&#xff0c;信息化的管理方式越来越广泛的应用于各个领域&#xff0c;对于任何网站系统的管理来说开发一套现代化的成员管理软件是十分必要的。通过这样的软件系统&#xff0c;可以做到成员的规范管理和快速查询&#xff0c;从而减少管理…

小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具

文章目录 小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具概述笔记效果编译AStyle的DLL初次使用接口的小疑惑测试程序 - 头文件测试程序 - 实现文件测试程序 - RC备注END 小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具 概述 上一个实验(vs2019 - ast…

记对MYSQL蜜罐的溯源反制研究

Mysql蜜罐的利用 Mysql任意文件读取 mysql蜜罐通过搭建一个简单的mysql服务&#xff0c;如果攻击者对目标客户进行3306端口爆破&#xff0c;并且用navicat等工具连接蜜罐服务器&#xff0c;就可能被防守方读取本地文件&#xff0c;包括微信配置文件和谷歌历史记录等等&#x…

LNMP一键安装包

LNMP一键安装包是什么? LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…

sql中索引的使用分析

主要学习和记录sql中索引的使用 1.批量在库里插入了27W条数据 CREATE DEFINERroot% PROCEDURE 批量插入() BEGIN #Routine body goes here... DECLARE i int; SET i1; WHILE (i<100000) DO insert into kucun_info (shop_name,shop_code,shop_price,sh…

C#图像:1.图像区域分割与提取

&#xff08;1&#xff09;创建一个名为SplitImage的窗体的应用程序&#xff0c;将窗体改名为FormSplitImage。 &#xff08;2&#xff09;创建一个名为ImageProcessingLibrary的类库程序&#xff0c;为该工程添加名为ImageProcessing的静态类 &#xff08;3&#xff09;为Imag…

Video2Game:革新游戏开发,重塑虚拟世界的未来

Video2Game&#xff1a;革新游戏开发&#xff0c;重塑虚拟世界的未来 一、Video2Game的提出与意义二、Video2Game的核心技术三、Video2Game的实现与应用四、代码实例与未来展望 在数字化和虚拟化日益盛行的今天&#xff0c;高质量的交互式虚拟环境&#xff0c;如游戏和模拟器&a…

【精品毕设推荐】基于Javaee的影视创作论坛的设计与实现

点击下载原文及代码 摘 要 随着时代的发展&#xff0c;互联网的出现&#xff0c;给传统影视行业带来的最大便利就是&#xff0c;方便了影视从业人员以及爱好者的交流和互动&#xff0c;而为用户提供一个书写影评&#xff0c;阅读影评以及回复影评的平台&#xff0c;以影评为…

云原生专栏丨基于K8s集群网络策略的应用访问控制技术

在当今云计算时代&#xff0c;Kubernetes已经成为容器编排的事实标准&#xff0c;它为容器化应用提供了强大的自动化部署、扩展和管理能力。在Kubernetes集群中&#xff0c;网络策略(Network Policy)作为对Pod间通信进行控制的关键功能&#xff0c;对保障应用安全和隔离性起到了…

R可视化:不同分页界面分组添加显著性标记符号

介绍 对不同分页界面的分组数据添加显著性标记符号,虽然也可以通过ggpubr包的stat_compare_means()添加分组显著性标记符号,但它要求x轴必须是分组变量,不能对fill映射出来的分组做处理。为应对不同分组的fill映射分组,我们需要另寻他法。本文通过geom_text, geom_segment…

Linux编译内核模块生成.KO驱动示例

现在的Linux内核十分庞大&#xff0c;驱动繁多&#xff0c;但是仍有一些是内核所不包含的&#xff0c;或者我们前期进行了内核裁剪&#xff0c;但后面又需要添加一些驱动&#xff0c;但是又不想重新烧录内核&#xff0c;这时候就可以使用内核模块功能&#xff0c;对内核驱动进行…

Linux图形化界面怎么进入?CentOS 7图形界面切换

CentOS 7默认只安装命令行界面。要切换到图形界面&#xff0c;需要先检查系统是否安装图形界面&#xff0c;在终端输入以下命令&#xff1a; systemctl get-default若是返回结果是“multi-user.target”表示系统没有安装图形界面&#xff1b;若是返回结果是“graphical.target…

等保测评—Linux-CentOS标准范例截图

密码输入错误无法登录 用户账户情况包含root、guanli、shenji 查看审计用户权限 身份鉴别&#xff1a; cat /etc/passwd&#xff0c;核查用户名和 UID&#xff0c;是否存在同样的用户名和 UID cat /etc/shadow&#xff0c;查看文件中各用户名状态 &#xff0c; 核查密码一栏为…

文件批量改名字怎么改(怎样批量修改文件名)

文件批量改名字怎么改&#xff08;怎样批量修改文件名&#xff09; 批量重命名文件可以通过多种方法实现&#xff0c;具体取决于用户的操作系统和熟练程度。 以下是一些常见的方法&#xff1a; 下载地址https://download.csdn.net/download/dhyuan_88/89237041 使用操作系统自带…

On Hold 频发!又3本期刊被标记为On Hold ,大家谨慎投递!

【SciencePub学术】On Hold 频发&#xff01;小编在查阅资料的时候发现又有3本期刊被标记为On Hold 了&#xff0c;今天小编给大家详细介绍一下这3本期刊。 来源&#xff1a;科睿唯安官网 Results in Physics 1 期刊概况 【期刊简介】IF&#xff1a;5.3&#xff0c;JCR1区&am…