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

文章目录

  • 前言
  • 一、贝叶斯算法简介
  • 二、贝叶斯算法的数学原理
    • 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实现的程序思路。朴素贝叶斯算法有很多优势,比如具有良好的可解释性,可以给出每个特征对于分类的影响程度,便于理解和解释;计算速度快,适合处理大规模数据集和高维数据;对于噪声数据和缺失数据有很好的鲁棒性;在处理文本分类和情感分析等自然语言处理任务上表现优异。总的来说,贝叶斯算法的意义依旧不可估量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊云科技出海日6月9日盛夏盛启

向全球价值链上游奋进 中国企业增强国际竞争力的关键,是努力朝全球价值链上游奋进,发力技术出海。中国的出海新机遇,背后曾是疫情在全球按下数字互联和数字化升级的快进键,跨境电商、在线社交、移动支付、数字服务等数字经济迎来…

如何让你的 Jmeter+Ant 测试报告更具吸引力?

目录 引言 一、安装apache-Ant 二、Jmeter准备 3、生成测试报告 4、JMeter动态参数处理逻辑是什么? 5、JMeter是怎么做API自动化测试的? 结语 引言 想象一下,你辛苦搭建了一个复杂的网站,投入了大量的时间和精力进行开发和…

005 - STM32学习笔记 - 启动代码

005 - STM32学习笔记 - 启动代码 常用汇编指令 指令名称作用EQU给数字常量取一个符号名,相当于C语言中的#define;AREA汇编一个新的代码段或者数据段;SPACE分配内存空间;PRESERVE8当前文件栈需要按照8字节对齐;EXPORT…

k8s pv pvc的介绍|动态存储|静态存储

k8s pv pvc的介绍|动态存储|静态存储 1 emptyDir存储卷2 hostPath存储卷3 nfs共享存储卷4 PVC 和 PVNFS使用PV和PVC 4 搭建 StorageClass NFS,实现 NFS 的动态 PV 创建 1 emptyDir存储卷 当Pod被分配给节点时,首先创建emptyDir卷,并且只要该…

详解c++STL—函数对象

目录 1、函数对象 1.1、函数对象概念 1.2、函数对象的使用 2、谓词 2.1、谓词概念 2.2、一元谓词 2.3、二元谓词 3、内建函数对象 3.1、理解内建函数对象 3.2、算术仿函数 3.3、关系仿函数 3.4、逻辑仿函数 1、函数对象 1.1、函数对象概念 概念: 重载…

编译原理个人作业--第六章——基于 编译原理 国防工业出版社 第三版

2 对表达式((a)(b)) (1) 按照表6.4属性文法构造抽象语法树 (2) 按6.17翻译模式构造表达式抽象语法树 5(1) 下列文法对整型常数、实型常熟世家加法运算符 生成表达式,当两个整型数相加,结果为整形,否则结果为实型 E → E T ∣ T E\r…

面试技术点

一、对热修复、插件化、模块化、组件化有一定研究。 1、模块化 将共享部分或业务模块抽取出来形成独立module。 2、组件化 基于模块化,核心思想是角色的转换,在打包时是library,分离独立的业务组件如微信朋友圈。 3、热修复和插件化种类、…

电力系统机组组合优化调度(IEEE14节点、IEEE30节点、IEEE118节点)(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 📝目前更新:🌟🌟🌟电力系统相关知识,期刊论文&…

Java并发编程-synchronized

目录 1. synchronized在jdk 1.6中的优化 1.1 锁消除 1.2 锁粗化 1.2 锁升级/锁膨胀 1.2.1 锁升级原理 1.2.2 自适应自旋锁 2. synchronized实现原理 3. synchronized和Lock的对比 1. synchronized在jdk 1.6中的优化 在JDK1.5的时候,Doug Lee推出了ReentrantLock,lock的…

chatgpt赋能Python-python_os拷贝文件

Python os拷贝文件 – 从简介到实现 Python os库是一个经常使用的工具,它是Python的标准库,提供了与操作系统进行交互的函数和方法。其中,os拷贝文件是其常用的功能之一,可以用来实现文件备份、文件复制等等操作。接下来&#xf…

windows sever服务器安装系统新手版

混在learnsite群里已经有几年了吧,但是只有一段时间用了别人现成的一个iso版本还比较老,这次打算自己弄一个,一开始打算linux下弄,结果系统都装完了发现人家说learnsite在linux下有点bug没解决好,只能win下再弄&#x…

Vue+uniapp桃源婚恋交友APP 安卓小程序 nodejs java python

小程序框架:uniapp 小程序开发软件:HBuilder X 开发模式:混合开发本文先提出了开发基于小程序的桃源婚恋交友APP系统的背景意义,然后通过功能性和非功能性分析阐述本系统的需求,然后进行系统设计。技术实现部分选择Jav…

据不可靠消息,ST的新一代机皇正式命名为STM32V8系列,搭载Cortex-M85内核

根据以往的传统单片机命名方式: C0, L0, G0, F0 > Cortex-M0内核 F1, L1 > Corterx-M3内核 F2, F3 > Corterx-M3/M4 F4,G4,L4, L4 > Cortex-M4内核 L5,U5, H5 > Cor…

web安全第一天 ,域名,dns

第一天 什么是域名?域名就是网络地址 在hhtp之后的就是域名 域名在哪里注册呢 国内注册商有很多,在网络上搜索一下阿里云万网就可以注册 什么是二级域名和多级域名 域名通常都是www.开头 ,而www.被称为顶级域名,在搜索的时候…

部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

深度学习量化总结(PTQ、QAT)

背景 目前神经网络在许多前沿领域的应用取得了较大进展,但经常会带来很高的计算成本,对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键,在这些场景中模型推理具有严格的功率和计算要求。神经网络…

5月份招了个00后测试堪称卷王之王,让人崩溃...

前段时间公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司干了三年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&am…

c++虚函数详解(多态特性)

1.c多态的概念 多态是c的特征之一 多态的分类:静态多态(静态联编)、动态多态(动态联编) 静态多态(静态联编):函数入口地址 是在 编译阶段 确定(运算符重载、函数重载&…

使用go语言构建区块链 Part4.事务1

英文源地址 简介 事务是比特币的核心, 区块链的唯一目的是以安全可靠的方式存储交易, 因此在交易创建后没有人可以修改. 今天我们开始实现事务, 但由于这是一个相当大的主题, 我将它分成两部分: 在这一部分中, 我们将实现事务的通用机制, 在第二部分中, 我们将研究细节. 此外…

【Go语言从入门到实战】基础篇

Go语言从入门到实战 — 基础篇 First Go Program 编译 & 运行 基本程序结构 应用程序入口 package mainimport "fmt"func main() {fmt.Println("Hello World") }退出返回值 package mainimport ("fmt""os" )func main() {fmt.Pr…