本博客是基于对周志华教授所著的《机器学习》的“第7章 贝叶斯分类器”部分内容的学习笔记。


朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理。另外,它是一种生成模型(generative model),采用直接对联合概率P(x,c)建模,以获得目标概率值的方法。

预备知识

先验概率与后验概率

先验概率(摘自维基百科):

In Bayesian statistical inference, a prior probability distribution, often simply called the prior, of an uncertain quantity is the probability distribution that would express one's beliefs about this quantity before some evidence is taken into account.

翻译:在贝叶斯统计推断论中,一个未确定数目的先验概率分布(一般简称为先验)是一种表达了某人对于该数目的信仰的一种概率分布,这种信仰是没有考虑到一些(当前的)证据的。

解释:通俗来说,对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。

举例来说,假如你考试没及格,老师要求大家拿卷子回家给爸妈签字,按照你已有的对爸妈脾气的了解,以及他们对自己成绩的要求,你在不考虑其它任何因素的情况下,自己已经有了一个对把卷子拿回家给他们签字的后果预估(先验):

  • 被胖揍一顿:70%
  • 被简单地数落一下:20%
  • 被温情地鼓励:10%

暂停,让我们再来看看后验概率是什么:

In Bayesian statistics, the posterior probability of a random event or an uncertain proposition is the conditional probability that is assigned after the relevant evidence or background is taken into account.  "Posterior", in this context, means after taking into account the relevant evidence related to the particular case being examined.

翻译:在贝叶斯推断中,一个随机事件的后验概率是指:当与事件相关的一些证据或背景也被考虑进来时的条件概率。“后验”在这个语境下即指的是在考虑了与要被检验的特定事件相关的证据。

所以后验概率就是在先验概率的基础上加了一层“考虑”:结合我们已有的知识,将与待检验事件(即我们正在估计概率的随机事件)相关的因素也考虑进去后,我们队随机事件的概率的预估。

回到卷子签字的例子。

假设,你惶恐地拿着卷子回到家中,还没开口说考试的事,就看到爸爸妈妈在那儿雀跃,好似疯了一样。你一问,他们告诉你说家里中了1亿的大奖,以后就直接过上荣华富贵的生活啦!

这时,你小眼珠子一转,根据当前家里中了亿元大奖的情况,对把不及格试卷给爸妈签字的后果有了新的预估(后验):

  • 被胖揍一顿:0%
  • 被简单地数落一下:0%
  • 被温情地鼓励:100%

没错,因为你觉得按现在家里的情况来看,爸妈会觉得你这一次考试没及格算个屁,以后直接花钱把你送到国外去留学,回来继承家产就是了,什么考试啥的见鬼去吧~~

这就是先验概率和后验概率的区别:先验概率基于已有知识对随机事件进行概率预估,但不考虑任何相关因素(P(c))。后验概率基于已有知识对随机事件进行概率预估,并考虑相关因素(P(c|x))。

贝叶斯定理(Bayesian Theorem)

贝叶斯定义(摘自维基百科):

In probability theory and statistics, Bayes’ theorem (alternatively Bayes’ law or Bayes' rule) describes the probability of an event, based on prior knowledge of conditions that might be related to the event. For example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more accurately assess the probability that they have cancer, compared to the assessment of the probability of cancer made without knowledge of the person's age.

翻译:在概率论与统计学中,贝叶斯定理(或称贝叶斯法则、贝叶斯规则)描述了一个事件的可能性,这个可能性是基于了预先对于一些与该事件相关的情况的知识。举例来说,如果癌症和年龄有关,那么使用贝叶斯定理的话,相比根本不了解关于此人的任何其他信息,知道了它的年龄的话就可以用来更准确地帮助评估它得癌症与否的概率。

那么其实很明显了,这里的“可能性”也是考虑了与随机事件相关的因素的,所以贝叶斯定理所阐述的也就是后验概率的获得方法

用数学公式来表述贝叶斯定理:

$$P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(x,c)}{P(x)}$$

c表示的是随机事件发生的一种情况。x表示的就是证据(evidence)\状况(condition),泛指与随机事件相关的因素。

  • P(c|x):在x的条件下,随机事件出现c情况的概率。(后验概率)
  • P(c):(不考虑相关因素)随机事件出现c情况的概率。(先验概率)
  • P(x|c):在已知事件出现c情况的条件下,条件x出现的概率。(后验概率)
  • P(x):x出现的概率。(先验概率)

那么,落实到实际的问题当中,我们想获得的核心结果其实也就是P(c|x),即我们想知道,在考虑了一些现有的因素后,随机事件会以多大概率出现各种情况,通过参考这个结果,我们针对性地作出决策。

而从计算上来说,我们需要同时知道P(c),P(x|c)和P(x)才能算出目标值P(c|x),而P(x)由于是c无关,而且作为共同的分母,在我们计算c的各种取值的可能性时并不会对各结果的相对大小产生影响。因此可以忽略。

比如c可取值$c_1,c_2,c_3$,并假设已知$$p(c_1)=o,p(c_2)=p,p(c_3)=q,P(x|c_1)=a,P(x|c_2)=b,P(x|c_3)=c,p(x)=m$$,那么最后计算p(c|x)时,分别会得到结果$$p(c_1|x)=\frac{oa}{m},p(c_2|x)=\frac{pb}{m},p(c_3|x)=\frac{q*c}{m}$$,由于$p(c_1|x)+p(c_2|x)+p(c_3|x)$的和一定为1,固我们可以得到$oa+pb+qc=m$,而即使m的值预先不知道也没关系,因为oa,pb,qc的值都是可以计算出来的,m自然也就得到了。

那么,略掉了P(x)后,最后难点也就落在了计算P(x|c)与P(c)上,而这两个概率分布是必须要通过我们手上有的数据集来进行估计的。

朴素贝叶斯分类器

何为“朴素”:属性条件独立性假设

上面讲到,为了获得$p(c|x)$,我们的计算任务最终落脚到了获得P(x|c)和P(c)上。

假设我们有了一个数据集D,那么p(c)的获得其实也较为简单:计算D中c的各个情况出现的频率即可。比如计算$P(c_1)$,直接用$c_1$情况出现次数在所有情况中所占的比例值即可。(这里用到了大数定律:当训练集包含充足的独立同分布样本时,P(c)可通过各类样本出现的频率来进行估计。)

而获得p(x|c)就略显困难,因为x往往包含多个相关因素(是一个多种因素构成的向量),即它可能有多个需要考虑的属性值:

$$x=(x_1,x_2,x_3,...,x_n)$$

任一$x_i$都代表了所有相关因素中的其中一个。在癌症辅助判断中,它可能是患者的年龄,也可能是患者的性别,也可能是患者是否吸烟等等。因此当x是一个向量时,我们若要计算P(x|c),实际上就是要计算$P(x_1,x_2,x_3,...,x_n|c)$。这个理论上也是可以利用我们的数据集D来进行估计的,但是现实情况是,n的值往往非常大(属性非常多),而我们的数据集往往不能保证我们的样本包含了属性值的所有可能组合(假设每个属性都是二值属性,那么就有$2^n$种属性组合)。那么很多p(x|c)我们估计得到的值就是0。然而这些样本很可能仅仅是我们的数据集中没包含到,即“未被观测到”,但不代表它们现实中“出现概率为0”。于是这就给我们计算出真实合理的目标p(c|x)值造成了障碍。

于是,朴素贝叶斯的“朴素”就发挥作用了。

“朴素”是什么,就是“拿衣服”(naive)!就是很幼稚!为什么幼稚,因为我们为了能够获得合理的p(x|c)的值,采用了“很不科学”的属性条件独立性假设

这个假设用公式表达式这样的:

$$P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(c)}{P(x)}\Pi_{i=1}^dP(x_i|c)$$

解释一下:公式的靠左边等式使我们熟悉的贝叶斯定理的公式,而右边新加的一个式子是将P(x|c)(条件联合概率)表达成了$\Pi_{i=1}^dP(x_i|c)$(多个条件概率的相乘)。用俗话说,这个假设认为每个属性取它的各个值的可能性是独立的,与其它属性的取值不相关

这个假设乍看起来没什么问题,但举个例子你可能就会明白它为了简化问题有多么简单粗暴(naive):还是癌症诊断的例子,假设有两个属性$x_1$:患者性别,$x_2$:患者是否吸烟,那么现实情况下来看,如果我们某个患者吸烟,我们较大概率下会判定这应该是一名男性对吧(一般认为吸烟的男性比较多)?但是属性条件独立性假设认为,吸烟和性别的取值没关系!即不管患者吸不吸烟,这与患者的性别可能性没有一点关系,患者的性别可能性仍然是男(50%)和女(50%)。

因此,属性条件独立性假设实际上是忽略掉了某些属性之间可能存在的关联,假设属性的取值可能性都是独立的,以简化$P(x_1,x_2,x_3,...,x_n|c)$的计算为$\Pi_{i=1}^dP(x_i|c)=P(x_1|c)P(x_2|c)P(x_3|c)...P(x_n|c)$。那么按照这种方式计算,我们前面谈到的“数据集无法覆盖所有可能的属性组合的样本”问题也就基本解决了,因为根本不需要有那么多样本,保证每个属性的各个取值都能有样本取到过就行了。

但是,由于朴素贝叶斯分类器在这种naive的假设下仍能在实际问题中取得比较好的效果,因此这个假设的不合理性也就可以暂时放下不谈了。

分类准则

分类准则用公式表达如下:

$$h_{nb}(x)=argmax_{c\in y} P(c)\Pi_{i=1}^dP(x_i|c)$$

$h_{nb}$代表一个由naive bayesian(nb)算法训练出来的hypothesis(假设),它的值就是贝叶斯分类器对于给定x的因素下,最可能出现的情况c。y是c的取值集合。

解释一下:等式右边的式子就是argmax加上基于属性条件独立性假设的贝叶斯定理的分子部分(分母P(x)前面提到过,可以在计算中略去),即我们的输出值就是这样的一个c,这个c使得$P(c)\Pi_{i=1}^dP(x_i|c)$的计算结果值最大。

离散属性与连续属性值的分别处理

在估计条件概率$P(x_i|c)$时,若$x_i$为离散值属性,那么我们只需计算每个属性取值占所有样本的数量比例就行了:

$$P(x_i|c)=\frac{|D_{c,x_i}|}{|D_c|}$$

$D_c$表示训练集D中第c类样本组成的集合,外加两条竖线表示的是集合的元素数量。$D_{c,x_i}$表示的是$D_c$中在第i个属性值上取值为$x_i$的样本组成的集合。

但是如果$x_i$是连续值属性,那么我们就肯定不能这样做了,而是得用概率密度函数,即假定$p(s_i|c)\sim N(\mu_{c,i},\sigma2_{c,i})$,其中$\mu_{c,i}和\sigma2_{c,i}$分别是第c类样本在第i个属性上取值的均值和方差,则有:

$$p(x_i|c)=\frac{1}{\sqrt{2\pi}\sigma_{c,i}}exp(-\frac{(x_i-\mu_{c,i})2}{2\sigma2_{c,i}})$$

到这里我们已经基本上可以用朴素贝叶斯分类器来做一些实际的尝试了。接下来,我们根据一个西瓜书上的实例来看一下具体的应用步骤。

例子讲解

假设我们的任务是根据一个西瓜的特征来在它被吃之前判断它是否是个好瓜。现在我们有以下数据集:

现在,基于已有的数据,我们想利用朴素贝叶斯算法训练出一个分类器,以判断一个具有特征{色泽=青绿,根蒂=蜷缩,敲声=浊响,纹理=清晰,脐部=凹陷,触感=硬滑,密度=0.697,含糖率=0.460}的测试样例瓜($x_{test}$)是否为好瓜。

那么,首先我们估计先验概率P(c),显然有:

$$P(好瓜=是)=\frac{8}{17}\approx 0.471$$

$$P(好瓜=否)=\frac{9}{17}\approx 0.529$$

其次,我们计算每个属性值的条件概率$P(x_i|c)$:

对于离散值属性:

对于连续值属性:

最后,我们计算测试瓜$x_{test}$分别属于好瓜和坏瓜的概率:

很明显,测试瓜是好瓜的概率0.038远大于测试瓜是坏瓜的概率6.80×$10^{-5}$,于是分类器判断测试瓜为好瓜。

拉普拉斯修正(Laplacian correction)

朴素贝叶斯分类器在实际使用中还需要注意的一个问题是:若某个离散类型的属性值在训练集中没有与某个类同时出现过,那么当我们使用$p(x_i|c)=\frac{|D_{c,x_i}|}{|D_c|}$对其进行估计时,$p(x_i|c)$会等于0,而若某个样本只是在属性i上恰好取值为$x_i$,但是它其它的属性非常符合这个类型c的特征,于是在用最后的连乘式计算该样本属于该类的概率时,不管其它的属性如何取值,就会因为$p(x_i|c)$这一个零值导致分类器认为该样本属于这个类型c的概率为0,这显然是不合理的。

比如在上面的西瓜训练集中,好瓜当中暂时没有具备特征{敲声=清脆}的样本,于是对于一个“敲声=清脆”的测试例:

$$P_{清脆|是}=P(敲声=清脆|好瓜=是)=\frac{0}{8}=0$$

那么,不管该测试瓜在其它属性上有多么接近好瓜,都会被直接判定为是好瓜的概率为0。

这个问题本质上是由于我们的训练集不够完整,没有包括足够多的样本。但是,为了避免这个问题的出现,我们通常还是在估计概率值时,对其进行“平滑”(smoothing)操作,通常使用“拉普拉斯修正”(Laplacian correction)。

具体做法是:令N表示训练集D中可能的类别数,$N_i$表示第i个属性可能的取值数,那么我们估计$类别概率值的P(c)和离散属性条件概率的P(x_i|c)$的两个式子分别被调整为:

$$\hat{P}(c)=\frac{|D_c|+1}{|D|+N},$$

$$\hat{P}(x_i|c)=\frac{|D_{c, x_i}|+1}{|D_c|+N_i}$$

即,我们在分母上都加上取值的可能性个数,分子上都加1,这就保证了即使是存在某个属性i的取值$x_i$未曾与类别$c_i$同时出现过,我们也不会把其概率$P(x_i|c)$算成0.

那么在上面的西瓜数据集中,使用拉普拉斯修正后,对于类别概率就有:

对于具备特征{敲声=清脆}的测试瓜就有:

朴素贝叶斯分类器(Naive Bayesian Classifier)的更多相关文章

  1. 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes

    贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种, ...

  2. 十大经典数据挖掘算法(9) 朴素贝叶斯分类器 Naive Bayes

    贝叶斯分类器 贝叶斯分类分类原则是一个对象的通过先验概率.贝叶斯后验概率公式后计算,也就是说,该对象属于一类的概率.选择具有最大后验概率的类作为对象的类属.现在更多的研究贝叶斯分类器,有四个,每间:N ...

  3. 分类算法之朴素贝叶斯分类(Naive Bayesian Classification)

    1.什么是分类 分类是一种重要的数据分析形式,它提取刻画重要数据类的模型.这种模型称为分类器,预测分类的(离散的,无序的)类标号.例如医生对病人进行诊断是一个典型的分类过程,医生不是一眼就看出病人得了 ...

  4. 机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)

    朴素贝叶斯分类器是一组简单快速的分类算法.网上已经有很多文章介绍,比如这篇写得比较好:https://blog.csdn.net/sinat_36246371/article/details/6014 ...

  5. 朴素贝叶斯分类器的应用 Naive Bayes classifier

    一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒  打喷嚏 农夫 过敏  头痛 建筑工 ...

  6. PGM学习之三 朴素贝叶斯分类器(Naive Bayes Classifier)

    介绍朴素贝叶斯分类器的文章已经很多了.本文的目的是通过基本概念和微小实例的复述,巩固对于朴素贝叶斯分类器的理解. 一 朴素贝叶斯分类器基础回顾 朴素贝叶斯分类器基于贝叶斯定义,特别适用于输入数据维数较 ...

  7. 朴素贝叶斯分类器(Naive Bayes)

    1. 贝叶斯定理 如果有两个事件,事件A和事件B.已知事件A发生的概率为p(A),事件B发生的概率为P(B),事件A发生的前提下.事件B发生的概率为p(B|A),事件B发生的前提下.事件A发生的概率为 ...

  8. (数据科学学习手札30)朴素贝叶斯分类器的原理详解&Python与R实现

    一.简介 要介绍朴素贝叶斯(naive bayes)分类器,就不得不先介绍贝叶斯决策论的相关理论: 贝叶斯决策论(bayesian decision theory)是概率框架下实施决策的基本方法.对分 ...

  9. 朴素贝叶斯(Naive Bayesian)

    简介 Naive Bayesian算法 也叫朴素贝叶斯算法(或者称为傻瓜式贝叶斯分类) 朴素(傻瓜):特征条件独立假设 贝叶斯:基于贝叶斯定理 这个算法确实十分朴素(傻瓜),属于监督学习,它是一个常用 ...

随机推荐

  1. Gnome Ubuntu16安装Nvidia显卡396驱动,CUDA9.2以及cudnn9.2

    深度学习环境配置,安装Nvidia显卡驱动,CUDA以及cudnn OS:ubuntu 16.04;driver: nvidia 396;CUDA: 9.2cudnn: 9.2 卸载原有Nvidia驱 ...

  2. 给你的Kubernetes集群建一个只读账户(防止高管。。。后)

    给你的Kubernetes集群建一个只读账户 需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业 ...

  3. RTMP协议推流交互流程

    目录 RTMP协议推流交互流程 RTMP协议推流流程 RTMP握手 RTMP建立连接 RTMP建流&Play Wireshark抓个RTMP流 RTMP协议推流交互流程 想了解下直播常见协议R ...

  4. 关于地址栏url的一些小结

    1.获取整个地址栏地址 //获取整个地址栏地址 var href = window.location.href; console.log(href); 以上代码就是获取整个url地址 2.获取url协 ...

  5. 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZRjGGy 可交互视频 此视频是可 ...

  6. python数据分析工具 | numpy

    Python中没有提供数组功能,虽然列表可以完成基本的数组功能,但并不是真正的数组,而且在数据量较大时,使用列表的速度回非常慢.因此,Numpy提供了真正的数组功能,以及对数据进行快速处理的函数.Nu ...

  7. Python知识点 - Xpath提取某个标签,需要转换为HTML。

        # lxml转Html from lxml import etree from HTMLParser import HTMLParser def lxml_to_html(text:etree ...

  8. SpringBoot1.5.10.RELEASE项目如何在tomcat容器中运行

    一. SpringBoot内嵌容器的部署方式 SpringBoot内部默认提供内嵌的tomcat容器,所以可以直接打成jar包,丢到服务器上的任何一个目录,然后在当前目录下执行java -jar de ...

  9. 负载均衡框架 ribbon 一

    Ribbon开源地址:https://github.com/Netflix/ribbon/wiki/Getting-Started 1.Ribbon简介 负载均衡框架,支持可插拔式的负载均衡规则 支持 ...

  10. aosp Pixel 修改 SIM 卡支持及解决网络带x问题

    去除网络X的方法 adb shell settings put global captive_portal_https_url http://g.cn/generate_204 自己用 php 做一个 ...