Python 全栈体系【四阶】(十二)

news2024/9/28 21:19:21

第四章 机器学习

十五、朴素贝叶斯

朴素贝叶斯是一组功能强大且易于训练的分类器,它使用贝叶斯定理来确定给定一组条件的结果的概率,“朴素”的含义是指所给定的条件都能独立存在和发生。朴素贝叶斯是多用途分类器,能在很多不同的情景下找到它的应用,例如垃圾邮件过滤、自然语言处理等。

1. 概率

1.1 定义

概率是反映随机事件出现的可能性大小。随机事件是指在相同条件下,可能出现也可能不出现的事件。例如:

(1)抛一枚硬币,可能正面朝上,可能反面朝上,这是随机事件。正/反面朝上的可能性称为概率;

(2)掷骰子,掷出的点数为随机事件。每个点数出现的可能性称为概率;

(3)一批商品包含良品、次品,随机抽取一件,抽得良品/次品为随机事件。经过大量反复试验,抽得次品率越来越接近于某个常数,则该常数为概率。

我们可以将随机事件记为 A 或 B,则 P(A), P(B)表示事件 A 或 B 的概率。

1.2 联合概率与条件概率
1.2.1 联合概率

指包含多个条件且所有条件同时成立的概率,记作 P ( A , B ) P ( A , B ) P(A,B) ,或 P ( A B ) P(AB) P(AB),或 P ( A ⋂ B ) P(A \bigcap B) P(AB)

1.2.2 条件概率

已知事件 B 发生的条件下,另一个事件 A 发生的概率称为条件概率,记为: P ( A ∣ B ) P(A|B) P(AB) p(下雨|阴天)

1.2.3 事件的独立性

事件 A 不影响事件 B 的发生,称这两个事件独立,记为:

P ( A B ) = P ( A ) P ( B ) P(AB)=P(A)P(B) P(AB)=P(A)P(B)

因为 A 和 B 不相互影响,则有:

P ( A ∣ B ) = P ( A ) P(A|B) = P(A) P(AB)=P(A)

可以理解为,给定或不给定 B 的条件下,A 的概率都一样大。

1.3 先验概率与后验概率
1.3.1 先验概率

先验概率也是根据以往经验和分析得到的概率,例如:在没有任何信息前提的情况下,猜测对面来的陌生人姓氏,姓李的概率最大(因为全国李姓为占比最高的姓氏),这便是先验概率。

1.3.2 后验概率

后验概率是指在接收了一定条件或信息的情况下的修正概率,例如:在知道对面的人来自“牛家村”的情况下,猜测他姓牛的概率最大,但不排除姓杨、李等等,这便是后验概率。

1.3.3 两者的关系

事情还没有发生,求这件事情发生的可能性的大小,是先验概率(可以理解为由因求果)。事情已经发生,求这件事情发生的原因是由某个因素引起的可能性的大小,是后验概率(由果求因)。先验概率与后验概率有不可分割的联系,后验概率的计算要以先验概率为基础。

2. 贝叶斯定理

2.1 定义

贝叶斯定理由英国数学家托马斯.贝叶斯 (Thomas Bayes)提出,用来描述两个条件概率之间的关系,定理描述为:

P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B) = \frac{P(A)P(B|A)}{P(B)} P(AB)=P(B)P(A)P(BA)

其中, P ( A ) P(A) P(A) P ( B ) P(B) P(B)是 A 事件和 B 事件发生的概率。 P ( A ∣ B ) P(A|B) P(AB)称为条件概率,表示 B 事件发生条件下,A 事件发生的概率。推导过程:

P ( A , B ) = P ( B ) P ( A ∣ B ) P ( B , A ) = P ( A ) P ( B ∣ A ) P(A,B) =P(B)P(A|B)\\ P(B,A) =P(A)P(B|A) P(A,B)=P(B)P(AB)P(B,A)=P(A)P(BA)

其中 P ( A , B ) P(A,B) P(A,B)称为联合概率,指事件 B 发生的概率,乘以事件 A 在事件 B 发生的条件下发生的概率。因为 P ( A , B ) = P ( B , A ) P(A,B)=P(B,A) P(A,B)=P(B,A), 所以有:

P ( B ) P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P(B)P(A|B)=P(A)P(B|A) P(B)P(AB)=P(A)P(BA)

两边同时除以 P(B),则得到贝叶斯定理的表达式。其中, P ( A ) P(A) P(A)是先验概率, P ( A ∣ B ) P(A|B) P(AB)是已知 B 发生后 A 的条件概率,也被称作后验概率。

2.2 贝叶斯定理示例

【示例一】计算诈骗短信的概率

事件概率表达式
所有短信中,诈骗短信5%P(A)= 0.05
所有短信中,含有“中奖”两个字4%P(B)= 0.04
所有短信中,是诈骗短信,并且含有“中奖”两个字50%P(B|A) = 0.5

求:收到一条新信息,含有“中奖”两个字,是诈骗短信的概率?

P ( A ∣ B ) = P ( A ) P ( B ∣ A ) / P ( B ) = 0.05 ∗ 0.5 / 0.04 = 0.625 P(A|B) = P(A) P(B|A) / P(B) = 0.05 * 0.5 / 0.04 = 0.625 P(AB)=P(A)P(BA)/P(B)=0.050.5/0.04=0.625

【示例二】计算喝酒驾车的概率

事件概率表达式
所有客人中,驾车20%P(A)= 0.2
所有客人中,喝酒10%P(B)= 0.1
所有客人中,开车并且喝酒5%P(B|A)= 0.05

求:喝过酒仍然会开车的人的比例是多少?

P ( A ∣ B ) = P ( A ) P ( B ∣ A ) / P ( B ) = 0.2 ∗ 0.05 / 0.1 = 0.1 P(A|B) = P(A) P(B|A) / P(B) = 0.2 * 0.05 / 0.1 = 0.1 P(AB)=P(A)P(BA)/P(B)=0.20.05/0.1=0.1

【示例三】

假设一个学校中 60%的男生 和 40%的女生

女生穿裤子的人数和穿裙子的人数相等

所有的男生都穿裤子,一个人随机在远处眺望,看一个穿裤子的学生。

请问这个学生是女生的概率:

p(女) = 0.4

p(裤子|女) = 0.5

p(裤子) = 0.8

P(女|裤子) = 0.4 * 0.5 / 0.8 = 0.25

P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B) = \frac{P(A)P(B|A)}{P(B)} P(AB)=P(B)P(A)P(BA)

3. 朴素贝叶斯分类器

3.1 分类原理

朴素贝叶斯分类器就是根据贝叶斯公式计算结果进行分类的模型,“朴素”指事件之间相互独立无影响。例如:有如下数据集:

TextCategory
A great game(一个伟大的比赛)Sports(体育运动)
The election was over(选举结束)Not sports(不是体育运动)
Very clean match(没内幕的比赛)Sports(体育运动)
A clean but forgettable game(一场难以忘记的比赛)Sports(体育运动)
It was a close election(这是一场势均力敌的选举)Not sports(不是体育运动)

求:”A very close game“ 是体育运动的概率?数学上表示为 P(Sports | a very close game)​。根据贝叶斯定理,是运动的概率可以表示为:

P ( S p o r t s ∣ a   v e r y   c l o s e   g a m e ) = P ( a   v e r y   c l o s e   g a m e ∣ s p o r t s ) ∗ P ( s p o r t s ) P ( a   v e r y   c l o s e   g a m e ) P(Sports | a \ very \ close \ game) = \frac{P(a \ very \ close \ game | sports) * P(sports)}{P(a \ very \ close \ game)} P(Sportsa very close game)=P(a very close game)P(a very close gamesports)P(sports)

不是运动概率可以表示为:

P ( N o t   S p o r t s ∣ a   v e r y   c l o s e   g a m e ) = P ( a   v e r y   c l o s e   g a m e ∣ N o t   s p o r t s ) ∗ P ( N o t   s p o r t s ) P ( a   v e r y   c l o s e   g a m e ) P(Not \ Sports | a \ very \ close \ game) = \frac{P(a \ very \ close \ game | Not \ sports) * P(Not \ sports)}{P(a \ very \ close \ game)} P(Not Sportsa very close game)=P(a very close game)P(a very close gameNot sports)P(Not sports)

概率更大者即为分类结果。由于分母相同,即比较分子谁更大即可。我们只需统计”A very close game“ 多少次出现在 Sports 类别中,就可以计算出上述两个概率。但是”A very close game“ 并没有出现在数据集中,所以这个概率为 0,要解决这个问题,就假设每个句子的单词出现都与其它单词无关(事件独立即朴素的含义),所以,P(a very close game)可以写成:

P ( a   v e r y   c l o s e   g a m e ) = P ( a ) ∗ P ( v e r y ) ∗ P ( c l o s e ) ∗ P ( g a m e ) P(a \ very \ close \ game) = P(a) * P(very) * P(close) * P(game) P(a very close game)=P(a)P(very)P(close)P(game)

P ( a   v e r y   c l o s e   g a m e ∣ S p o r t s ) = P ( a ∣ S p o r t s ) ∗ P ( v e r y ∣ S p o r t s ) ∗ P ( c l o s e ∣ S p o r t s ) ∗ P ( g a m e ∣ S p o r t s ) P(a \ very \ close \ game|Sports)= \\ P(a|Sports)*P(very|Sports)*P(close|Sports)*P(game|Sports) Pa very close gameSports)=P(aSports)P(verySports)P(closeSports)P(gameSports)

统计出“a", “very”, “close”, "game"出现在"Sports"类别中的概率,就能算出其所属的类别。

具体计算过程如下:

  • 第一步:计算总词频:Sports 类别词语总数 11,Not Sports 类别词语总数 9

  • 第二步:计算每个类别的先验概率

    # Sports和Not Sports概率
    P(Sports) = 3 / 5 = 0.6
    P(Not Sports) = 2 / 5 = 0.4
    
    # Sports条件下各个词语概率
    P(a | Sports) = (2 + 1) / (11 + 14) = 0.12
    P(very | Sports) = (1 + 1) / (11 + 14) = 0.08
    P(close | Sports) = (0 + 1) / (11 + 14) = 0.04
    P(game | Sports) = (2 + 1) / (11 + 14) = 0.12
    
    # Not Sports条件下各个词语概率
    P(a | Not Sports) = (1 + 1) / (9 + 14) = 0.087
    P(very | Not Sports) = (0 + 1) / (9 + 14) = 0.043
    P(close | Not Sports) = (1 + 1) / (9 + 14) =  = 0.087
    P(game | Not Sports) = (0 + 1) / (9 + 14) = 0.043
    

    其中,分子部分加 1,是为了避免分子为 0 的情况;分母部分都加了词语总数 14,是为了避免分子增大的情况下计算结果超过 1 的可能。

  • 第三步:将先验概率带入贝叶斯定理,计算概率:

    • 是体育运动的概率:

      P ( a   v e r y   c l o s e   g a m e ∣ S p o r t s ) = P ( a ∣ S p o r t s ) ∗ P ( v e r y ∣ S p o r t s ) ∗ P ( c l o s e ∣ S p o r t s ) ∗ P ( g a m e ∣ S p o r t s ) = 0.12 ∗ 0.08 ∗ 0.04 ∗ 0.12 = 0.00004608 P(a \ very \ close \ game|Sports)= \\ P(a|Sports)*P(very|Sports)*P(close|Sports)*P(game|Sports)= \\ 0.12 * 0.08 * 0.04 * 0.12 = 0.00004608 Pa very close gameSports)=P(aSports)P(verySports)P(closeSports)P(gameSports)=0.120.080.040.12=0.00004608

      • 不是体育运动的概率:

    P ( a   v e r y   c l o s e   g a m e ∣ N o t   S p o r t s ) = P ( a ∣ N o t   S p o r t s ) ∗ P ( v e r y ∣ N o t   S p o r t s ) ∗ P ( c l o s e ∣ N o t   S p o r t s ) ∗ P ( g a m e ∣ N o t   S p o r t s ) = 0.087 ∗ 0.043 ∗ 0.087 ∗ 0.043 = 0.000013996 P(a \ very \ close \ game|Not \ Sports)= \\ P(a|Not \ Sports)*P(very|Not \ Sports)*P(close|Not \ Sports)*P(game|Not \ Sports)= \\ 0.087 * 0.043 * 0.087 * 0.043 = 0.000013996 Pa very close gameNot Sports)=P(aNot Sports)P(veryNot Sports)P(closeNot Sports)P(gameNot Sports)=0.0870.0430.0870.043=0.000013996

    • 分类结果:P(Sports) = 0.00004608 , P(Not Sports) = 0.000013996, 是体育运动。
3.2 实现朴素贝叶斯分类器

在 sklearn 中,提供了三个朴素贝叶斯分类器,分别是:

  • GaussianNB(高斯朴素贝叶斯分类器):适合用于样本的值是连续的,数据呈正态分布的情况(比如人的身高、城市家庭收入、一次考试的成绩等等)
  • MultinominalNB(多项式朴素贝叶斯分类器):适合用于大部分属性为离散值的数据集
  • BernoulliNB(伯努利朴素贝叶斯分类器):适合用于特征值为二元离散值或是稀疏的多元离散值的数据集

该示例中,样本的值为连续值,且呈正态分布,所以采用 GaussianNB 模型。代码如下:

# 朴素贝叶斯分类示例
import numpy as np
import sklearn.naive_bayes as nb
import matplotlib.pyplot as mp

# 输入,输出
x, y = [], []

# 读取数据文件
with open("../data/multiple1.txt", "r") as f:
    for line in f.readlines():
        data = [float(substr) for substr in line.split(",")]
        x.append(data[:-1])  # 输入样本:取从第一列到倒数第二列
        y.append(data[-1])  # 输出样本:取最后一列

x = np.array(x)
y = np.array(y, dtype=int)

# 创建高斯朴素贝叶斯分类器对象
model = nb.GaussianNB()
model.fit(x, y)  # 训练

# 计算显示范围
left = x[:, 0].min() - 1
right = x[:, 0].max() + 1

buttom = x[:, 1].min() - 1
top = x[:, 1].max() + 1

grid_x, grid_y = np.meshgrid(np.arange(left, right, 0.01),
                             np.arange(buttom, top, 0.01))

mesh_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
mesh_z = model.predict(mesh_x)
mesh_z = mesh_z.reshape(grid_x.shape)

mp.figure('Naive Bayes Classification', facecolor='lightgray')
mp.title('Naive Bayes Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x, grid_y, mesh_z, cmap='gray')
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80)
mp.show()

执行结果:

在这里插入图片描述

4. 总结

4.1 什么是朴素贝叶斯

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。“朴素”的含义为:假设问题的特征变量都是相互独立地作用于决策变量的,即问题的特征之间都是互不相关的。

4.2 朴素贝叶斯分类的特点
4.2.1 优点
  • 逻辑性简单
  • 算法较为稳定。当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异。
  • 当样本特征之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果。
4.2.2 缺点
  • 特征的独立性在很多情况下是很难满足的,因为样本特征之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果大大降低。
4.3 什么情况下使用朴素贝叶斯

根据先验概率计算后验概率的情况,且样本特征之间独立性较强。

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

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

相关文章

WSL不同版本的Ubuntu更换清华镜像,加速Ubuntu软件下载速度

文章目录 不同版本的Ubuntu使用清华镜像,加速Ubuntu软件下载速度1. 备份源软件配置文件2. 复制镜像源3. 修改软件源配置文件4. 更新软件包列表,升级软件包等内容5. 从仓库中下载其它软件可能存在的问题 不同版本的Ubuntu使用清华镜像,加速Ubu…

深入理解UML中的继承关系

深入理解UML中的继承关系 在面向对象的设计中,继承关系是构建清晰、可维护系统的关键。统一建模语言(UML)提供了一种标准化的方法来可视化这些关系。本文将深入探讨UML中的继承关系,并探讨它如何在代码中体现。 什么是继承关系&a…

【AI大模型应用开发】1.1 Prompt Engineering(提示词工程)- 用OpenAI API实战,优化方法论总结

书接上文 【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt,我们开始实战。 文章目录 0. 从最简单的开始0.1 通用代码封装0.2 使用 - 从最简单的Prompt开始0.2.1 temperature参数…

Git新手?这篇文章带你飞!基础操作一网打尽!

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读Git初识Git啥是版本控制系统??集中式VS分布式 git使用…

Ubuntu 在线Swap扩容

1. 查看本机swap空间 free -h 2. 找一个较大的高速盘,创建swap的空间 mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs50M count1k3.建swapfile,大小为bs*count 50M * 1k 50G 4.标记为Swap文件,让系统能识别交换文件。 sudo mk…

表单生成器基于(form-create-designer+ant design vue)

效果展示 1.源码地址: 前端:https://gitee.com/houshixin/form-design-ui 后端:https://gitee.com/houshixin/form-design-web 2.单独使用前端的时候就把请前后台的接口注释就可以 3.都启动的话: 1).先导入数据库 2.表…

统信UOS_麒麟KYLINOS与Windows通过Open SSH实现文件传输

原文链接:统信UOS/麒麟KYLINOS与Windows通过Open SSH实现文件传输 hello,大家好啊!今天我要给大家介绍的是在统信UOS或麒麟KYLINOS操作系统与Windows系统之间通过Open SSH实现文件传输的方法。在日常工作中,我们经常需要在不同操作…

【JUC】JAVA线程小结

Java线程 前言——阅读10-20分钟🎆1.创建和运行线程ThreadRunableFutureTask多个线程运行方式 📣2.不同操作系统查看进程线程的方法windowslinuxJava命令行 🚀3.java线程运行原理栈与栈帧线程上下文切换(Thread Context Switch&am…

word写标书的疑难杂症总结

最近在解决方案工作,与office工具经常打交道,各种问题,在此最下记录: 1.word中文档距离文档顶端有距离调整不了 1.疑难杂症问题1,多个空格都是不能解决 #解决办法:word中--布局-下拉框---“版式”--“垂直…

机器人持续学习基准LIBERO系列5——获取显示深度图

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo 1.更改环境设置 LIBERO-master/l…

MagnificAI的爆火之下 - AI时代,伟大的公司只需要2个人

这两天,Magnific AI又被推上风口浪尖。 起因是他们发布了全新的功能:将任何图像放大并增强至10,000 x 10,000 像素。 传说中的4K超清,也就4096像素,但是Magnific AI可以将一张600像素糊成智障的图片,几分钟的时间&…

Springboot基层健康医院云HIS信息系统源码

基层卫生健康云HIS系统采用云端SaaS服务的方式提供,使用用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医疗机构的主要工作流程,能…

近视的孩子用什么灯?学生考研护眼台灯推荐

随着时代快速发展,2022年我国近视人数达到了7亿,呈现低龄化趋势,儿童及青少年人数占了53.8%。现在学业负担都很重,每个家长都不希望自己的孩子近视或加深近视了,都会想尽一切办法保护视力。而护眼台灯就成了家长购买台…

不同activity项目创建时的区别

在 Android Studio 中创建项目时,可以选择创建不同类型的 Activity 作为应用程序的入口点。其中,包括 Empty Activity、Basic Activity、Empty Compose Activity 和 Basic Compose Activity 四种类型。 Empty Activity:这是最简单的 Activity…

agilent n9344c频谱分析仪20ghz

181/2461/8938产品概述: Agilent安捷伦N9344C手持频谱分析仪20GHz Agilent安捷伦N9344C手持频谱分析仪是当今最先进的频谱分析仪器之一,可以在20GHz的范围内对信号进行快速、准确的分析。它不仅具有出色的性能,还具有紧凑的外观和轻便的重量…

分享一个使用python FastApi创建服务的简易模版,与使用http/python请求

这个博客分享一个fastapi的模版,并提供使用http/python访问的示例程序 文章目录 示例程序FastApi应用程序HTTP请求Python请求 示例程序 FastApi应用程序 下面是一个示例: 默认开启一个可以使用Get请求访问的URL:/example_connect这个请求有…

2024年1月12日:清爽无糖rio留下唇齿之间的香甜

友利奈绪的时间管理 2024年1月12日08:02:28进行java程序设计的上课准备 2024年1月12日08:02:44知道java的题目有18道 2024年1月12日08:43:07随机数去重比较 2024年1月12日08:54:03C语言题目最小公倍数 2024年1月12日08:58:37C语言题目二维数组变一维数组 2024年1月12日10…

2024.1.11每日一题

LeetCode 2645.构造有效字符串的最少插入数 2645. 构造有效字符串的最少插入数 - 力扣(LeetCode) 题目描述 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字…

SQL性能分析-整理

昨日对MySQL的索引整理了一份小文档,对结构/分类/语法等做了一个小总结,具体文章可点击:MySQL-索引回顾,索引知识固然很重要,但引入运用到实际工作中更重要。 参考之前的文章:SQL优化总结以及参考百度/CSDN…

【java八股文】之JVM基础篇

1、Java中都有哪些引用? 强引用 :发生GC时候不会被回收 软引用:发生内存满(内存溢出的时候)会被回收(通常用于缓存) 弱引用:发生下一次GC时候会被回收 虚引用:无法通过虚…