Python机器学习入门 - - 贝叶斯算法学习笔记

news2024/9/20 16:42:52

文章目录

  • 前言
  • 一、贝叶斯算法简介
  • 二、贝叶斯算法的数学原理
    • 1. 条件概率
    • 2. 全概率公式
    • 3. 贝叶斯公式
    • 4. 朴素贝叶斯分类器
    • 5. 高斯朴素贝叶斯分类器和伯努利朴素贝叶斯分类器
  • 三、Python实现朴素贝叶斯分类
  • 总结


前言

贝叶斯公式是我们高中就耳熟能详的统计概率定理,贝叶斯公式给我带来的震撼就是竟然有人能通过已知去预测未知,有种说不出的神秘感!可能在世俗的理念中,这种未来的预测是十分荒谬不合乎逻辑的,但贝叶斯却用一个数学模型囊括了用先验概率求解后验概率分布的推理过程,真的不可思议!


一、贝叶斯算法简介

贝叶斯算法是一种基于贝叶斯定理的统计学习方法,用于分类、预测和推理等问题。它的基本思想是利用先验概率和样本数据来计算后验概率,从而进行分类或预测。

在这里插入图片描述

具体来说,贝叶斯算法假设分类结果是由多个特征共同决定的,并且这些特征之间是相互独立的。通过对已知分类的训练数据进行统计分析,可以计算出每个特征对于每个分类的条件概率,即给定某个分类的情况下,某个特征出现的概率。这些条件概率和每个分类的先验概率(即在没有任何数据的情况下,每个分类出现的概率)一起使用,就可以通过贝叶斯定理计算出每个分类的后验概率,即在给定特征的情况下,每个分类出现的概率。最终,根据后验概率大小进行分类或预测。

贝叶斯算法有两种常用的实现方式:朴素贝叶斯和贝叶斯网络。朴素贝叶斯算法假设所有特征之间是相互独立的,因此可以简化计算过程。贝叶斯网络则是一种图模型,用于描述变量之间的关系,可以处理特征之间存在依赖关系的情况。

贝叶斯算法在文本分类、垃圾邮件过滤、推荐系统等领域得到了广泛应用,它不仅具有较高的分类准确率,而且还可以处理多分类和高维数据等问题。

二、贝叶斯算法的数学原理

1. 条件概率

在这里插入图片描述

条件概率就是后验概率,它想表达的就是事件A在另一个事件B已经发生的条件下发生的概率,我们用 P ( A ∣ B ) P(A|B) P(AB) 来表达条件概率
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B) = \frac{P(AB)}{P(B)} P(AB)=P(B)P(AB)

在这里插入图片描述

条件概率公式描述了后验概率是可以通过先验概率来进行推导的,即但我们知道事件A发生的概率和事件A事件B一起发生的概率,我们可以反向推导事件A在另一个事件B已经发生的条件下发生的概率

2. 全概率公式

光有条件概率还不够,如果在事件集中我们如何继续应用条件概率的思想去解决一些问题,这时候就需要全概率计算。如果事件 B 1 , B 2 , B 3 , ⋯   , B n B_{1}, B_{2}, B_{3}, \cdots, B_{n} B1,B2,B3,,Bn 构成一个完备事件组 B B B 且都有正概率,那么我们可以用全概率公式来表达事件 A A A 发生的概率

P ( A ) = ∑ i = 1 n P ( A ∣ B i ) P ( B i ) P(A)= \sum_{i=1}^{n} P(A|B_{i})P(B_{i}) P(A)=i=1nP(ABi)P(Bi)

全概率公式将条件概率和先验概率结合起来,揭示了条件概率在事件集中逆向转换过程,算是对单一事件条件概率的一种延伸

3. 贝叶斯公式

在这里插入图片描述
贝叶斯研究了一个非常有意思的东西,如果通过一个条件概率转化计算出另一个互补的条件概率,那我们就可以预测一些很有意思的事情,于是贝叶斯定理就诞生了,贝叶斯学派的思想可以概括为先验概率+数据=后验概率。贝叶斯公式可以表达为事件A在事件B发生的条件下的发生概率比上事件A发生的概率等于事件B在事件A发生的条件下的发生概率比上事件B发生的概率

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

在机器学习中,我们把这事件A和事件B等价于特征和标签,于是就可以得到贝叶斯算法的基本定理,几乎所有的贝叶斯算法都是基于下面的原理进行展开优化的

在这里插入图片描述

4. 朴素贝叶斯分类器

在现实生活中,想要对某件事的发生做一个预测,一定会考虑到很多因素特征,朴素贝叶斯的出现就帮助我们简化很多特征因素间繁琐的关系考量。朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。其核心思想是利用已知类别的样本数据集,通过计算特征之间的条件概率,来预测新样本所属的类别。类别标签 y y y 在几个特征因素的条件概率可以表达为

P ( y ∣ x 1 , x 2 , . . . , x n ) = P ( y ) P ( x 1 , x 2 , . . . , x n ∣ y ) P ( x 1 , x 2 , . . . , x n ) P(y|x_1, x_2, ..., x_n) = \frac{P(y)P(x_1, x_2, ..., x_n|y)}{P(x_1, x_2, ..., x_n)} P(yx1,x2,...,xn)=P(x1,x2,...,xn)P(y)P(x1,x2,...,xny)

其中, y y y 表示类别, x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 表示特征向量, P ( y ∣ x 1 , x 2 , . . . , x n ) P(y|x_1, x_2, ..., x_n) P(yx1,x2,...,xn) 表示在给定特征向量 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 的条件下,样本属于类别 y y y 的概率。

朴素贝叶斯算法假设所有的特征之间都是独立的,也就是说我们在考虑一件事情的几个影响因素时,将每个因素看作是互不影响的独立个体。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。根据独立性假设,可以将 P ( x 1 , x 2 , . . . , x n ∣ y ) P(x_1, x_2, ..., x_n|y) P(x1,x2,...,xny) 展开为每个特征在给定类别下的条件概率的乘积:

P ( x 1 , x 2 , . . . , x n ∣ y ) = ∏ i = 1 n P ( x i ∣ y ) P(x_1, x_2, ..., x_n|y) = \prod_{i=1}^{n} P(x_i | y) P(x1,x2,...,xny)=i=1nP(xiy)

其中, P ( y ) P(y) P(y) 表示类别 y y y 在样本中的先验概率, P ( x i ∣ y ) P(x_i|y) P(xiy) 表示在给定类别 y y y 的条件下,特征 x i x_i xi 出现的概率, P ( x 1 , x 2 , . . . , x n ) P(x_1, x_2, ..., x_n) P(x1,x2,...,xn) 表示特征向量 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 出现的概率。

P ( y ∣ x 1 , x 2 , . . . , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , x 2 , . . . , x n ) P(y|x_1, x_2, ..., x_n) = \frac{P(y) \prod\limits_{i=1}^{n}P(x_i|y)}{P(x_1, x_2, ..., x_n)} P(yx1,x2,...,xn)=P(x1,x2,...,xn)P(y)i=1nP(xiy)

在实际应用中,由于 P ( x 1 , x 2 , . . . , x n ) P(x_1, x_2, ..., x_n) P(x1,x2,...,xn) 对于所有类别都是相同的,因此可以省略分母,仅考虑分子部分,选择具有最大后验概率的类别作为预测结果,最后我们会得到 y ^ \hat{y} y^ 表示预测的类别

y ^ = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat{y} = \arg\max_{y} P(y) \prod_{i=1}^{n} P(x_i | y) y^=argymaxP(y)i=1nP(xiy)

5. 高斯朴素贝叶斯分类器和伯努利朴素贝叶斯分类器

高斯朴素贝叶斯算法是朴素贝叶斯算法的一种常见形式,适用于特征变量为连续值的情况。在高斯朴素贝叶斯算法中,假设每个类别下的特征变量服从高斯分布,因此可以用高斯分布的概率密度函数来计算条件概率。最终预测的类别 y ^ \hat{y} y^ 的表达式为

y ^ = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n 1 2 π σ y , i 2 exp ⁡ ( − ( x i − μ y , i ) 2 2 σ y , i 2 ) \hat{y} = \arg\max_{y} P(y) \prod_{i=1}^{n} \frac{1}{\sqrt{2\pi\sigma_{y,i}^2}} \exp\left(-\frac{(x_i - \mu_{y,i})^2}{2\sigma_{y,i}^2}\right) y^=argymaxP(y)i=1n2πσy,i2 1exp(2σy,i2(xiμy,i)2)

伯努利朴素贝叶斯算法是朴素贝叶斯算法的一种常见形式,适用于特征变量为二元变量的情况。在伯努利朴素贝叶斯算法中,假设每个特征变量都是二元变量,即只有两种取值,如 0 和 1。因此,每个特征变量的条件概率只有两种取值,分别对应于特征变量取值为 0 和 1 的情况。最终预测的类别 y ^ \hat{y} y^ 的表达式为

y ^ = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n P i ∣ y x i ( 1 − P i ∣ y ) 1 − x i \hat{y} = \arg\max_{y} P(y) \prod_{i=1}^{n} P_{i|y}^{x_i} (1 - P_{i|y})^{1-x_i} y^=argymaxP(y)i=1nPiyxi(1Piy)1xi

三、Python实现朴素贝叶斯分类

Python实现朴素贝叶斯分类的思路,首先导包,这次我们选择月亮数据集和块状数据集,选择高斯朴素贝叶斯分类器和伯努利朴素贝叶斯分类器,接着实例化对象并创建画布,然后定义一个画图函数,首先标准化数据集并画好网格,接着画散点图并创建子图,最后训练模型,并把返回预测值,拉长进行决策边界等高线可视化

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_blobs
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB, ComplementNB


# 模型的名字
names = ["Gaussian", "Bernoulli"]
# 创建我们的模型对象
classifiers = [GaussianNB(), BernoulliNB()]
# 创建数据集
datasets = [ make_moons(noise=0.2, random_state=0),make_blobs(centers=2, random_state=2),]
# 创建画布
figure = plt.figure(figsize=(12, 8))


def plot_clf(NB_clf, dataset, name, i):
    X, y = dataset
    #     标准化数据集
    X = StandardScaler().fit_transform(X)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
    #     对画布画网格线
    x1_min, x1_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    x2_min, x2_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    array1, array2 = np.meshgrid(np.arange(x1_min, x1_max, 0.2),
                                 np.arange(x2_min, x2_max, 0.2))
    cm = plt.cm.RdBu
    cm_bright = ListedColormap(['#fafab0', '#9898ff'])
    i += 1
    ax = plt.subplot(len(dataset), 2, i)
    ax.set_title("dataset")
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train,
               cmap=cm_bright, edgecolors='k')
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test,
               cmap=cm_bright, alpha=0.6, edgecolors='k')
    ax.set_xlim(array1.min(), array1.max())
    ax.set_ylim(array2.min(), array2.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1
    ax = plt.subplot(len(dataset), 2, i)
    clf = NB_clf.fit(X_train, y_train)
    score = clf.score(X_test, y_test)
    Z = clf.predict_proba(np.c_[array1.ravel(), array2.ravel()])[:, 1]
    Z = Z.reshape(array1.shape)
    ax.contourf(array1, array2, Z, cmap=cm, alpha=.8)
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
               edgecolors='k')
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
               edgecolors='k', alpha=0.6)
    ax.set_xlim(array1.min(), array1.max())
    ax.set_ylim(array2.min(), array2.max())
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(name)
    ax.text(array1.max() - .3, array2.min() + .3, ('{:.1f}%'.format(score * 100)),
            size=15, horizontalalignment='right')


for i in range(2):
    plot_clf(classifiers[i], datasets[i], names[i], 2*i)
    plt.tight_layout()
plt.show()

在这里插入图片描述


总结

以上就是贝叶斯算法学习笔记的全部内容,本篇笔记简单介绍了贝叶斯算法的数学原理以及python实现的程序思路。朴素贝叶斯算法有很多优势,比如具有良好的可解释性,可以给出每个特征对于分类的影响程度,便于理解和解释;计算速度快,适合处理大规模数据集和高维数据;对于噪声数据和缺失数据有很好的鲁棒性;在处理文本分类和情感分析等自然语言处理任务上表现优异。总的来说,贝叶斯算法的意义依旧不可估量。

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

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

相关文章

UnityVR--ResourceManager--资源管理

目录 简介 加载资源的几种方式 资源加载的管理器Resload.cs ResLoad类的应用举例 简介 这里记录一个资源管理工具集,提供一些方法将一些Object、Prefab直接从Assets文件夹中加载到场景中。 加载资源的几种方式 在项目中我们经常需要使用一些随时取用的东西&…

2023 华为 Datacom-HCIE 题库 06--含解析

多项选择 1.[试题编号:190185] (多选题)如图所示,PE 1和PE2之间通过Loopback0接口建立MP-BGP邻居关系,在配置完成之后,发现CE1和CE2之间无法互相学习路由,以下哪些项会导致该问题出现? A、PE1…

GDB调试工具

GDB(GNU Debugger)是一个功能强大的命令行调试工具,用于调试 C、C 程序以及其他编程语言的程序。它是 GNU 项目的一部分,可在多个操作系统上使用,包括 Linux、macOS 和 Windows(通过 MinGW 或 Cygwin&#…

针对KF状态估计的电力系统虚假数据注入攻击研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

如何用ChatGPT学Python

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT的能力大家肯定都听说过,很多学生应该都亲身体验过。它在自然语言处理方面的出色表现绝对颠覆了之前公众对人…

一文详解Java自定义注解

目录 简介 JDK注解 Target Retention Documented Inherited 第三方注解 自定义注解 举例 默认字符串注解 实现指定包名称扫描注解 简介 注解(Annotation)是Java SE 5.0 版本开始引入的概念,它是对 Java 源代码的说明,…

FreeRTOS中断配置和临界值

Cortx-M 中断 优先级分组 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。高的抢占式优先级可以打断低的抢占式优先级&am…

mysql加强小结 203446

数据库三范式: 什么是范式 规则:想要设计一个好的关系,必须要满足一定的约束条件,有几个等级,一级比一级高 ​ 解决什么问题:让数据库设计更加简洁,结构更加清晰,否则容易造成数据冗余 数据库有哪些范式? ​ 数据库有七大范式,常用的只有三个范式 **第一范式:**业务上属…

电磁兼容(EMC)基础(二)

目录 1.1 什么是电磁兼容(EMC) 1.2 各种各样的“干扰” 1.3 电磁兼容三要素 1.4 什么是分贝 1.5 天线 1.1 什么是电磁兼容(EMC) 电磁兼容(Electro Magnetic Compatibility,EMC)是电子、电气设备或系统的一种重要…

面试题基础篇

文章目录 1、二分查找2、冒泡排序3、选择排序4、插入排序5、希尔排序6、快速排序7、ArrayList8、Iterator9、LinkedList10、HashMap10.1、基本数据结构底层数据结构,1.7和1.8有什么不同? 10.2、树化与退化为何要用红黑树,为何一上来不树化&am…

【开放原子训练营(第三季)inBuilder低代码开发实验室学习心得】

今天要给大家介绍的项目是UBML 什么是UBML呢? UBML(统一业务建模语言 Unified-Business-Modeling-Language)是一种用于快速构建应用软件的低代码开发建模语言,是开放原子开源基金会(OpenAtom Foundation)…

数据结构与算法:树形查找

一.二叉排序树&#xff08;BST&#xff09; 1.个人理解 左子树结点值 < 根结点值 < 右子树结点值对二叉排序树进行中序遍历&#xff0c;可以得到一个递增的有序数列 2.二叉树查找 原理&#xff1a; 对于一个给定的二叉排序树&#xff0c;如果要查找一个节点&#xff0…

并发知识杂谈

在JAVA语言层面&#xff0c;怎么保证线程安全&#xff1f; 有序性&#xff1a;使用happens-before原则 可见性&#xff1a;可以使用 volatile 关键字来保证&#xff0c;不仅如此&#xff0c;volatile 还能起到禁止指令重排的作用&#xff1b;另外&#xff0c; synchronized 和…

进程和编码

一、python代码的运行方式 1.脚本式 2. 交互式 一般用于代码的测试 二、进制及相互之间的转换 1. 进制 2.进制之间相互转换 在python中&#xff0c;十进制是以整形的形式存在&#xff0c;其他进制是已字符串的形式存在。 二进制/八进制/十六进制都可与十进制相互转换。但…

走向编程大师之路的几个里程碑

走向编程大师之路的几个里程碑 1语言关 2算法关 3系统关 4 编译器关 如下的系统的核心代码都有一万行以上&#xff0c;是规模和复杂度足够 大&#xff0c;可以检验开发者的模块化编程能力&#xff0c;掌控复杂度的能力。 使用什么编程语言本身是不重要的&#xff0c;能够有能…

常用消息中间件简介

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种&#xff1a; 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式&#xff0c;同步的&#xff0c;跨语言跨平台&#xff0c;面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

一个命令搞定Linux大文件下载

问题 Linux下log日志太大了&#xff0c;下载太慢了&#xff0c;即使下载下来&#xff0c;打开也费劲&#xff0c;咋办&#xff1f;将某文件夹打包成xx.tar.gz包&#xff0c;但依然很大&#xff0c;公司无法下载这么大的压缩包&#xff0c;咋办&#xff1f; split 以上2个问题…

[golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

一.全文搜索引擎 ElasticSearch 的介绍&#xff0c;以 及安装配置前的准备工作 介绍 ElasticSearch 是一个基于 Lucene 的 搜索服务器,它提供了一个 分布式多用户能力的 全文搜索引擎&#xff0c;基于 RESTful web 接口,Elasticsearch 是用 Java 开发的&#xff0c;并作为 Apac…

PIC18F26单片机波特率配置

只需要配置以下三个寄存器&#xff1a; BRGCON1 BRGCON2 BRGCON3 BRGCON10x07; > 0000 0111 BRGCON20x90; > 1001 0000 BRGCON30x42; > 0101 0010 BRGCON1&#xff1a; Sync_Sog (bit7~bit6)1TQ,BRP(bit5~bit0)1 &#xff0c;则TQ((2*(BRP1))/Fosc16/32M&am…

Mysql存储时间,对应Api及对应的java属性

1.Mysql存储时间的类型 常用的储存时间/日期的类型&#xff1a; DATE&#xff1a;仅用于存储日期值&#xff08;年、月、日&#xff09;&#xff0c;格式为YYYY-MM-DD。TIME&#xff1a;仅用于存储时间值&#xff08;小时、分钟、秒&#xff09;&#xff0c;格式为HH:MM:SS。DA…