贝叶斯分类器算法原理

目录

1.1,什么是朴素贝叶斯

1.2,极大似然估计

1.3,朴素贝叶斯分类器

1.4,朴素贝叶斯算法就程

1.5,朴素贝叶斯的优缺点


1.1,什么是朴素贝叶斯

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(x),要么是决策条件分布P(Y|X),但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后由P(Y|X)=\frac{P(X,Y)}{P(X)}得出分类的结果。

贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法,对于分类问题来说,基于贝叶斯的分类器都是在概率已知的理想情况下,贝叶斯决策论考虑如何基于概率和误判损失来标记数据的类别,朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 x ,利用贝叶斯定理求出后验概率最大的输出 y

假设有N种可能的类别标记,即y={c_{1},c_{2}.........c_{N}}\lambda _{ij}是将一个真实标记为c_{j}的样本误分类为c_{i}所产生的损失,基于后验概率P(c^{i}|x)可以获得将样本x分类为c_{i}所产生的期望损失,也即是在样本x上面的“条件风险”。(在这里的后验概率可以这样理解:在已知西瓜颜色,根蒂等的情况下,将此西瓜分类为c_{j}的条件概率)。

  • 条件风险R(c_{i}|x)=\sum_{j=1}^{N}\lambda _{ij}p(c_{j}|x),这是将一个西瓜样本分类错误的条件风险。对于所有的数据样本集,我们的目标是想要最小化样本数据集的总体风险。
  • 样本集总体的风险R(h)=E_{x}[R(h(x)|x)],也就是条件风险的期望值。

那么对于每一个样本数据集的条件风险,如果我们使得每一个样本的风险都达到最小化,那么我们的总体风险也必然是最小的,也就是R(h)最小化,那么这就产生了贝叶斯判定准则:为了最小化总体的风险,只需要在每一个样本上选择哪个能使条件风险R(c|x)最小的类别标记:h^{*}(x)=argminR(c|x)h^{*}(x)被称为我们最优的贝叶斯分类器,与之对应的总体风险R(h^{*})被称为贝叶斯风险,1-R(h^{*})可以反映分类器所能达到的最好的性能。

现在假设我们的误判损失\lambda _{ij}可以写成如下形式:\lambda _{ij}=0,i=j;\lambda _{ij}=1,i\not\equiv j,,现在我们对于数据集的总体样本的条件风险可以写为:R(c|x)=1-p(c|x),这个式子是根据我们单个样本的条件风险得来的。(证明过程如下)

但是现在不要忘记,在我们目前所做的工作上,我们都是假设所有的概率都是已知的情况,但是现实的数据集特征很多,并且对于每一个特征,里面的取值也很多,所以我们要取得后验概率p(c|x)很难计算出来。计算后验概率有两种方式,第一种是对于给定的数据集,我们可以直接通过建模p(c|x)来直接的预测我们的标签类别c,这种预测方式称为判别式,另外一种是先对联合概率p(x|c)进行建模,然后由此来获得我们的后验概率p(c|x),这种预测方式称为生成式模型。对于生成式模型,我们必然要考虑:

  • 条件概率p(c|x)=\frac{p(x,c)}{p(x)}=\frac{p(xc)}{p(c)}
  • 贝叶斯定理p(c|x)也可以写为:p(c|x)=\frac{p(c)p(x|c)}{p(x)}

其中p(c)称为先验概率,可以根据我们的数据集通过频率来直接计算出来,比如西瓜的好和坏,我们可以通过统计个数进行统计出来,p(x|c)是样本x相对于类标记c条件下的类条件概率,比如我现在确定我们的西瓜是好瓜的前提下,那么我们西瓜的颜色是青绿色的概率,p(x)与我们的类别标记无关,因此估计p(c|x)的问题最后就被我们转化为基于训练的数据集估计先验概率和条件概率p(x|c)的问题。(先验概率,根据我们的大数定律,在样本数据集很多的情况下,我们可以使用频率进行估计),但是对于我们的后验概率,由于我们的样本有很多的特征,每一个特征对应于很多的取值,但是在每一个取值的样本对应的数量可能不是很多,所以我们此时不能使用频率进行估计。下面介绍如何估计我们的条件概率。

1.2,极大似然估计

估计类条件概率,一种常用的策略是先假设数据集具有某一种概率分布,在基于训练的样本对概率分布的参数进行估计,关于类别c的类条件概率是p(x|c),假设p(x|c)具有确定的形式并且被参数向量\theta _{c}唯一确定,那么我们的任务就是利用训练集D估计参数\theta _{c}

D_{c}标示训练集D中第c类样本组成的集合,假设样本是独立同分布的,那么估计参数\theta _{c}对于数据集D_{c}的似然是:

P(D_{c}|\theta _{c})=\prod p(x|\theta _{c}),之所以采用连乘,是因为假设我们各个样本之间式相互独立的。现在我们要对\theta _{c}进行似然估计,就是要寻找能最大化似然函数的的参数值\theta _{c}。数据计算过程中,可能造成数据产生下溢,所以我们常常采用对数似然。LL(\theta _{c})=logP(D_{c}|\theta _{c})=\sum log(P(x|\theta _{c})),此时参数\theta _{c}的极大似然估计是:\theta _{c}=argmaxLL(\theta _{c}),通过极大似然估计,我们可以求得样本的均值和方差,然后对于连续性属性,我们可以直接带入公式求得概率。

1.3,朴素贝叶斯分类器

  • 基于贝叶斯公式p(c|x)=\frac{p(c)p(x|c)}{p(x)}来估计后验概率p(c|x)的困难在于类条件概率p(x|c)是所有属性的联合概率,很难从有限的训练数据集上直接获得,所以朴素贝叶斯采用了“属性条件的独立性假设”来估计,也就是对于所有的属性,假设为相互的独立,不对分类的结果产生任何的影响。基于属性独立性假设,:
  • P(c|x)=\frac{p(c)p(x|c)}{px}=\frac{p(c)}{p(x)}\prod_{i=1}^{d}p(x_{i}|c),其中d标示属性的个数,x_{i}x在第i个属性上面的取值。对于所有的类别来说,p(x)是相同的,我们的最小化分类错误率的贝叶斯最优分类器可以表示为:h_{nb}(x)=argmaxP(c)\prod_{i=1}^{d}p(x_{i}|c)。朴素贝叶斯的训练过程就是基于训练数据集,先根据大数定律估算先验概率,在为每一个属性估算条件概率。
  • D_{c}表示训练集D中第c类样本组成的集合(c其实就是代表我们的每一种类别),如果样本足够充分,那么我们的先验概率可以表示为:p(c)=\frac{|D|}{|D_{c}|},对于离散的属性而言,让D_{c,xi}表示D_{c}中在第i个属性上取值为x_{i}的样本组成的集合,我们可以表示出后验概率:p(x_{i}|c)=\frac{|D_{c,xi}|}{|D_{c}|},如果是对于连续性数值,我们可以考虑密度函数,假定p(x_{i}|c)~N(\mu _{c,i},\sigma _{c,i}^{2}),其中的\mu _{c,i}\sigma _{c,i}^{2}代表第c类样本在第i个属性上面的均值和方差。p(x_{i}|c)=\frac{1}{\sqrt{2\pi }\sigma _{c,i}}exp(-\frac{(x_{i}-\mu _{c,i})^{2}}{2\sigma _{c,i}^{2}})

特别注意,如果某个属性的值在训练数据集中没有与某一个类同时出现过,根据我们上面的条件概率估计,会出现概率为0的情况,因此无论该样本的其他属性的情况是什么样,结果可能都不是很合理,为了避免这种情况,在我们估计概率的值的时候,通常要进行平滑处理,常用拉普拉斯修正的方法,令N标示训练集D中可能出现的类别数目,N_{i}标示第i个属性可能的取值数,因此我们的先验概率和后验概率被标示为:

  • 先验概率:P(c)=\frac{|D_{c}|+1}{|D|+N},对于我们某一种类别,令其样本的个数+1,但是对于总体的样本,每一个分类都要+1,也就是分母需要加N,这个N就代表分类的个数。
  • 条件概率:p(x_{i}|c)=\frac{|D_{c,xi}|+1}{|D_{c}|+N_{i}},在这里分母上加的也是第i个属性的分类的总数量。

1.4,朴素贝叶斯算法就程

我们假设训练的数据集有m个样本和n个维度,一共有k个特征的输出类别,分别是c_{1},c_{2}......c_{k},每一个特征输出的类别的样本个数为m_{1},m_{2}......m_{k},在第k个类别中,如果是离散的特征,那么特征x_{j}各个类别的取值为m_{kjl}l取值为1,2,3....s_{j}s_{j}为特征j不同的取值数。算法输出为样本集xtest的分类结果。

算法流程:

  • 如果没有先验概率,那么就先计算yk个先验概率。p(y=c_{k})=\frac{m_{k}+\lambda }{mK+\lambda },否则p(y=c_{k})输出为先验概率。
  • 分别计算第k个类别的第j维特征的第l个取值的条件概率。p(x_{j}=x_{jl}|Y=C_{K})
    • 如果是离散值,p(x_{j}=x_{jl}|Y=C_{K})=\frac{m_{kjl+\lambda }}{m_{k}+S_{j}\lambda }\lambda可以取值为1或者其他大于0的数字。
    • 如果是稀疏二项离散值,P(x_{j}=x_{jl}|Y=C_{k})=P(j|Y=c_{k})x_{jl}+(1-P(j|Y=c_{k}))(1-x_{jl}),此时l只有两种取值。
    • 入过是连续值不需要计算各个l的取值概率,直接求正态分布的参数。p(x_{i}|c)=\frac{1}{\sqrt{2\pi }\sigma _{c,i}}exp(-\frac{(x_{i}-\mu _{c,i})^{2}}{2\sigma _{c,i}^{2}}),需要求出\mu _{c,i}\sigma _{c,i}^{2},这两个量分别代表均值和方差。
    • 对于数据集xtest,分别计算p(y=c_{k})\prod_{j=1}^{n}p(X_{j}=x_{jtest}|y=c_{k})的概率。
    • 最后确定数据集的分类结果,C_{result}=argmaxP(y=c_{k})\prod_{j=1}^{n}P(X_{j}=x_{jtest}|y=c_{k}).
    • 在整个的计算过程中,没有复杂的矩阵运算,所以贝叶斯算法运算速度很快。

1.5,朴素贝叶斯的优缺点

优点:

  • 在较少数据集的情况下仍然可以处理数据,可以处理多分类问题。
  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  • 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

缺点:

  • 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  • 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  • 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
  • 对输入数据的表达形式很敏感。

参考资料:

[1]《机器学习》周志华著

[2] https://www.cnblogs.com/pinard/p/6069267.html

[3] https://www.cnblogs.com/pinard/p/6069267.html

 

  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值