朴素贝叶斯分类算法和实例演示

news2024/9/19 10:43:13

文章目录

  • 贝叶斯公式
  • 算法原理
  • 实例演示
  • 代码实现

本文开始,我们来学习一种新的机器学习方法:贝叶斯算法。
这次从最基础的朴素贝叶斯分类算法出发,了解相关的算法原理。

考虑如下一种分类问题:样本中只包含2类特征,标签只有0和1。
目前要评估两个特征值分别为a和b时的分类结果。

使用朴素贝叶斯分类算法的核心逻辑是:基于概率论的相关理论直接计算两个特征值分别为a和b时,标签值为0和1的概率,然后选择更大的概率值对应的标签值作为分类结果。

贝叶斯公式

既然是基于概率论,那就得先清楚算法使用所必要的概率论原理。
说来尴尬,虽然我本科概率论的课程成绩还看得过去,但是实际上大部分内容都已经忘记了,所以还是从尽量基础的条件概率公式开始
P ( B ∣ A ) = P ( A B ) / P ( A ) P(B|A)=P(AB)/P(A) P(BA)=P(AB)/P(A)
此处, P ( B ∣ A ) P(B|A) P(BA)指的是B在A发生的条件下发生的概率(后验概率), P ( A B ) P(AB) P(AB)指的是A和B同时发生的概率,P(A)指的是A发生的概率(先验概率)。

先找个简单实例重温一下条件概率公式:假设有5个完全相同的箱子,只有一个箱子内有钱,定义A为第1箱子内无钱,B为第2个箱子有钱。用最朴素的直观逻辑,可以得知
P ( A ) = 4 / 5 , P ( A B ) = 1 / 5 , P ( B ∣ A ) = 1 / 4 P(A)=4/5,P(AB)=1/5,P(B|A)=1/4 P(A)=4/5,P(AB)=1/5,P(BA)=1/4
显然,该实例中的概率值是满足之前的条件概率公式的。

将条件概率中的A和B换一下,可以得到
P ( A ∣ B ) = P ( A B ) / P ( B ) P(A|B)=P(AB)/P(B) P(AB)=P(AB)/P(B)
由此可以得到
P ( B ∣ A ) ∗ P ( A ) = P ( A ∣ B ) ∗ P ( B ) = P ( A B ) P(B|A)*P(A)=P(A|B)*P(B)=P(AB) P(BA)P(A)=P(AB)P(B)=P(AB)
再做一下变形
P ( B ∣ A ) = P ( A ∣ B ) ∗ P ( B ) P ( A ) P(B|A)=\frac{P(A|B)*P(B)}{P(A)} P(BA)=P(A)P(AB)P(B)
哈,终于得到贝叶斯公式了。

算法原理

看上面那个公式,好像和机器学习没多少关系,所以我们需要用机器学习的语言去理解一下这个公式:
P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) ∗ P ( 类别 ) P ( 特征 ) P(类别|特征)=\frac{P(特征|类别)*P(类别)}{P(特征)} P(类别特征)=P(特征)P(特征类别)P(类别)
回到本文开始的分类问题,有两组特征,那么可以分别计算 P ( 0 ∣ 特征 1 = a , 特征 2 = b ) P(0|特征1=a,特征2=b) P(0∣特征1=a,特征2=b) P ( 1 ∣ 特征 1 = a , 特征 2 = b ) P(1|特征1=a,特征2=b) P(1∣特征1=a,特征2=b),如果前者的P值更大,那么分类为0,反之则分类为1。

接下来以 P ( 0 ∣ 特征 1 = a , 特征 2 = a ) P(0|特征1=a,特征2=a) P(0∣特征1=a,特征2=a)为例,分析一下其具体的计算过程。
P ( 0 ∣ 特征 1 = a , 特征 2 = b ) = P ( 特征 1 = a , 特征 2 = b ∣ 0 ) ∗ P ( 0 ) P ( 特征 1 = a , 特征 2 = b ) P(0|特征1=a,特征2=b)=\frac{P(特征1=a,特征2=b|0)*P(0)}{P(特征1=a,特征2=b)} P(0∣特征1=a,特征2=b)=P(特征1=a,特征2=b)P(特征1=a,特征2=b∣0)P(0)
先计算最简单的 P ( 0 ) P(0) P(0):给定训练集后, P ( 0 ) P(0) P(0)可以直接通过统计训练集中的标签值数量得到。

然后考虑 P ( 特征 1 = a , 特征 2 = b ∣ 0 ) P(特征1=a,特征2=b|0) P(特征1=a,特征2=b∣0):给定训练集后,特征值恰好分别a和b的情况可能不多,甚至为0,所以期望在训练集中直接寻找该组合的数量的方式是不可靠的。
为了稳定地计算该P值,我们在此处做出假设:各特征之间相互独立。
这样,该值可以等价为
P ( 特征 1 = a , 特征 2 = b ∣ 0 ) = P ( 特征 1 = a ∣ 0 ) ∗ P ( 特征 2 = b ∣ 0 ) P(特征1=a,特征2=b|0)=P(特征1=a|0)*P(特征2=b|0) P(特征1=a,特征2=b∣0)=P(特征1=a∣0)P(特征2=b∣0)
上式的右侧各项值是很容易通过训练集统计得到的。

接下来简单证明一下上述公式。先将条件概率公式做一下扩展
P ( A B ∣ C ) = P ( A B C ) P ( C ) P(AB|C)=\frac{P(ABC)}{P(C)} P(ABC)=P(C)P(ABC)
将右式做变换
P ( A B ∣ C ) = P ( A C ) P ( C ) ∗ P ( A B C ) P ( A C ) P(AB|C)=\frac{P(AC)}{P(C)}*\frac{P(ABC)}{P(AC)} P(ABC)=P(C)P(AC)P(AC)P(ABC)
显然右式是两个条件概率值
P ( A B ∣ C ) = P ( A ∣ C ) ∗ P ( B ∣ A C ) P(AB|C)=P(A|C)*P(B|AC) P(ABC)=P(AC)P(BAC)
因为A和B相互独立,所以在C发生的条件下,A发生与否并不影响B发生的概率,即
P ( B ∣ A C ) = P ( B ∣ C ) P(B|AC)=P(B|C) P(BAC)=P(BC)
将上式带入上上式,得到
P ( A B ∣ C ) = P ( A ∣ C ) ∗ P ( B ∣ C ) P(AB|C)=P(A|C)*P(B|C) P(ABC)=P(AC)P(BC)
设定A为“特征1=a”,B为“特征2=b”,C为“标签值=0”,上式变为
P ( 特征 1 = a , 特征 2 = b ∣ 0 ) = P ( 特征 1 = a ∣ 0 ) ∗ P ( 特征 2 = b ∣ 0 ) P(特征1=a,特征2=b|0)=P(特征1=a|0)*P(特征2=b|0) P(特征1=a,特征2=b∣0)=P(特征1=a∣0)P(特征2=b∣0)
至此,公式得到了证明。

最后看一下 P ( 特征 1 = a , 特征 2 = b ) P(特征1=a,特征2=b) P(特征1=a,特征2=b):在特征相互独立的假设上,该值等价于
P ( 特征 1 = a , 特征 2 = b ) = P ( 特征 1 = a ) ∗ P ( 特征 2 = b ) P(特征1=a,特征2=b)=P(特征1=a)*P(特征2=b) P(特征1=a,特征2=b)=P(特征1=a)P(特征2=b)

事实上,无论是计算 P ( 0 ∣ 特征 1 = a , 特征 2 = b ) P(0|特征1=a,特征2=b) P(0∣特征1=a,特征2=b)还是 P ( 1 ∣ 特征 1 = a , 特征 2 = b ) P(1|特征1=a,特征2=b) P(1∣特征1=a,特征2=b),分母都是 P ( 特征 1 = a , 特征 2 = b ) P(特征1=a,特征2=b) P(特征1=a,特征2=b)
如果只需要评估 P ( 0 ∣ 特征 1 = a , 特征 2 = b ) P(0|特征1=a,特征2=b) P(0∣特征1=a,特征2=b) P ( 1 ∣ 特征 1 = a , 特征 2 = b ) P(1|特征1=a,特征2=b) P(1∣特征1=a,特征2=b)的大小关系,并不需要计算 P ( 特征 1 = a , 特征 2 = b ) P(特征1=a,特征2=b) P(特征1=a,特征2=b)的值。

实例演示

本节我们参考网上使用很多的一个实例,来演示一下朴素贝叶斯分类算法的计算过程。

以下表格列举了一个女生在男生具有不同特征值的情况下,是否愿意嫁的多种情况。
此处特征包括颜值(1表示高、0表示低)、性格(1表示好、0表示坏)、身高(2/1/0分别表示高/中/低)和上进心(1表示有、0表示无);特征是嫁(1表示是、0表示否)。

现在假设有一个男生的特征值为:颜值=0,性格=0,身高=0,上进心=0,那么该女生是嫁或者不嫁呢?

暂且抛开算法不谈,先从我们朴素的认知来预测。
从上表的数值可以简单判断出,女生在嫁的情况下,男生总会有些特征是优秀的,也就是说,起码是个“正常人”的逻辑思维。
所以当面对一个4个特征都是差的情况下,自然会选择不嫁。
也就是说,如果从概率的角度来看,不嫁的概率要远高于嫁的概率。

接下来我们看一下,如果是从算法角度,会得出什么样的结论以及如何得到这个结论。
首先是计算嫁的概率:

P ( 嫁 = 1 ∣ 颜值 = 0 , 性格 = 0 , 身高 = 0 , 上进心 = 0 ) = P ( 颜值 = 0 ∣ 嫁 = 1 ) ∗ P ( 性格 = 0 ∣ 嫁 = 1 ) ∗ P ( 身高 = 0 ∣ 嫁 = 1 ) ∗ P ( 上进心 = 0 ∣ 嫁 = 1 ) ∗ P ( 嫁 = 1 ) P ( 颜值 = 0 ) ∗ P ( 性格 = 0 ) ∗ P ( 身高 = 0 ) ∗ P ( 上进心 = 0 ) P(嫁=1|颜值=0,性格=0,身高=0,上进心=0)=\frac{P(颜值=0|嫁=1)*P(性格=0|嫁=1)*P(身高=0|嫁=1)*P(上进心=0|嫁=1)*P(嫁=1)}{P(颜值=0)*P(性格=0)*P(身高=0)*P(上进心=0)} P(=1∣颜值=0,性格=0,身高=0,上进心=0)=P(颜值=0)P(性格=0)P(身高=0)P(上进心=0)P(颜值=0∣=1)P(性格=0∣=1)P(身高=0∣=1)P(上进心=0∣=1)P(=1)

上式中, P ( 嫁 = 1 ) 、 P ( 颜值 = 0 ) 、 P ( 性格 = 0 ) 、 P ( 身高 = 0 ) P(嫁=1)、P(颜值=0)、P(性格=0)、P(身高=0) P(=1)P(颜值=0)P(性格=0)P(身高=0) P ( 上进心 = 0 ) P(上进心=0) P(上进心=0)的计算逻辑相同,我们以 P ( 嫁 = 1 ) P(嫁=1) P(=1)为例,简述一下这几个值的计算过程。

表中一共有10个样本,其中嫁=1的样本数量为6,所以
P ( 嫁 = 1 ) = 6 / 10 = 3 / 5 P(嫁=1)=6/10=3/5 P(=1)=6/10=3/5
参考该逻辑,可以得到
P ( 颜值 = 0 ) = 2 / 5 , P ( 性格 = 0 ) = 3 / 10 , P ( 身高 = 0 ) = 1 / 2 , P ( 上进心 = 0 ) = 3 / 10 P(颜值=0)=2/5, P(性格=0)=3/10,P(身高=0)=1/2,P(上进心=0)=3/10 P(颜值=0)=2/5,P(性格=0)=3/10,P(身高=0)=1/2,P(上进心=0)=3/10

P ( 颜值 = 0 ∣ 嫁 = 1 ) 、 P ( 性格 = 0 ∣ 嫁 = 1 ) 、 P ( 身高 = 0 ∣ 嫁 = 1 ) P(颜值=0|嫁=1)、P(性格=0|嫁=1)、P(身高=0|嫁=1) P(颜值=0∣=1)P(性格=0∣=1)P(身高=0∣=1) 和 P ( 上进心 = 0 ∣ 嫁 = 1 ) 和P(上进心=0|嫁=1) P(上进心=0∣=1)的计算逻辑相同
,我们以 P ( 颜值 = 0 ∣ 嫁 = 1 ) P(颜值=0|嫁=1) P(颜值=0∣=1)为例,描述一下这几个值的计算过程。

先按照“嫁=1”的条件,将原表筛选为如下的新表


新表中一共有6个样本,其中颜值=0的样本数量为3,所以
P ( 颜值 = 0 ∣ 嫁 = 1 ) = 3 / 6 = 1 / 2 P(颜值=0|嫁=1)=3/6=1/2 P(颜值=0∣=1)=3/6=1/2
参考该逻辑,可以得到
P ( 性格 = 0 ∣ 嫁 = 1 ) = 1 / 2 , P ( 身高 = 0 ∣ 嫁 = 1 ) = 1 / 6 , P ( 上进心 = 0 ∣ 嫁 = 1 ) = 1 / 6 P(性格=0|嫁=1)=1/2,P(身高=0|嫁=1)=1/6,P(上进心=0|嫁=1)=1/6 P(性格=0∣=1)=1/2,P(身高=0∣=1)=1/6,P(上进心=0∣=1)=1/6
有了以上数据值,我们便可以得到女生嫁的概率为
P ( 嫁 = 1 ∣ 颜值 = 0 , 性格 = 0 , 身高 = 0 , 上进心 = 0 ) = 1 2 ∗ 1 6 ∗ 1 6 ∗ 1 6 ∗ 3 5 2 5 ∗ 3 10 ∗ 1 2 ∗ 3 10 P(嫁=1|颜值=0,性格=0,身高=0,上进心=0)=\frac{\frac{1}{2}*\frac{1}{6}*\frac{1}{6}*\frac{1}{6}*\frac{3}{5}}{\frac{2}{5}*\frac{3}{10}*\frac{1}{2}*\frac{3}{10}} P(=1∣颜值=0,性格=0,身高=0,上进心=0)=52103211032161616153

类似的,我们可以算出女生不嫁的概率为
P ( 嫁 = 0 ∣ 颜值 = 0 , 性格 = 0 , 身高 = 0 , 上进心 = 0 ) = 1 4 ∗ 1 2 ∗ 1 ∗ 1 2 ∗ 2 5 2 5 ∗ 3 10 ∗ 1 2 ∗ 3 10 P(嫁=0|颜值=0,性格=0,身高=0,上进心=0)=\frac{\frac{1}{4}*\frac{1}{2}*1*\frac{1}{2}*\frac{2}{5}}{\frac{2}{5}*\frac{3}{10}*\frac{1}{2}*\frac{3}{10}} P(=0∣颜值=0,性格=0,身高=0,上进心=0)=5210321103412112152
由于嫁的概率小于不嫁的概率后,可以判定该女生会选择不嫁。
我们进一步计算一下两者的比值,可以发现不嫁的概率是嫁的概率的18倍,这和之前的预期是一样的。

代码实现

在朴素贝叶斯分类算法中,并没有使用任何优化算法,所以从个人角度来说,没有必要做代码实现。

不过强迫症的自己,非要有标准化的“代码实现”模块,所以就有了这一节。

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

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

相关文章

接口返回数据实体类属性大写变成小写

问题背景 今天遇到一个特别恶心的事情,我的返回实体类遵循了字段属性明明规则,驼峰命名法,在接口返回数据给前端的时候,所有数字那个字母全部自动变为了小写字母! 错误的返回示例: 正确的返回示例&#x…

【鸟哥杂谈】腾讯云 CentOS8 Linux环境搭建docker

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-15 ❤️❤️ 本篇更新记录 2023-01-15 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝&#x1f64…

当青训营遇上码上掘金之主题四-攒青豆

theme: juejin 攒青豆 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积) 以下为上图例子…

【JavaEE初阶】第一节.计算机是如何工作的

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 文章目录 前言 一、计算机发展历史 二、冯诺依曼体系 三、CPU 3.1 浅谈CPU 3.2 寄存器 3.3 指令 3.4 CPU的操作流程 3.5 时钟周期 四、编程语言 总结…

vue.js客服系统实时聊天项目开发(四)引入iconfont图标代码

普通引入模式下是这样的 首先&#xff0c;您需要在iconfont.cn上创建一个账号并添加图标。 然后&#xff0c;将iconfont的链接代码加入到页面的head标签中&#xff0c;例如&#xff1a; <link rel"stylesheet" href"//at.alicdn.com/t/font_123456_abcdefghi…

Docker为什莫方便(学习的记录)

Docker为什莫方便&#xff08;学习的记录&#xff09; 程序 — apk— 发布到商城------下载安装即可使用 程序----打包项目带上环境&#xff08;创建一个项目的镜像&#xff09;-----发布到docker仓库当中------下载安装运行即可 &#x1f315; docker的核心思想 将各个环境…

【手写 Vue2.x 源码】第二十七篇 - Vue 生命周期的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组依赖收集的实现 本篇&#xff0c;Vue 生命周期的实现 二&#xff0c;Vue.mixin 介绍 1&#xff0c;mixin 简介 Vue2 中可以通过 Vue.mixin 为 vue 进行功能扩展 开发中&#xff0c;经常使用 mixin 来为所有组件增加一些生…

机器学习的相关软件框架下载安装

文章目录一、Anaconda1. Anaconda 的下载2. Anaconda 的安装3. Anaconda Navigator 打不开问题&#xff08;不适用所有&#xff09;二、PyTorch-CPU1. PyTorch 环境创建2. PyTorch 下载3. Jupyter 中使用 PyTorch三、Python 版本升级与包的维护1. 更新 Anaconda2. 查看与更新 p…

回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出 目录回归预测 | MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现SSA-LSSVM麻雀算法优化最小二乘支持向量机…

【MAUI】自动更新功能的安卓App

自动更新功能的安卓App自动更新主要下面4个步骤更新服务测试页面:MainPage.xaml测试自动更新主要下面4个步骤 1、获取最新版本号 2、提示用户发现更新&#xff0c;等待用户确认更新 3、下载最新的apk包 4、安装apk包 更新服务 为简单示例&#xff1a;直接在android平台文件夹…

Spring资源管理,Spring资源管理源码分析

文章目录一、Java标准资源管理1、Java 标准资源定位2、Java URL 协议扩展基于 java.net.URLStreamHandlerFactory基于 java.net.URLStreamHandler3、Java 标准资源管理扩展的步骤4、Spring为什么不用Java标准的资源管理二、Spring资源接口与实现1、Spring基本资源接口InputStre…

C++ 简单实现RPC网络通讯

RPC是远程调用系统简称&#xff0c;它允许程序调用运行在另一台计算机上的过程&#xff0c;就像调用本地的过程一样。RPC 实现了网络编程的“过程调用”模型&#xff0c;让程序员可以像调用本地函数一样调用远程函数。最近在做的也是远程调用过程&#xff0c;所以通过重新梳理R…

项目管理平台,如何助力CMMI3-5级高效落地?

近日CoCode旗下Co-ProjectV3.0智能项目管理平台全面升级&#xff0c;CoCode产品4大版本全新发布&#xff0c;用户不限版本30天免费试用&#xff1b;平台全面支持CMMI3-5级&#xff0c;助力CMMI高效落地。 一、4大版本全新发布 不限版本30天免费试用 Co-Project V3.0智能项目管理…

FPGA:组合逻辑电路的设计

文章目录组合逻辑电路的设计组合逻辑电路的设计步骤组合逻辑电路的设计举例例1例2组合逻辑电路的设计 根据实际逻辑问题&#xff0c;求出所要求逻辑功能的最简单逻辑电路。 组合逻辑电路的设计步骤 1.逻辑抽象&#xff1a;根据实际逻辑问题的因果关系确定输入、输出变量&…

【寒假每日一题】DAY8 倒置字符串

牛客网链接&#xff1a;传送门 【❤️温馨提示】自己做一遍&#xff0c;再看解析效果更佳哟 描述 将一句话的单词进行倒置&#xff0c;标点不倒置。输入描述&#xff1a; 每个测试输入包含1个测试用例&#xff1a; I like beijing. 输入用例长度不超过100输出描述&#xff1a…

Open3D 点云投影至指定平面(Python版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设给定的平面为 a x + b y + c z + 1 = 0 ax+by+cz+1=0

Python基础(二十四):面向对象核心知识

文章目录 面向对象核心知识 一、面向对象三大特性 1、封装 2、继承 3、多态

音频音量调整中的ramp up down

在日常生活中不管是打电话还是听音乐&#xff0c;都会遇到音量不合适而去调整音量的情况。如果音量调整软件处理不好&#xff0c;就会听到pop noise。产生pop noise的原因是音量直接从当前值骤变到目标值&#xff0c;而不是缓慢的变。如果缓慢的变就不会有pop noise了。图1显示…

select for update是行锁还是表锁,还真得看情况

背景 看到许多写select for update是行锁还是表锁的文章&#xff0c;但每篇文章的结论好像都不太一样。同时&#xff0c;是行锁还是表锁的问题直接影响着系统的性能&#xff0c;所以特意为大家调研一番&#xff0c;也就有了本篇文章&#xff0c;一共为大家汇总验证了20个场景下…

MES系统选型攻略,优秀MES系统应具备哪些性质

在众多MES系统中&#xff0c;企业怎样才能找到最适合自己的产品&#xff1f;那么&#xff0c;一套高质量的MES系统&#xff0c;究竟有什么特点&#xff1f;随着全球经济一体化的发展&#xff0c;中美两国之间的贸易战争日趋白热化&#xff0c;中国作为一个生产大国&#xff0c;…