前言

  贝叶斯决策可能在相关机器学习或数据挖掘或专家系统中有着广泛的应用,故其地位也相当重要;比如在垃圾邮件的过滤、钓鱼邮件的判定、垃圾(钓鱼)短信过滤等场合的应用就相当多(因为笔者较多地从事这些工作),或者可以说上述这些应用其实其主要方法就是使用了贝叶斯方法(当然也可以混合使用其它方法,比如支持向量机);在信息安全中,贝叶斯决策就是一个二分类问题(即是存在恶意或不存在恶意),而应用在其它场合肯定还存在多分类的问题,当然本文主要讨论的是其通用方法,所以是建立在多分类的基础上,或者说我们讨论的是贝叶斯分类。

  贝叶斯决策与另外一个被称作贝叶斯网络的东西有一定联系,因为它们都是基于贝叶斯方法,而不是什么其它的方法,但后者的应用场合主要是:

  1. 原因诊断:即求在网络中子节点发生某一状况时,父节点发生的可能性;

  2. 因果预测:这个和上述情况相反,即求在父节点发生某种状况时子节点发生的可能性;

  3. 解释远离:即当影响到结果(子节点)的原因多于一个时,结果与其中一个原因发生的条件下,另一个或几个原因不发生的可能性。

  所以通过上面的表述可以看出,贝叶斯决策和贝叶斯网络(又被称为信念网络,即Belief Network,稍作改变就成为深度信念网络,即DBN)的应用场景有着显著的不同,而且它们训练的方法也存在差异,后者一般使用蒙特卡洛方法(准确地说是MCMC方法,即对各随机变量依次进行抽样)训练,本文并不涉及任何有关贝叶斯网络的内容,特此说明。

预备知识

  从以前一般机器学习的套路看,我们总是给出一个目标函数,然后对其进行最大化(也有可能最小化,比如加一个负号,或者其它对偶的处理方式,如分子变分母或者应用相反的操作,这个在支持向量机的推导中会被应用到),但我们之前最常用的方法、或者说几乎是唯一的方法就是使用最大似然估计(当然目标中含有参数需要确定,如果是基于无参的方法,比如山峰聚类,则不然),那么还有什么其它方法?或者说最大似然估计可能还存在什么解决不了或不完全适用的问题?

  回答是肯定的,因为我们在用大量样本求解目标函数的最优解过程中,可能存在一个蛮自然的想法就是这些个被求解的参数(比如高斯分布中的均值、方差,多项式分布中的各个类的抽样概率)是不是可能也满足某种分布?而且确实人们在认识某事物的时候,开始可能有个先验的概念,但随着慢慢地深入下去,认识也可能在慢慢地改变(难道这个是辩证法的具体体现?),故讨论参数的分布状况也就成为必然,而这种对参数分布进行研究和估计的方法就被称作贝叶斯估计,本节主要讨论两种贝叶斯估计方法,其一是基于高斯密度的贝叶斯估计,而另外一个则是n元多项分布的贝叶斯估计,它们将成为我们具体讨论贝叶斯决策(其实是朴素贝叶斯)的实现工具(主要是后者)。

           先给出相关贝叶斯估计的基础公式:

d8291ef46f05e1786bd6219ebb985129.png-wh_

   我们的目标就是要最大化公式1,通过观察可以发现,其实它和之前使用的最大似然估计只是多了一个对参数分布的概率,而spacer.gif则是参数初始的状态,明白了这一点那么理解下面的推导就不是非常困难了,仅仅是又繁琐了一点。

高斯密度的贝叶斯估计

   在基于高斯密度的贝叶斯估计中,我们设定参数的分布如下式:

 0c72628d84b893b9008e012f5f661a11.png-wh_

   如果读者熟悉最大似然估计的公式,可以比较一下上述公式与其区别,其实也就是均值的估计形式(在最大似然估计中,均值就是简单的求和并除以样本数量而已)不太一样,而对于方差参数的估计是一模一样的。

  至此我们已经讨论完了基于高斯密度函数的贝叶斯估计。

n元多项式的贝叶斯估计

   那么对于n元多项式的贝叶斯估计有什么不同呢?或者换言之,在n元多项式中,参数指的是什么?先给出n元多项式的概率分布公式(实际上是样本的概率分布,而参数的分布有点不同):

ba9ac3b9a62feff41270be6549e5016f.png-wh_


   这个是什么意思?我们假定x只能取1,2,...,c其中之一,而spacer.gif就是相关参数(即取每个值的概率,显然它们的和等于1),它的指数部分只能取0或者1,而且取01之间是互斥的,换言之就是spacer.gif,另外还有如下的约束:spacer.gif

              根据公式1和公式7,我们可以得出n元多项式的贝叶斯估计的目标函数(好拗口):

863112988870ca9c5535412ee5f616e0.png-wh_


    对于上述公式而言,可能乘积的第一部分(被标为红色)有点疑惑,其实它就是狄利克雷分布(一个被称作“分布的分布”的神奇的分布,它和多项式分布有着天然的关系,可以理解它就是伯努利分布的多值情况推广,一种较为通用的分布表达形式,相关内容可以参看网上的介绍,这里不再啰嗦;Gamma里面的参数是希腊字母Alpha,不是英文字母a)。

    按照老办法,我们对公式8取对数可得如下公式:

598afb740c26ee9f5215cbe0ae481334.png-wh_


贝叶斯决策

一个例子

   在讨论贝叶斯决策之前,为了直观起见我们先看一个例子(笔者也无意多找其它的样例,这个例子就是来自于于剑的《机器学习:从公理到算法》一书,能简单明了地说明问题即可),下表是一个名词性数据集,每个样本包含5个特征和一个样本类别标记:

 

  1. 特征F1的取值范围为{s,o,r}

  2. 特征F2的取值范围为{h,m,c}

  3. 特征F3的取值范围为{h,n}

  4. 特征F4的取值范围为{t,f}

  5. 特征F5的取值范围为{d,r}

 

 而每个样本被分为L1L2两个类别。

 现我们有20个样本,其各个特征的取值和分类情况,如下表所示:

 

序号

F1

F2

F3

F4

F5

类别

1

s

h

h

f

d

L2

2

s

h

h

t

d

L2

3

o

h

h

f

d

L1

4

r

m

h

f

d

L1

5

r

c

n

f

d

L1

6

r

c

n

t

d

L2

7

o

c

n

t

d

L1

8

s

m

h

f

d

L2

9

s

c

n

f

d

L1

10

r

m

n

f

d

L1

11

s

m

n

t

r

L1

12

o

m

h

t

r

L1

13

o

h

n

f

r

L1

14

r

m

h

t

r

L2

15

r

m

n

f

r

L1

16

s

m

n

t

r

L1

17

o

m

h

t

r

L1

18

o

h

n

f

r

L1

19

r

m

h

t

r

L2

20

r

c

n

t

r

L2

 

  如果需要计算新的样本x={s,m,h,t,d}的分类,那么该如何利用上表中给出的样例进行划分?

  根据上表我们可以得到如下若干个条件概率(暂使用xi来表示样本x的第i个特征),以下是关于各个特征取值其被划分为类别L1的分布情况:

 

P((x)1=s|L1)=3/13            P((x)1=o|L1)=6/13            P((x)1=r|L1)=4/13   

P((x)2=h|L1)=3/13            P((x)2=m|L1)=7/13 

P((x)2=c|L1)=3/13

p((x)3=h|L1)=4/13            P((x)3=n|L1)=9/14   

P((x)4=t|L1)=8/13                P((x)4=f|L1)=5/13

P((x)5=d|L1)=6/13            P((x)5=r|L1)=7/13

 

    而根据上表,我们则也能够得到在各个特征不同取值的情况下,被划分为类别L2的概率:

 

P((x)1=s|L2)=3/7                 P((x)1=o|L2)=0                 P((x)1=r|L2)=4/7

P((x)2=h|L2)=2/7                 P((x)2=m|L2)=3/7             P((x)2=c|L2)=2/7

p((x)3=h|L2)=5/7                 P((x)3=n|L2)=2/7   

P((x)4=t|L2)=4/7                P((x)4=f|L2)=3/7

P((x)5=d|L2)=4/7                P((x)5=r|L2)=3/7

 

  需要说明的一点是,上面相关条件分布概率中,被标为红色的一项在原书中是错误的,应该是4/7而不是5/7,否则在特征4在不同取值情况下其被定为类L2的条件概率之和就不是1,这个是不正确的。

   那么现在来看新的样本应该被划分为哪个类别(其实就是计算它被划分为类别L1的概率大还是被划分为L2的概率大),我们有样本被划分为L1的概率:

 

P(L1)*P((x)1=s|L1)*P((x)2=m|L1)*P((x)3=h|L1)*P((x)4=t|L1)*P((x)5=d|L1)=(13/20)*(3/13)*(7/13)*(4/13)*(5/13)*(6/13)=126/(13*13*13*13)

 

   而样本被划分为L2的概率如下:

 

P(L2)*P((x)1=s|L2)*P((x)2=m|L2)*P((x)3=h|L2)*P((x)4=t|L2)*P((x)5=d|L2)=(7/20)*(3/7)*(3/7)*(2/7)*(4/7)*(4/7)=72/(5*7*7*7*7)

 

   同样的原因,上面概率的计算在原书中实际上是错误的(也被标为了红色,供读者进行印证),不过基本不影响计算结果的比较。通过比较上述两个概率大小,我们能够得到结论,x应被划分到类L2。至此我们大致对于贝叶斯决策的原理和分类过程有了一个初步的印象。

   但若给定的样本是x=(o,m,n,t,r),则该如何得到其类标呢?因为其中x的第一个特征取值是o,而在样本中并无此例子(概率是0),故它永远不会被划分为类L2,这个在现实处理中总是存在一定问题,针对这种情况,我们在稍后的部分予以讨论。

贝叶斯决策的最大似然估计

   在本文的前面部分曾经说过,一般而言我们对于相关参数的估计有两种方法,现在本节主要讨论如何利用最大似然估计(可以结合上例)来处理贝叶斯决策问题。

             由最大似然估计的一般理论我们有如下公式:

d1c72b59008b3e190405b94ba2d4fb45.png-wh_


   说实话上述公式比较复杂(可能贝叶斯估计的公式更加复杂),这里有必要解释一下。首先在上式中最外两个连乘符号应无疑义,分别是样本的个数以及样本的分类个数(就是c,这个和预备知识中所涉及的c略微不同,但符合我们其它文章中的相关符号表示);而括号中的两个连乘符号则分别表示在一个样本中,其不同维度(维度为p)的可能取值数量(即对于维度r,其相应维度的可能取值数量最大为spacer.gif个,也就是其集合的范数,这里讨论的是离散情况,如果取值是连续的呢?);另外spacer.gif的含义不用过多介绍了,这个在其它文章中已经不止一次地给出,而spacer.gif又是什么鬼?这个被称作Kronecker函数,其含义为如果括号中的两个值相等则函数值为1,否则为0,解释完毕。

 

             根据公式13,我们可以得到如下的相关公式:

58581e340fab3d76c811d2a08db2840d.png-wh_

    读者可以将公式12和公式13和上节给出的例子进行印证,能够看出确实如此。

贝叶斯决策的贝叶斯估计

               而如果使用贝叶斯估计会有什么不同呢?根据公式1以及公式8给出的结论,我们可以得到如下公式(理解这个公式需要看清楚不同的部分,笔者用了不同的颜色进行标注):

f0582997da2fdb477e30e7d8919b2c90.png-wh_


    这个公式可能是目前最长的,如何理解它?笔者使用了三种不同的颜色来标注,其中绿色和红色的部分实际上就是参数的狄利克雷分布,绿色可以理解为类的分布情况,而红色部分则是每个维度存在不同取值的狄利克雷分布(这个和n元多项式的贝叶斯估计略为不同,原因是我们要处理多维情况),而黑色部分针对的是某个样本被划归为某个类以及对某维度取值的估计,这个部分和最大似然估计没有什么太大区别。

 

              通过对公式14的求解,我们能够得到如下结果:

c50a1ceb0c5694cf5e87aca6d9abe4d5.png-wh_

    其中spacer.gif大于等于0,当其为0时,贝叶斯估计退化为最大似然估计,而其取1时,贝叶斯估计变为拉普拉斯平滑(Laplace Smoothing),使用拉普拉斯平滑的好处在于如果样本集中有某些特征取值为0,那么通过这个变形可以避免其概率为0的情形出现。