• 作者:韩信子@ShowMeAI
  • 教程地址:https://www.showmeai.tech/tutorials/34
  • 本文地址:https://www.showmeai.tech/article-detail/189
  • 声明:版权所有,转载请联系平台与作者并注明出处

引言

在众多机器学习分类算法中,本篇我们提到的朴素贝叶斯模型,和其他绝大多数分类算法都不同,也是很重要的模型之一。

在机器学习中如KNN、逻辑回归、决策树等模型都是判别方法,也就是直接学习出特征输出YYY和特征XXX之间的关系(决策函数Y=f(X)Y= f(X)Y=f(X)或者条件分布P(Y∣X)P(Y|X)P(Y∣X))。但朴素贝叶斯是生成方法,它直接找出特征输出YYY和特征XXX的联合分布P(X,Y)P(X,Y)P(X,Y),进而通过P(Y∣X)=P(X,Y)P(X)P(Y \mid X)= \frac{P(X,Y)}{P(X)}P(Y∣X)=P(X)P(X,Y)​计算得出结果判定。

朴素贝叶斯是一个非常直观的模型,在很多领域有广泛的应用,比如早期的文本分类,很多时候会用它作为baseline模型,本篇内容我们对朴素贝叶斯算法原理做展开介绍。

1.朴素贝叶斯算法核心思想

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯(Naive Bayes)分类是贝叶斯分类中最简单,也是常见的一种分类方法

朴素贝叶斯算法的核心思想是通过考虑特征概率来预测分类,即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。

举个例子:眼前有100个西瓜,好瓜和坏瓜个数差不多,现在要用这些西瓜来训练一个「坏瓜识别器」,我们要怎么办呢

一般挑西瓜时通常要「敲一敲」,听听声音,是清脆声、浊响声、还是沉闷声。所以,我们先简单点考虑这个问题,只用敲击的声音来辨别西瓜的好坏。根据经验,敲击声「清脆」说明西瓜还不够熟,敲击声「沉闷」说明西瓜成熟度好,更甜更好吃。

所以,坏西瓜的敲击声是「清脆」的概率更大,好西瓜的敲击声是「沉闷」的概率更大。当然这并不绝对——我们千挑万选地「沉闷」瓜也可能并没熟,这就是噪声了。当然,在实际生活中,除了敲击声,我们还有其他可能特征来帮助判断,例如色泽、跟蒂、品类等。

朴素贝叶斯把类似「敲击声」这样的特征概率化,构成一个「西瓜的品质向量」以及对应的「好瓜/坏瓜标签」,训练出一个标准的「基于统计概率的好坏瓜模型」,这些模型都是各个特征概率构成的

这样,在面对未知品质的西瓜时,我们迅速获取了特征,分别输入「好瓜模型」和「坏瓜模型」,得到两个概率值。如果「坏瓜模型」输出的概率值大一些,那这个瓜很有可能就是个坏瓜。

2.贝叶斯公式与条件独立假设

贝叶斯定理中很重要的概念是先验概率后验概率条件概率。(关于这部分依赖的数学知识,大家可以查看ShowMeAI的文章 图解AI数学基础 | 概率与统计,也可以下载我们的速查手册 AI知识技能速查 | 数学基础-概率统计知识)

1)先验概率与后验概率

先验概率事件发生前的预判概率。可以是基于历史数据的统计,可以由背景常识得出,也可以是人的主观观点给出。一般都是单独事件概率。

举个例子:如果我们对西瓜的色泽、根蒂和纹理等特征一无所知,按照常理来说,西瓜是好瓜的概率是60%。那么这个概率P(好瓜)就被称为先验概率。

后验概率事件发生后求的反向条件概率。或者说,基于先验概率求得的反向条件概率。概率形式与条件概率相同。

举个例子:假如我们了解到判断西瓜是否好瓜的一个指标是纹理。一般来说,纹理清晰的西瓜是好瓜的概率大一些,大概是75%。如果把纹理清晰当作一种结果,然后去推测好瓜的概率,那么这个概率P(好瓜|纹理清晰)就被称为后验概率。

条件概率:一个事件发生后另一个事件发生的概率。一般的形式为P(B∣A)P(B|A)P(B∣A)表示AAA发生的条件下BBB发生的概率。

2)贝叶斯公式

简单来说,贝叶斯定理(Bayes Theorem,也称贝叶斯公式)是基于假设的先验概率、给定假设下观察到不同数据的概率,提供了一种计算后验概率的方法。在人工智能领域,有一些概率型模型会依托于贝叶斯定理,比如我们今天的主角「朴素贝叶斯模型」。

  • P(A)P(A)P(A)是先验概率,一般都是人主观给出的。贝叶斯中的先验概率一般特指它。

  • P(B)P(B)P(B)是先验概率,在贝叶斯的很多应用中不重要(因为只要最大后验不求绝对值),需要时往往用全概率公式计算得到。

  • P(B∣A)P(B \mid A)P(B∣A)是条件概率,又叫似然概率,一般是通过历史数据统计得到。

  • P(A∣B)P(A \mid B)P(A∣B)是后验概率,一般是我们求解的目标。

3)条件独立假设与朴素贝叶斯

基于贝叶斯定理的贝叶斯模型是一类简单常用的分类算法。在「假设待分类项的各个属性相互独立」的情况下,构造出来的分类算法就称为朴素的,即朴素贝叶斯算法。

所谓「朴素」,是假定所有输入事件之间是相互独立。进行这个假设是因为独立事件间的概率计算更简单。

朴素贝叶斯模型的基本思想是:对于给定的待分类项 X{a1,a2,a3,⋯,an}X \left\{ a_1,a_2,a_3,⋯,a_n \right\}X{a1​,a2​,a3​,⋯,an​},求解在此项出现的条件下各个类别yiy_iyi​出现的概率,哪个P(yi∣X)P(y_i |X)P(yi​∣X)最大,就把此待分类项归属于哪个类别。

朴素贝叶斯算法的定义为:设 X{a1,a2,a3,⋯,an}X \left\{ a_1,a_2,a_3,⋯,a_n \right\}X{a1​,a2​,a3​,⋯,an​}为一个待分类项,每个aia_{i}ai​为x的一个特征属性,且特征属性之间相互独立。设C{y1,y2,y3,⋯,yn}C \left\{ y_1,y_2,y_3,⋯,y_n\right\}C{y1​,y2​,y3​,⋯,yn​}为一个类别集合,计算P(y1∣X),P(y2∣X),P(y3∣X),…,P(yn∣X)P\left(y_{1} \mid X\right), P\left(y_{2} \mid X\right), P\left(y_{3} \mid X\right), \ldots, P\left(y_{n} \mid X\right)P(y1​∣X),P(y2​∣X),P(y3​∣X),…,P(yn​∣X)。

P(yk∣X)=max⁡{P(y1∣X),P(y2∣X),P(y3∣X),…,P(yn∣X)}P\left(y_{k} \mid X\right)=\max \left\{P\left(y_{1} \mid X\right), P\left(y_{2} \mid X\right), P\left(y_{3} \mid X\right), \ldots, P\left(y_{n} \mid X\right)\right\} P(yk​∣X)=max{P(y1​∣X),P(y2​∣X),P(y3​∣X),…,P(yn​∣X)}

则X∈ykX \in y_{k}X∈yk​

要求出第四项中的后验概率P(yk∣X)P\left(y_{k} \mid X\right)P(yk​∣X),就需要分别求出在第三项中的各个条件概率,其步骤是:

  • 找到一个已知分类的待分类项集合,这个集合叫做训练样本集

  • 统计得到在各类别下各个特征属性的条件概率估计。即

    • P(a1∣y1),P(a2∣y1),⋯,P(an∣y1)P\left(a_{1} \mid y_{1}\right), P\left(a_{2} \mid y_{1}\right), \cdots, P\left(a_{n} \mid y_{1}\right)P(a1​∣y1​),P(a2​∣y1​),⋯,P(an​∣y1​)
    • P(a1∣y2),P(a2∣y2),⋯,P(an∣y2)P\left(a_{1} \mid y_{2}\right), P\left(a_{2} \mid y_{2}\right), \cdots, P\left(a_{n} \mid y_{2}\right)P(a1​∣y2​),P(a2​∣y2​),⋯,P(an​∣y2​)
    • ···
    • P(a1∣yn),P(a2∣yn),⋯,P(an∣yn)P\left(a_{1} \mid y_{n}\right), P\left(a_{2} \mid y_{n}\right), \cdots, P\left(a_{n} \mid y_{n}\right)P(a1​∣yn​),P(a2​∣yn​),⋯,P(an​∣yn​)

在朴素贝叶斯算法中,待分类项的每个特征属性都是条件独立的,由贝叶斯公式

P(yi∣X)=P(X∣yi)P(yi)P(X)P\left(y_{i} \mid X\right)=\frac{P\left(X \mid y_{i}\right) P\left(y_{i}\right)}{P(X)} P(yi​∣X)=P(X)P(X∣yi​)P(yi​)​

因为分母相当于在数据库中XXX存在的概率,所以对于任何一个待分类项来说P(X)P\left(X \right)P(X)都是常数固定的。再求后验概率P(yi∣X)P\left(y_{i} \mid X\right)P(yi​∣X)的时候只用考虑分子即可。

因为各特征值是独立的所以有:

P(X∣yi)P(yi)=P(a1∣yi)P(a2∣yi)⋯P(an∣yi)P(yi)=P(yi)∏j=1nP(aj∣yi)\begin{aligned} P\left(X \mid y_{i}\right) P\left(y_{i}\right) &=P\left(a_{1} \mid y_{i}\right) P\left(a_{2} \mid y_{i}\right) \cdots P\left(a_{n} \mid y_{i}\right) P\left(y_{i}\right) \\ &=P\left(y_{i}\right) \prod_{j=1}^{n} P\left(a_{j} \mid y_{i}\right) \end{aligned} P(X∣yi​)P(yi​)​=P(a1​∣yi​)P(a2​∣yi​)⋯P(an​∣yi​)P(yi​)=P(yi​)j=1∏n​P(aj​∣yi​)​

可以推出:

P(X∣yi)=∏k=1nP(ak∣yi)P\left(X \mid y_{i}\right)=\prod_{{k=1}}^{n} P\left(a_{k} \mid y_{i}\right) P(X∣yi​)=k=1∏n​P(ak​∣yi​)

对于P(yi)P\left(y_{i}\right)P(yi​)是指在训练样本中yiy_{i}yi​出现的概率,可以近似的求解为:

P(yi)=∣yi∣DP\left(y_{i}\right)=\frac{\left|y_{i}\right|}{D} P(yi​)=D∣yi​∣​

对于先验概率P(aj∣yi)P\left ( a_{j} \mid y_{i} \right )P(aj​∣yi​),是指在类别yiy_{i}yi​中,特征元素aja_{j}aj​出现的概率,可以求解为:

P(aj∣yi)=∣在训练样本为yi时,aj出现的次数∣∣yi训练样本数∣P\left ( a_{j} \mid y_{i} \right ) = \frac{\left | 在训练样本为 y_{i} 时,a_{j} 出现的次数 \right | }{\left | y_{i} 训练样本数 \right | } P(aj​∣yi​)=∣yi​训练样本数∣∣在训练样本为yi​时,aj​出现的次数∣​

总结一下,朴素贝叶斯模型的分类过程如下流程图所示:

3.伯努利与多项式朴素贝叶斯

1)多项式vs伯努利朴素贝叶斯

大家在一些资料中,会看到「多项式朴素贝叶斯」和「伯努利朴素贝叶斯」这样的细分名称,我们在这里基于文本分类来给大家解释一下:

在文本分类的场景下使用朴素贝叶斯,那对应的特征aja_jaj​就是单词,对应的类别标签就是yyy,这里有一个问题:每个单词会出现很多次,我们对于频次有哪些处理方法呢?

  • 如果直接以单词的频次参与统计计算,那就是多项式朴素贝叶斯的形态。

  • 如果以是否出现(0和1)参与统计计算,就是伯努利朴素贝叶斯的形态。

(1)多项式朴素贝叶斯

以文本分类为例,多项式模型如下。在多项式模型中,设某文档d=(t1,t2,…,tk)d=\left(t_{1}, t_{2}, \ldots, t_{k}\right)d=(t1​,t2​,…,tk​),tkt_{k}tk​是该文档中出现过的单词,允许重复,则:

先验概率

P(c)=类c下单词总数整个训练样本的单词总数P\left ( c \right ) = \frac{类c下单词总数}{整个训练样本的单词总数} P(c)=整个训练样本的单词总数类c下单词总数​

类条件概率

P(tk∣c)=类c下单词tk在各个文档中出现过的次数之和+1类c下单词总数+∣V∣P\left ( t_{k} \mid c \right ) = \frac{类c下单词t_{k}在各个文档中出现过的次数之和+1}{类c下单词总数+\left | V \right |} P(tk​∣c)=类c下单词总数+∣V∣类c下单词tk​在各个文档中出现过的次数之和+1​

  • VVV是训练样本的单词表(即抽取单词,单词出现多次,只算一个),∣V∣\left | V \right |∣V∣则表示训练样本包含多少种单词。

  • P(tk∣c)P\left ( t_{k} \mid c \right )P(tk​∣c)可以看作是单词tkt_{k}tk​在证明ddd属于类ccc上提供了多大的证据,而P(c)P \left ( c \right )P(c)则可以认为是类别ccc在整体上占多大比例(有多大可能性)。

(2)伯努利朴素贝叶斯

对应的,在伯努利朴素贝叶斯里,我们假设各个特征在各个类别下是服从n重伯努利分布(二项分布)的,因为伯努利试验仅有两个结果,因此,算法会首先对特征值进行二值化处理(假设二值化的结果为1与0)。

对应的P(c)P \left ( c \right )P(c)和P(tk∣c)P\left ( t_{k} \mid c \right )P(tk​∣c)计算方式如下(注意到分子分母的变化):

P(c)=类c下文件总数整个训练样本的文件总数P \left ( c \right )=\frac{类c下文件总数}{整个训练样本的文件总数} P(c)=整个训练样本的文件总数类c下文件总数​

P(tk∣c)=类c下单词tk在各个文档中出现过的次数之和+1类c下单词总数+2P\left ( t_{k} \mid c \right ) = \frac{类c下单词t_{k}在各个文档中出现过的次数之和+1}{类c下单词总数+2} P(tk​∣c)=类c下单词总数+2类c下单词tk​在各个文档中出现过的次数之和+1​

2)朴素贝叶斯与连续值特征

我们发现在之前的概率统计方式,都是基于离散值的。如果遇到连续型变量特征,怎么办呢?

以人的身高,物体的长度为例。一种处理方式是:把它转换成离散型的值。比如:

  • 如果身高在160cm以下,特征值为1;
  • 在160cm和170cm之间,特征值为2;
  • 在170cm之上,特征值为3。

当然有不同的转换方法,比如还可以:

  • 将身高转换为3个特征,分别是f1、f2、f3;
  • 如果身高是160cm以下,这三个特征的值分别是1、0、0;
  • 若身高在170cm之上,这三个特征的值分别是0、0、1。

但是,以上的划分方式,都比较粗糙,划分的规则也是人为拟定的,且在同一区间内的样本(比如第1套变换规则下,身高150和155)难以区分,我们有高斯朴素贝叶斯模型可以解决这个问题。

如果特征xix_{i}xi​是连续变量,如何去估计似然度P(xi∣yk)P\left ( x_{i}\mid y_{k} \right )P(xi​∣yk​)呢?高斯模型是这样做的:我们假设在yiy_{i}yi​的条件下,xxx服从高斯分布(正态分布)。根据正态分布的概率密度函数即可计算出P(x∣yi)P\left ( x \mid y_{i} \right )P(x∣yi​),公式如下:

P(xi∣yk)=12πσyk,i2e−(xi−μyk,i)22σyk,i2P\left(x_{i} \mid y_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{y k, i}^{2}}} e^{-\frac{\left(x_{i}-\mu_{y k, i}\right)^{2}}{2 \sigma_{y k, i}^{2}}} P(xi​∣yk​)=2πσyk,i2​​1​e−2σyk,i2​(xi​−μyk,i​)2​

回到上述例子,如果身高是我们判定人性别(男/女)的特征之一,我们可以假设男性和女性的身高服从正态分布,通过样本计算出身高均值和方差,对应上图中公式就得到正态分布的密度函数。有了密度函数,遇到新的身高值就可以直接代入,算出密度函数的值。

4.平滑处理

1)为什么需要平滑处理

使用朴素贝叶斯,有时候会面临零概率问题。零概率问题,指的是在计算实例的概率时,如果某个量xxx,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。

在文本分类的问题中,当「一个词语没有在训练样本中出现」时,这个词基于公式统计计算得到的条件概率为0,使用连乘计算文本出现概率时也为0。这是不合理的,不能因为一个事件没有观察到就武断的认为该事件的概率是0。

2)拉普拉斯平滑及依据

为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做拉普拉斯平滑。

假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

对应到文本分类的场景中,如果使用多项式朴素贝叶斯,假定特征xix_{i}xi​表示某个词在样本中出现的次数(当然用TF-IDF表示也可以)。拉普拉斯平滑处理后的条件概率计算公式为:

P(xi∣y)=Nyi+αNy+nαP\left(x_{i} \mid y\right) =\frac{N_{y i}+\alpha}{N_{y}+n \alpha} P(xi​∣y)=Ny​+nαNyi​+α​

  • NyiN_{yi}Nyi​表示类yyy的所有样本中特征xix_{i}xi​的特征值之和。

  • NyN_{y}Ny​表示类yyy的所有样本中全部特征的特征值之和。

  • α\alphaα表示平滑值(α∈[0,1]\alpha \in \left [ 0, 1 \right ]α∈[0,1],主要为了防止训练样本中某个特征没出现而导致Nyi=0N_{yi} =0Nyi​=0,从而导致条件概率P(xi∣y)=0P\left(x_{i} \mid y\right) = 0P(xi​∣y)=0的情况,如果不加入平滑值,则计算联合概率时由于某一项为0导致后验概率为0的异常情况出现。

  • nnn表示特征总数。

更多监督学习的算法模型总结可以查看ShowMeAI的文章 AI知识技能速查 | 机器学习-监督学习。

ShowMeAI图解机器学习算法系列(完整版)

ShowMeAI系列教程精选推荐

图解机器学习算法(5) | 朴素贝叶斯算法详解(机器学习通关指南·完结)相关推荐

  1. 机器学习实验:朴素贝叶斯算法

    机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...

  2. k近邻算法与朴素贝叶斯算法

    机器学习--k近邻算法与朴素贝叶斯算法 k近邻算法 朴素贝叶斯 理论基础: 精确率和召回率 交叉验证与网格搜索 k近邻算法 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大 ...

  3. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  4. 机器学习朴素贝叶斯算法_机器学习中的朴素贝叶斯算法

    机器学习朴素贝叶斯算法 朴素贝叶斯算法 (Naive Bayes Algorithm) Naive Bayes is basically used for text learning. Using t ...

  5. 机器学习 第三讲 机器学习基础、机器学习算法(K-近邻算法、朴素贝叶斯算法)

    文章目录 一.机器学习基础 1.明确几点问题 2.机器学习算法的判别依据 3.机器学习算法分类 4.机器学习开发流程 二.机器学习算法 1.sklearn数据集 (1)数据集划分 (2)sklearn ...

  6. 机器学习算法基础——朴素贝叶斯算法

    26.朴素贝叶斯算法原理 联合概率和条件概率 联合概率:包含多个条件,且所有条件同时成立的概率 记作:P(A,B) P(A,B)=P(A)P(B) 条件概率:就是事件A在另外一个事件B已经发生条件下的 ...

  7. 朴素贝叶斯算法_朴素贝叶斯算法原理

    摘要:本文介绍了贝叶斯公式,并根据公式而产生的朴素贝叶斯分类算法在机器学习中的应用,并列举了朴素贝叶斯分类算法的优缺点. 1贝叶斯公式的理解 贝叶斯定理(Bayes' theorem)是概率论中的一个 ...

  8. k-近邻算法及朴素贝叶斯算法

    目录 一.k-近邻算法的定义 二.k近邻算法实例-预测入住位置 三.k-临近算法优缺点 四.精确率与召回率 1.精确率 2.召回率 3.F1-score 4.classification_report ...

  9. 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现

    应用贝叶斯准则: 使用上面这些定义,可以定义贝叶斯分类准则为: 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1; 如果 P(c2|x, y) > P(c1|x, ...

  10. java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

最新文章

  1. Android备份和添加短信
  2. s2 devMode cmdshell
  3. linux php 如何停止,如何关闭linux
  4. Hadoop与Hbase基本配置
  5. mysql主从数据库怎么还口令,mysql数据库主从同步方法讲解
  6. 【leetcode】
  7. 对于C++中多态的理解
  8. linux多行变一列,多行转为一列
  9. JS加密算法简单分析
  10. SpringNBoot日志配置
  11. kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门
  12. 大学计算机网络期末重点,中南大学计算机网络期末复习重点
  13. Json字符串转map集合
  14. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  15. “迭代期内无变更”与敏捷开发产品版本规划
  16. Optical Flow related Tutorials
  17. Linux镜像文件提取,如何提取linux 系统镜像文件
  18. 间接效应值大于1是正常的吗?Q群答疑20200405
  19. 自己设计个动态屏保吧
  20. 详解 Java 内部类

热门文章

  1. 【车牌识别】基于模板匹配算法实现国外车牌识别附matlab源码
  2. 【VHDL】VHDL设计一个分频器
  3. Python歌词解析
  4. Zabbix报警语音
  5. SourceOffsite安装配置
  6. CuteFtpnbsp;Pro之站点导入导出
  7. 站长必备-伪原创原创度检测软件v1.3 (支持百度/谷歌/360/搜狗/神马/微信)
  8. 体表面积在线计算机,体表面积计算器
  9. 使用java实现MD5码算法
  10. 快速做出3D人物动画