朴素贝叶斯分类——大道至简

2024-03-10 09:30

本文主要是介绍朴素贝叶斯分类——大道至简,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分类问题

已知m个样本 $(x^1,y^1), ...... (x^m,y^m)$,x是特征变量,y是对应的类别。
要求一个模型函数h,对于新的样本 $x^t$,能够尽量准确的预测出 $y^t = h(x^t)$。

概率角度

很多机器学习算法从误差角度来构建模型函数h,也就是先假设一个h,然后定义一个h(x)与y的误差,通过逐步减少h(x)与y的误差来获得一个拟合的模型h。

现在我们从概率的角度来考虑一下。
假设y有m个类别,即 $y_1,......y_n ∈ \{C_1,......C_m\}$,
对于样本 $x^t$,如果能计算出每个类别的条件概率 $P(C_1|x^t),......P(C_m|x^t)$,那么可以认为概率最大的那个类别就是 $x^t$ 所属的类别。(关于条件概率和贝叶斯定理请参考 理解贝叶斯定理)。即

$$ h(x) = C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(1) $$

朴素贝叶斯分类器

已知m个样本 $(x^1,y^1),(x^2,y^2), ...... (x^m,y^m)$,
x是n维特征变量,即 $x=(x_1,x_2,......x_n)$,
y是对应的类别,设有K个类别,即 $y^1,y^2,......y^m ∈ \{C_1,C_2,......C_K\}$,

对任一给定的x,我们需要分别计算出x属于各分类的概率 $P(C_1|x),P(C_2|x),......P(C_K|x)$,其中有最大值的$P(C_k|x)$,x即属于该分类$C_k$,即样本x属于分类

$$ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(2) $$

现在需要计算 $P(C_k|x)$,应用贝叶斯定理:

$$ P(C_k|x) = \frac{P(C_k)}{P(x)} P(x|C_k) \quad(3) \\ = \frac{P(C_k)}{P(x)} P(x_1,x_2,......x_n|C_k) \quad(4) $$

这里 $P(x_1,x_2,......x_n|C_k)$ 是一个条件联合概率,意思是在分类 $C_k$ 中,特征 $(x_1,x_2,......x_n)$ 取一组特定值(也就是需要预测的样本x的各特征的值)的概率。这个概率不容易计算,为了方便,于是朴素贝叶斯(Naive Bayes) 隆重登场。在这里朴素的意思是,假定 x 的各特征 $x_1,x_2,......x_n$ 是条件独立的。(参考维基百科 - 条件独立)。因此

$$ P(x_1,x_2,......x_n|C_k) = P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \quad(5) $$

这个转换其实就是 独立变量的联合分布 = 各变量先验分布的乘积(参考 维基百科 - 联合分布),只不过这里是条件概率,但是因为变换前后都有同样的条件 $C_k$,从样本空间 $C_k$ 的角度看,其实就是联合分布转换成先验分布的乘积。(对样本空间的理解请参考 理解贝叶斯定理)。

将(5)带回(4)得

$$ P(C_k|x) = \frac{P(C_k)}{P(x)} P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \\ = \frac{P(C_k)}{P(x)} \prod_{j=1}^{n}P(x_j|C_k) \quad(6) $$

对任一给定的样本x的值是确定的,且x不依赖于C,所以P(x)可以看作常量。所以可以忽略 $P(x)$。

$$ P(C_k|x) \propto P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \\ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \quad(7) $$

这就是朴素贝叶斯分类的模型函数。

参数估计

上述公式中主要有两项,分别考察一下如何计算。

参数1:$P(C_k)$

上式中 $P(C_k)$ 比较容易计算,用频率来估算概率,统计m个样本中属于 $C_k$ 的样本的频率即可。设m个样本中有 $m_k$ 个样本的类别是 $C_k$,则

$$ P(C_k) = m_k / m \quad(8) $$

参数2:$P(x_j|C_k)$

对$P(x_j|C_k)$的计算需要事先假设样本特征$x_j$的数据分布情况。对特征分布的假设,我们称之为事件模型,通常会采用以下三种假设。

  1. 多项式分布

如果特征$x_j$是离散值,可以假设它符合 多项式分布。可以统计$x_j$的某个特征在样本中的频率来估算其概率。
假设 特征$x_j$ 有 $S_j$ 个可能的取值(比如天气有阴、晴、雨三种状态,则 $S_j=3$),并且在n个样本中,类别为 $C_k$、特征 $x_j$ 取值为 s 的样本有 $m_{kjs}$ 个。则

$$ P(x_{js}|C_k) = m_{kjs} / m_k \quad(9) $$

有时候样本中某个特征的特定取值的样本数 $m_{kjs} = 0$,这将导致整个 $P(C_k) \prod_{j=1}^{n}P(x_j|C_k) = 0$,严重扭曲了该特征的概率分布。因此,通常可以采用拉普拉斯平滑来避免这种情况发生。即

$$ P(x_{js}|C_k) = (m_{kjs} + \lambda) \big/ (m_k + S_j \lambda) \quad(10) $$

通常取 $\lambda = 1$
将(8)和(10)带入贝叶斯分类器(7),得到

$$ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \\ k = \arg\max \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11) $$

用一个粗略的示意图来理解一下特征为离散值时,条件概率$P(x_{js}|C_k)$如何根据样本集来进行估算:

特征为离散值
图中表示整个样本空间,有两个类别 $C_1, C_2$,每个样本有两个特征 $x_1, x_2$,其中 $x_1$ 有3个可取的离散值 $S_{11}, S_{12}, S_{13}$,$x_2$ 有4个可取的离散值 $S_{21}, S_{22}, S_{23}, S_{24}$。图中橙色部分就是 $m_{111}$,即 类别=$C_1$,特征=$x_1$,特征值=$S_{11}$时(k=1,j=1,s=1)的样本数,蓝色部分就是 $m_{123}$,即 类别=$C_1$,特征=$x_2$,特征值=$S_{23}$时(k=1,j=2,s=3)的样本数。整个灰色部分是 $m_1$,即类别为 $C_1$的样本数。

举例:根据天气情况决定是否打网球
本案例来自 朴素贝叶斯分类器

打网球样本

上面表格是某同学在不同天气情况下的打网球决策数据。
假设今天天气状况是:Outlook=sunny, Temperature=cool,Humidity=high,Wind=strong,该同学是否会去打网球呢?
这里的几个特征,天气、温度、湿度、风速都是离散型变量,适合采用上面的多项式贝叶斯分类方法。将上面的公式写在这里便于查看。

$$ k = \arg\max \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11) $$

我们需要计算 $k=\{yes, no\}$ 两种情况下,$x=(sunny,cool,high,strong)$ 的估算概率。
统计上表中各种情况下的样本数量可知:
总样本数 m=14

打球(k=yes)的样本数 $m_{yes}$ = 9
不打球(k=no)的样本数 $m_{no}$ = 5

天气的取值 $S_{Outlook}=3$(Sunny/Overcast/Rain)
晴天打球(k=yes,j=Outlook,s=sunny)的样本数 $m_{kjs}=2$
晴天不打球(k=no,j=Outlook,s=sunny)的样本数 $m_{kjs}=3$

温度的取值 $S_{Temperature}=3$(Hot/Mild/Cool)
冷天打球(k=yes,j=Temperature,s=cool)的样本数 $m_{kjs}=3$
冷天不打球(k=no,j=Temperature,s=cool)的样本数 $m_{kjs}=1$

湿度的取值 $S_{Humidity}=2$(High/Normal)
潮湿天打球(k=yes,j=Humidity,s=high)的样本数 $m_{kjs}=3$
潮湿天不打球(k=no,j=Humidity,s=high)的样本数 $m_{kjs}=4$

风力的取值 $S_{Wind}=2$(Strong/Weak)
大风天打球(k=yes,j=Wind,s=strong)的样本数 $m_{kjs}=3$
大风天不打球(k=no,j=Wind,s=strong)的样本数 $m_{kjs}=3$

将上述数据代入公式(11),对于样本 $x=(sunny,cool,high,strong)$ ,打球(k=yes)的概率

$$ k=yes \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{9}{14} \Big( \frac{2 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \\ = 0.007084 $$

不打球(k=nos)的概率

$$ k=no \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{5}{14} \Big( \frac{3 + 1}{5 + 3} \Big) \Big( \frac{1 + 1}{5 + 3} \Big) \Big( \frac{4 + 1}{5 + 2} \Big) \Big( \frac{3 + 1}{5 + 2} \Big) \\ = 0.01822 $$

这里 0.01822 > 0.007084,所以该同学可能不会去打球。经过归一化,
不打球的概率 = 0.01822 / (0.01822 + 0.007084) = 72%
(注:这里计算结果与原案例中的数值不同,因为这里有做拉普拉斯平滑,原案例中没有。本案例中其实没有出现特定特征的样本数为0的情况,可以不用做拉普拉斯平滑,不过这里是按照公式写下来的,就按公式计算了)

  1. 伯努利分布

如果特征$x_j$是稀疏二项离散值,可以假设它符合 伯努利分布。上面打网球的案例中,湿度取值是 {high,normal},风力取值是 {strong,weak},这两个特征都是二项离散值。
伯努利分布只有两种可能的取值,我们将其编码为 {0,1},则

$$ P(x_{js}|C_k) = \begin{cases} P(x_{js}=1|C_k) \\ P(x_{js}=0|C_k) = 1 - P(x_{js}=1|C_k) \end{cases} \quad(12) $$

另外注意到伯努利分布其实是多项式分布的特例,所以我们可以用上面公式(12)计算,也可以用之前多项式分布公式(11)计算。

垃圾邮件分类等涉及文本的任务中可以采用伯努利分布,比如构造一个5000个不同单词的向量作为输入特征x,对于一段文本,其中有出现的单词,在x中对应单词的位置设为1,其它位置为0,这样x中的每个特征(单词)的取值为1或0,符合伯努利分布。

  1. 高斯分布

如果特征$x_j$是连续变量,可以假设它符合 高斯分布(正态分布)。准确点说,是假设每个类别 $C_k$ 下的 $x_{kj}$ 符合高斯分布。这样,我们可以通过高斯分布的概率密度函数来计算样本中 $x_j$ 某个特定值的条件概率 $P(x_{js}|C_k)$。高斯分布的概率密度函数为:

$$ f(x;\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} exp \Big( - \frac{(x-\mu)^2}{2 \sigma ^2} \Big) $$

其中 $\mu$ 是均值,$\sigma^2$是方差。
假设在类别 $C_k$ 中,特征 $x_j$ 的均值为 $\mu_{kj}$,方差为 $\sigma_{kj}^2$(这两项可以通过样本数据统计出来)。则

$$ P(x_{j}|C_k) = \frac{1}{\sigma_{kj} \sqrt{2 \pi}} exp \Big( - \frac{(x_j-\mu_{kj})^2}{2 \sigma_{kj} ^2} \Big) $$

案例请参考 维基百科 - 案例 - 性别分类

处理连续数值问题的另一种常用的技术是通过离散化连续数值的方法。通常,当训练样本数量较少或者是精确的分布已知时,通过概率分布的方法是一种更好的选择。
而在大量样本的情形下离散化的方法表现更优,因为大量的样本可以学习到数据的实际分布,而不用“朴素”的假设其分布。典型情况下很多任务都会提供大量的样本,所以这时选择离散化方法会比概率分布估计的方法更好。

题外话

顺便说一句,每次看到朴素这个词,我就仿佛看到贝叶斯穿着一身打满补丁衣服的样子。而naive意思是缺乏经验的;幼稚的;无知的;轻信的。从公式推导过程来看,朴素贝叶斯分类器采用了一些简化条件的假设,比如假设 x 的各特征 $x_1,x_2,......x_n$ 是条件独立的,假设样本特征数据符合多项式分布、伯努利分布、高斯分布等,这些假设都可能不完全符合实际情况,因为对险恶的现实世界的无知从而采用了一些天真的假设。
不过,朴素还有一层含义是专一、纯粹,在这个意义上,贝叶斯分类也算大道至简,大智若愚了。

优缺点

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

1)算法简单,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感。

朴素贝叶斯的主要缺点有:   
1)“朴素”的假设如果与实际情况不符,会影响模型效果。
2)输入特征数据的表现形式,比如是连续特征,离散特征还是二元特征,会影响概率计算和模型的分类效果。

参考

朴素贝叶斯算法原理小结
朴素贝叶斯分类器
维基百科 - Naive Bayes classifier
理解贝叶斯定理

这篇关于朴素贝叶斯分类——大道至简的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793797

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构