机器学习——朴素贝叶斯

news2024/11/15 11:32:48

目录

一、贝叶斯

1.什么是贝叶斯

3.贝叶斯下的朴素贝叶斯

二、朴素贝叶斯

1.高斯朴素贝叶斯

2.伯努利朴素贝叶斯

3.多项式朴素贝叶斯


前言
在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出。

一、贝叶斯

1.什么是贝叶斯

贝叶斯定理是关于随机事件 A 在 B 条件下发生的概率:

在贝叶斯定理中,每个名词都有约定俗成的名称:
· P(A|B)是已知 B 发生后 A 的条件概率
· P(A)是 A 的先验概率
· P(B|A)是已知 A 发生后 B 的条件概率

2.贝叶斯的推导
我们可以从条件概率的定义推导出贝叶斯定理。
根据条件概率的定义,在事件 B 发生的条件下事件 A 发生的概率为

同样地,在事件 A 发生的条件下事件 B 发生的概率为:

结合这两个方程式,我们可以得到

这个引理有时称作概率乘法规则。

上式两边同除以 P(A),若P(A)是非零的,我们可以得到贝叶斯定理(ABABAB定理):

在这里我们已经获得基本的贝叶斯公式了,但是我在这里进行引入全概率公式,获得基本贝叶斯定理的展开式。
全概率公式:
若事件A1,A2 …… 满足

所以对任意事件B有

结合基本贝叶斯定理,获得贝叶斯定理的变式如下:

综上有:

3.贝叶斯下的朴素贝叶斯

在上面已经获得贝叶斯定理的一个公式了,这时候我们结合机器学习对公式中的变量进行代替

· x表示输入的特征
· y_i表示对输入的特征进行分类的结果
由于输入的P(x1,…,xn)是给定的常数值,我们可以得到以下式子: 

在分类问题中,对于输入的样本,实际上就是求取该样本在各各类别的概率,以获得该样本所属的类别。最终获得贝叶斯定理的简化形式,也就是朴素贝叶斯: 

那如何求先验概率P(y_i )和似然概率P(x│y_i )?
· 对于P(y_i ),sklearn.naive_bayes模块定义了三种方法
(1)对应类的占总数据集的占比,作为先验概率
(2)均值
(3)自己设定每一类别的先验概率

· 对于似然概率P(x│y_i ),在特征相互独立的情况下,根据y下x特征的分布情况进行求解
(1)y下x的分布是高斯分布

(2)y下x的分布是二项分布 

(3)y下x的分布是多项分布

二、朴素贝叶斯

1.高斯朴素贝叶斯

代码如下(示例):

"""
GaussianNB(【*, priors=None, var_smoothing=1e-09】)
"""
import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB

np.random.seed(0)
x = np.random.randint(-5,5,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.hstack([x, y.reshape(-1,1)]), columns=['x1','x2','y'])
display(data)

gnb = GaussianNB()
gnb.fit(x,y)

## 属性
#每个类别样本的数量
print('样本数量:', gnb.class_count_)
#每个类别的先验概率
print('先验概率:', gnb.class_prior_)
#每个类别的标签
print('标签:', gnb.classes_)
#每个特征在每个类别下的方差
print('方差:',gnb.sigma_)
#每个特征在每个类别下的均值
print('均值:',gnb.theta_)

## 方法
x_test = np.array([[2,1]])
print('预测结果:', gnb.predict(x_test))
print('预测结果概率:', gnb.predict_proba(x_test))
print('测试数据的平均精准度',gnb.score(x,y))

 

2.伯努利朴素贝叶斯

代码如下(示例):

"""
BernoulliNB(【*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None】) 
"""
from sklearn.naive_bayes import BernoulliNB

np.random.seed(0)
x = np.random.randint(-5,5,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.concatenate([x,y.reshape(-1,1)], axis=1), columns=['x1','x2','y'])
display(data)

bnb = BernoulliNB()
bnb.fit(x,y)

## 属性
print('样本数量',bnb.class_count_)
#每个类别样本所占的比重,即P(y)。注意该值为概率取对数之后的结果,
#如果需要查看原有的概率,需要使用指数还原。
print('先验概率:',np.exp(bnb.class_log_prior_))
print('标签',bnb.classes_)

## 方法
x_test = np.array([[2,1]])
print('预测结果:', bnb.predict(x_test))
print('预测结果概率:', bnb.predict_proba(x_test))
print('测试数据的平均精准度',bnb.score(x,y))

 

3.多项式朴素贝叶斯

代码如下(示例):

"""
MultinomialNB(【*, alpha=1.0, fit_prior=True, class_prior=None】)
多项式朴素贝叶斯中各特征都是正数(类别),然而二项式朴素贝叶斯可以为负(实质上通过参数binarize划分01)
"""
from sklearn.naive_bayes import MultinomialNB

np.random.seed(0)
x = np.random.randint(0,4,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.hstack([x, y.reshape(-1,1)]), columns=['x1','x2','y'])
display(data)

mnb = MultinomialNB()
mnb.fit(x,y)

## 属性
print('样本数量',mnb.class_count_)
#每个类别样本所占的比重,即P(y)。注意该值为概率取对数之后的结果,
#如果需要查看原有的概率,需要使用指数还原。
print('先验概率:',np.exp(mnb.class_log_prior_))
print('标签',mnb.classes_)

## 方法
x_test = np.array([[2,1]])
print('预测结果:', mnb.predict(x_test))
print('预测结果概率:', mnb.predict_proba(x_test))
print('测试数据的平均精准度',mnb.score(x,y))

 

总结
朴素贝叶斯的主要优点有:

1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

朴素贝叶斯的主要缺点有:

1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
 

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

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

相关文章

【业务数据分析】—— 用户留存分析(以挖掘Aha时刻为例)

目录 一、用户留存是什么 二、为什么要考虑用户留存 1、为什么要考虑用户留存? 2、影响用户留存的可能因素 3、用户留存的3个阶段 三、怎么进行用户留存分析(挖掘Aha时刻) 1、Aha时刻 2、Aha时刻的作用 3、挖掘Aha时刻 一、用户留存是什么 在互联网行业中…

Three——二、加强对三维空间的认识

Three——二、加强对三维空间的认识 接上个例子我们接着往下看 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小,你可以根据需要改变尺寸。 使用方法: // AxesHelper:辅助观察的坐标系 const axesHelper new THRE…

Jetson nano B01学习笔记 -- 系统环境配置以及ROS安装

文章目录 一、Jetson nano 简介二、 系统环境配置1、系统镜像烧录2、CUDA环境配置 三、 ROS安装和环境配置总结 一、Jetson nano 简介 Jetson Nano是一款体积小巧、功能强大的人工智能嵌入式开发板,于2019年3月由英伟达推出。它预装Ubuntu 18.04LTS系统,…

有什么好用的远程工具吗

沟通在任何类型的工作中都扮演着重要的角色。但当谈到远程工作时,这一点就更为重要。因此,您的组织必须找到可以让您的团队保持一致的工具。 在某些方面,项目管理扮演着类似的角色。 您会注意到,下面的大多数工具都会直接影响您的…

Android进阶宝典—Koin使用和原理分析

一、理解设计模式 控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。 实现控制反转最常见的方式叫做依赖注入(Dependency Injection,简称DI),依赖注入(Dependency Injection)和控制反…

提高硬件设计能力的学习路线

不懂硬件的人,会觉得硬件高深莫测,“为什么他改几个电阻、电容就调出来,我弄个半天没搞定?”,“噢,靠的是经验”,但是经验又是什么呢?不能形容,反正就是不明觉厉。 就是…

Git(版本控制:前端git使用全流程)

1.版本控制(简单理解:就是软件对每次操作之后提交的记录) 文件版本 版本控制软件 版本控制的好处 版本控制的分类 本地版本控制系统 集中化版本控制系统 分布式版本控制系统 2. Git基础概念与工作流程 什么是Git? 开源的…

单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机??? 单片机编程中的裸机系统和多任务系统.1 裸机系统1.1轮询系统1.2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统??4 怎么学习Free…

诊断CAPL自动化(6) —— 诊断自动化测试,实战演示

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 下图是UDS协议测试的部分测试用例,该表格在文章末尾网盘自己获取经过前面几…

Cesium实践(4)——空间数据加载

文章目录 前言几何形体点线面体 标签文字图标 几何文件GeoJsonKMLCZML 三维模型总结 前言 本文介绍Cesium如何加载空间数据,空间数据即明确定义在三维空间中的数据,空间数据包括以下几类:1、几何形体(点、线、面、体)…

“支付+SaaS”赋能传统产业数字化转型

易观:传统支付业务利润空间在政策监管和市场竞争下不断被压缩,多家上市支付机构逐步将业务经营重点转移切入到企业交易环节,为企业提供包括SaaS服务、行业解决方案、营销服务及金融科技服务等在内的企业服务收入成为新的增长点。 伴随着“十四…

OSCP-AuthBy(Server 2008提权)

目录 扫描 FTP WEB 提权 扫描 nmap -sV -sC -p- 192.168.73.46 FTP 检查端口21上的匿名登录 导航到accounts目录,可以观察ftp服务上的帐户 Offsec, anonymous, admin

Java8函数式编程(Lambda表达式,Stream流,Optional)

一.函数式编程思想 面向对象思想主要是关注对象能完成什么事情,函数式编程思想就像函数式,主要是针对数据操作;代码简洁容易理解,方便于并发编程,不需要过分关注线程安全问题 二.lambda表达式 1.概念 lambda表达式…

提升金融写作效率:金融校对软件的优势与应用

金融行业的写作任务繁重且要求高度专业,涉及财务报告、研究报告、合同、政策文件等各类文档。金融校对软件应运而生,为金融专业人士提供有效的支持,帮助他们提高写作效率和质量。本文将探讨金融校对软件的优势与应用。 一、金融校对软件的优势…

【NFS共享存储服务】

目录 一、NFS (Network File System)网络文件系统1.1、NFS工作原理1.2、举例1.2.1、共享文件总结 一、NFS (Network File System)网络文件系统 依赖于RPC (远端过程调用) 需安装nfs-utils、rpcbind软件包 系统服务: nfs、rpcbind 共享配置文件: /etc/ex…

跳表的实现

目录 简介跳表的实现 简介 skiplist本质也是一种查找结构,和搜索树、哈希表一样可以作为key或者key/value模型的查找结构,从命名可以看出它也是一个链表结构,链表的查找效率是O(n),作为在链表基础上优化的一种查找结构,跳表的查找…

app拉新充场代理

我认为您可能是想了解APP充值拉新软件的功能吧。通常,APP充值拉新软件会具有以下功能: 充值服务:提供多种支付方式,让用户方便快捷地进行充值操作。 活动推广:通过不同的方式,如折扣、优惠码等&…

Tomcat的部署和优化

Tomcat的组件构成 (1)Web 容器:完成 Web 服务器的功能。 (2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。 (3)JSP 容器:用于将 JSP 动态网页翻译成…

centos系统安装mysql8.0

centos系统安装mysql8.0 环境说明开始1、查看centos7中是否有MariaDB,MariaDB与MySQL关系请自行查阅2、如果有MariaDB,需要将 步骤1 中查询到的mairadb全部卸载,否则MySQL安装会出现问题3、查看本机是否已经安装过MySQL4、如果安装过MySQL&am…

9.java程序员必知必会类库之加密库

前言 密码学在计算机领域源远流长,应用广泛。当前每时每刻,每一个连接到互联网的终端,手机,电脑,iPad都会和互联网有无数次的数据交互,如果这些数据都是明文传输那将是难以想象的。为了保护用户隐私&#…