生成模型、高斯判别分析、朴素贝叶斯——斯坦福CS229机器学习个人总结(二)

来源:互联网 发布:自我测评软件 编辑:程序博客网 时间:2024/05/16 05:48

1、生成学习算法(Generative Learning Algorithm)

1.1、判别模型与生成模型

判别模型:训练出一个总模型,把新来的样本放到这个总模型中,直接判断这个新样本是猫还是狗。

生成模型:先训练出一个猫的模型,再训练出一个狗的模型。把新来的样本放到猫的模型里,看它生成的概率是多少,再把它放到狗的模型里,看它生成的概率是多少。如果用猫的模型生成的概率比较大,就把新样本判断为猫,如果用狗的模型生成的概率比较大,就把新样本判断为狗。

- 判别模型 生成模型 区别 反映异类数据之间的差异 反映同类数据之间的相似度 形式化 直接对p(yx)建模 对p(xy)建模,再求p(yx) 生产性能 高(直接判断) 低(逐个生成概率并对比) 学习难度 简单,容易学习 复杂,较难学习 转化关系 判别模型不能转化为生成模型 生成模型能转化为判别模型 其他 黑盒,不可视;
能清晰分辨出各类差异特征;
使用范围更广 研究单类问题更灵活;
可以把整个场景描述出来;
要满足特定条件才能使用 常见模型 logistic回归;
SVM;
神经网络等 高斯判别分析;
贝叶斯算法;
隐马尔科夫模型等

1.2、生成模型的一般做法

因为目前还没有做过相关工程,而且本人也还只是处于学习阶段,下面只是一些自己的总结,若有错误的地方,请指正。
判别模型是直接对p(yx)建模进行估计,生成模型是先求p(xy)再求p(yx),它们之间是怎么转换的?
首先引出贝叶斯规则:

p(yx)=p(xy)p(y)p(x)(1)

再配合上联合概率我一般是这么记的,这样就可以随便切来切去不会搞混了:
p(yx)p(x)=p(x,y)=p(xy)p(y)(2)

上面说了,我们需要生成一个猫的模型:
p(y=x)=p(xy=)p(y=)p(x)(3)

再生成一个狗的模型:
p(y=x)=p(xy=)p(y=)p(x)(4)

然后比较是p(y=x)“这个样本是猫的概率”更大,还是p(y=x)“这个样本是狗的概率”更大。
我们可以看到(3)式和(4)式的分母是一样的,就只比较分子的大小,所以问题就变成了是p(xy=)p(y=)更大还是p(xy=)p(y=)更大。
形式化一下就是:
argmaxyp(yx)=argmaxyp(xy)p(y)(5)

p(y),先验概率(Prior),表示:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小”,比如猫或者狗在我们的生活中出现的频率(这个看起来是一样的,但如果是狗和狼,就有p(y=)>p(y=),因为狼比狗更常见);
p(xy),似然性(Likelihood),表示:“这个猜测生成我们观测到的数据的可能性大小”。(如果样本里有一项特征表达出“鼻子较长”这个信息,那么假设样本是猫的同时观察到“鼻子较长”,和假设样本是狗的同时观察到“鼻子较长”的可能性是不一样的,明显后者的可能性更高)

每一个猜测都有属于自己的先验概率p(y=n)与似然性p(xy=n)的乘积,用来对p(y=nx)做估计,表示“同一组输入产生的每个猜测的可能性大小”。
比如同一组数据x,通过对p(y=n)p(xy=n)的建模与计算,产生了p(y=x)p(y=x)p(y=x)三个概率,通过对比这三个概率的大小,选取概率最大的那个猜测作为最终的预测结果,这就是生成模型的一般做法。

2、高斯判别分析(Gaussian Discriminant analysis)

高斯判别分析(GDA)名字中虽然有“判别”二字,却是地地道道的生成算法。

GDA解决的是连续型随机变量的分类问题。

什么是连续型随机变量呢?举两个例子:
公交车15分钟一趟,某人的等车时间x是区间[0,15)中的一个数,x是连续型随机变量,因为x可以取小数甚至无理数。
抛20枚硬币,硬币朝上的数量x只能取0~20之间的整数,不能取0.1,3这样的小数或者无理数,所以这里的x是离散型随机变量。

而且只有连续型随机变量的分布函数可以积分,得到概率密度函数,这样才能用多元高斯分布对p(xy)建模,进而使用高斯判别式啊。

下面给出高斯判别分析的假设:

y~Bernoulli(ϕ)

xy=0~N(μ0,Σ)

xy=1~N(μ1,Σ)

接着给出一个k维向量x,以(μ,Σ)为参数的多元高斯分布原始定义为:
f(x)=12πk|Σ|exp(12(xμ)TΣ1(xμ))(6)

由此可以得到下面的分布(x是n维向量):
p(y)p(xy=0)p(xy=1)=ϕy(1ϕ)1y=12πn|Σ|exp(12(xμ0)TΣ1(xμ0))=12πn|Σ|exp(12(xμ1)TΣ1(xμ1))(7)

这里有先验概率p(y)(因为是伯努利分布,所以y的取值是0或者1),具体猜测的似然性p(xy=0)p(xy=1),在生成模型中,会对p(y=n)p(xy=n)进行计算,分别得到输入x被分类为0与被分类为1的概率,然后再对这两个概率进行比较,取较大的那个最为分类结果。
而这些分布里面一共有ϕ,μ0,μ1,Σ4个参数,如果我们求得了这几个参数,就可以对实际的输入x进行计算了。
进一步地,得到我们的似然函数(m是样本数量):
l(ϕ,μ0,μ1,Σ)=logi=1mp(x(i),y(i);ϕ,μ0,μ1,Σ)=logi=1mp(x(i)y(i);μ0,μ1,Σ)p(y(i);ϕ)(8)

然后通过最大似然估计得到我们的参数:
ϕμ0μ0Σ=1mi=1mI{y(i)=1}=mi=1I{y(i)=0}x(i)mi=1I{y(i)=0}=mi=1I{y(i)=1}x(i)mi=1I{y(i)=1}=1mi=1m(x(i)μ(i)y)(x(i)μ(i)y)T(9)

ϕy的取值是1的样本在整个样本集中的比例;
μ0y的取值是0的特征均值;
μ1y的取值是1的特征均值;
Σ:样本特征方差均值。
下面是讲义里给出的一个分类结果的图:
这里写图片描述

3、朴素贝叶斯(Naive Bayes)

3.1、具体例子-文本分类

GDA针对的是特征向量x是连续值的问题,朴素贝叶斯针对的是特征向量x是 离散值的问题。但是对于特征是连续值的情况,我们也可以采用分段的方法来将连续值转化为离散值:

这里写图片描述

朴素贝叶斯算法的标准应用也是最常见的的应用就是文本分类问题,例如邮件是否为垃圾邮件的分类。

朴素贝叶斯也是生成模型,按照前面提到的生成模型的一般做法,我们应该先计算出一封邮件是垃圾邮件的概率,再计算出这封邮件不是垃圾邮件的概率,取较大的那个概率为分类结果。

对此,我们假设y=1表示分类结果为垃圾邮件,y=0表示分类结果为非垃圾邮件,向量x表示需要判断的邮件本身,它由n个单词组成。

那么,这封邮件是垃圾邮件的概率为:

p(y=1x)=p(xy=1)p(y=1)p(x)=p(xy=1)p(y=1)p(xy=1)p(y=1)+p(xy=0)p(y=0)(10)

同样地,我们可以得到这封邮件不是垃圾邮件的概率为:
p(y=0x)=p(xy=0)p(y=0)p(x)=p(xy=0)p(y=0)p(xy=1)p(y=1)+p(xy=0)p(y=0)(11)

又因为要比较这两者的大小,它们的分母又一样,所以我们只需要比较p(xy=1)p(y=1)p(xy=0)p(y=0)的大小即可得到分类结果。

目前为止都还只是很一般性的推导,朴素贝叶斯体现在哪里?在邮件x上。
前面说到要用向量x来表示一封邮件,具体要怎么表示?然后怎么对上面的一般性式子做进一步的处理?

讲义里给出了两种用向量表示邮件的方法,进而推导出了两种模型,一种称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称NB-MBEM),另一种称为多项式事件模型(Multivariate Event Model,以下简称NB-MEM),下面就对这两个模型进行说明。

3.2、文本表示方法一——多元伯努利事件模型(NB-MBEM)

在多元伯努利模型下(NB-MBEM),一封邮件的特征向量可以表示成如下形式:

x=x1x2x3x4123x50000=10010aaardvarkcononybuyqwerr(12)

在此模型下,向量x是一本词典,它的每一个元素都是一个单词,对于词典中的每一个词都有一个向量中对应的元素xi作为标记,xi的取值为0或者1,1表示邮件中这个词出现过,0表示这个词没有出现过。

接着因为我们要求p(xy),假设x中的特征是条件独立的(条件独立与独立不同),这个称为朴素贝叶斯假设。

P(X,YZ)=P(XZ)P(YZ)(13)

上面的式子表示,在给定Z的情况下,X与Y条件独立。

还要引出链式规则:

P(X1,X2,,Xn)=P(X1)P(X2X1)P(XnX1,X2,,Xn1)(14)

可以看到,当n=2的时候,它的形式跟(2)式是一样的,当n=3的时候,我们可以来推导一下:
P(X1,X2,X3)=P(X3,X1,X2)=P(X3X1,X2)P(X1,X2)=P(X3X1,X2)P(X2,X1)=P(X3X1,X2)P(X2X1)P(X1)=P(X1)P(X2X1)P(X3X1,X2)(15)

这跟式(14)的形式是一致的。

由链式规则与条件独立假设,我们对p(xy)有如下展开:

p(xy)=p(x1,,x50000y)=p(x1y)p(x2y,x1)p(x3y,x1,x2)p(x50000y,x1,,x49999)=p(x1y)p(x2y)p(x3y)p(x50000y)=j=1np(xjy)(16)

这里的xj只能取值为0或者1,所以xjy实际上是一个伯努利分布。

回到我们的式(10)与式(11),我们有(这里省去了分母):

p(y=1x)=p(xy=1)p(y=1)=(j=1np(xj=1y=1))p(y=1)(17)

p(y=0x)=p(xy=0)p(y=0)=(j=1np(xj=1y=0))p(y=0)=(j=1np(xj=1y=0))(1p(y=1))(18)

这样我们就得到了下面的参数:
p(y=1)=ϕy(19)

p(xj=1y=1)=ϕjy=1(20)

p(xj=1y=0)=ϕjy=0(21)

又到了求参数的时间,我们希望模型在训练数据上概率积能达到最大(m为样本数量,n为词典中单词的数量),所以有:
L(ϕy,ϕjy=1,ϕjy=0)=i=1mp(x(i),y(i))=i=1mp(x(i)y(i))p(y(i))=i=1m(j=1np(x(i)jy(i);ϕjy=1,ϕjy=0))p(y(i);ϕy)(22)

对其做最大似然估计就得到了参数值,带入式(17)与式(18)中即可对新样本进行分类:
p(y=1)=ϕy=mi=1I{y(i)=1}m=(23)

p(xj=1y=1)=ϕjy=1=mi=1I{(x(i)j=1)Λ(y(i)=1)}mi=1I{y(i)=1}=j(24)

p(xj=1y=0)=ϕjy=0=mi=1I{(x(i)j=1)Λ(y(i)=0)}mi=1I{y(i)=0}=j(25)

以上就是最基本的朴素贝叶斯方法。

3.3、文本表示方法二——多项式事件模型(NB-MEM)

在上面的在多元伯努利模型(NB-MBEM)下,向量x是一本词典,每个词用0或者1标记,词典里被标记了1的单词组成了我们的邮件(式(12)):

x=x1x2x3x4123x50000=10010aaardvarkcononybuyqwerr

虽然上一节里推导出了这种表示形式下的解法,但是x未免维数太大了,有没有另外的表示方法可以降低x的维度,同时得到类似的效果?
那就是在多项式事件模型(NB-MEM)下,第二种邮件的特征向量表示形式了:
x=x1x2x3x36x125=460003700018000116000theproductisait(26)

向量x在这里不再是一本词典,而是邮件本身,每一个元素都是邮件中的一个单词,对应地,向量x中每个元素的取值不再是0或者1,而是[1,2,,|V|]里的整数(|V|]是词典中单词的个数),表示邮件中某个单词在词典中的位置(比如“the”是词典中的第46000个单词,“a”是第一个单词)

在多项式事件模型(NB-MEM)中,我们假设一封邮件是由随机过程生成的。首先确定这封邮件是垃圾或者非垃圾邮件(p(y)),在此前提下,我们假设邮件中的第一个单词x1是根据多项式分布来确认的(p(x1y)),第二个单词x2在与x1条件独立的情况下,通过同一个多项式分布来确定,再以同样的方式确定x3x4等,直到这封邮件被生成。
所以,同样地,我们对p(xy)展开:

p(xy)=p(x1,,x125y)=p(x1y)p(x2y,x1)p(x3y,x1,x2)p(x125y,x1,,x124)=p(x1y)p(x2y)p(x3y)p(x124y)=j=1np(xjy)(27)

形式上看起来跟式(16)是一样的,但是xjy在这里是多项式分布,不再是伯努利分布。
而且这里n的取值不是再是词典的中单词的个数,而是邮件中单词的个数;同时xj的取值不再是0或者1,而是1~词典中单词的个数|V|

同样地,我们有省去分母的垃圾邮件模型与非垃圾邮件模型:

p(y=1x)=p(xy=1)p(y=1)=(j=1np(xj=ky=1))p(y=1)(28)

p(y=0x)=p(xy=0)p(y=0)=(j=1np(xj=ky=0))p(y=0)=(j=1np(xj=ky=0))(1p(y=1))(29)

这里的k表示词典中的第k个单词。
于是我们有如下参数:
p(y=1)=ϕy(30)

p(xj=ky=1)=ϕky=1(31)

p(xj=ky=0)=ϕky=0(32)

并得到几乎一样的似然函数:
L(ϕy,ϕky=1,ϕky=0)=i=1mp(x(i),y(i))=i=1m(j=1np(x(i)jy(i);ϕky=1,ϕky=0))p(y(i);ϕy)(33)

对其做最大似然估计,最终得到如下参数:
p(y=1)=ϕy=mi=1I{y(i)=1}m=(34)

p(xj=ky=1)=ϕky=1=mi=1nij=1I{(x(i)j=k)Λ(y(i)=1)}mi=1I{y(i)=1}ni=k(35)

p(xj=ky=0)=ϕky=0=mi=1nij=1I{(x(i)j=k)Λ(y(i)=0)}mi=1I{y(i)=0}ni=k(36)

我们可以看到,在用两种向量x来表示同样的邮件样本的时候,第二种方法NB-MEM中向量x的规模远远小于第一种方法NB-MBEM中向量x的规模,但是最终得到的参数规模几乎是一样的——
ϕy都表示垃圾邮件的概率;
第一种方法NB-MBEM的参数ϕj里的j取值范围是词典中单词的数量,
第二种方法NB-MEM的参数ϕk里的k取值范围也是词典中单词的数量。
这表示词典中的每一个单词都有属于自己的一个概率值ϕ[jk],如果这本词典里有50000个单词,那么就会有50000个ϕ[jk]。而且,还是两份ϕ[jk],垃圾邮件一份,非垃圾邮件一份,如果分类结果多起来,还会乘上与分类数目相同的份数。既然如此,区别这两个方法的意义何在?

回到我们最开始的地方,朴素贝叶斯是生成学习算法,生成学习算法的一般做法是分别做一个猫的模型与一个狗的模型,把新模型分别放到这两个模型中比较所得概率的大小。
在这里的文本分类中,我们对应地要分别做出一个垃圾邮件的模型与一个非垃圾邮件的模型,新邮件到来之后,把它分别放到这两个邮件模型中,看它是垃圾邮件的概率更大还是非垃圾邮件的概率更大。

以垃圾邮件的模型来看,我们最终使用参数的地方在:
式(17),NB-MBEM——p(y=1x)=(nj=1p(xj=1y=1))p(y=1)
与式(28),NB-MEM——p(y=1x)=(nj=1p(xj=ky=1))p(y=1)
这两个式子中p(y=1)都表示新样本是垃圾邮件的概率,区别就在于连乘的后验概率p(xy=1)=ϕ[jk]y=1了,直观上来看仅是xj的取值从1变成了k而已。

但是,在式(17)中,向量x是词典,这里的n是词典中单词的数量,如果该词典中有50000个单词,n就等于50000,所以每计算一个新样本是垃圾邮件的概率,都必须把50000个ϕj连乘起来;
在式(28)中,向量x是邮件本身,n是邮件中单词的数量,如果新样本邮件中有125个单词,那么n等于125,每计算一个新样本是垃圾邮件的概率只需要把125个ϕk做连乘。

虽然两个方法都需要计算出500002ϕ[jk],但是在NB-MBEM中,每个ϕj在每一次分类时都会被使用;而在NB-MEM中,只有该单词在邮件中出现了,该ϕk才会被使用。
正常来看,一本词典中单词的数量是远远多于一封邮件中单词的数量的,所以明显后者的效率更高。

3.4、拉普拉斯平滑(Laplace smoothing)

上面的推导已经告一段落,但以上面的形式来看,还面临着一个致命的问题:朴素贝叶斯方法对数据稀疏的问题过于敏感。

比如,单词“go”没有在某类样本邮件中出现过,这就会使得求得的某个参数ϕ[jk]=0,如果这个时候新样本中出现了“go”这个单词,那么这个等于0的ϕ[jk]是要拿来做连乘的,一旦乘起来就出事了,结果是0,这显然是不合理的,不能因为某个单词没有出现过就判断这个邮件肯定不属于这一类。

为了解决这个问题,我们应该给未出现过的特征值对应的参数,赋予一个很小的值,而不是0。

对于一个随机变量z,它的取值范围是{1,2,3,,k},对于m次试验后的观测结果{z(1),z(2),z(3),,z(m)},最大似然估计按照下式计算:

ϕj=mi=1I{z(i)=j}m(37)

并有mj=1ϕj=1

使用拉普拉斯平滑,它的具体做法是假设每个特征值都出现过一次,公式变为:

ϕj=mi=1I{z(i)=j}+1m+k(38)

也有mj=1ϕj=1

形象一点。抛一个骰子,它的取值范围是{1,2,3,4,5,6},10次试验后 的结果是{3,4,3,4,5,6,3,4,5,6},式(37)表示“某个结果出现的次数在总试验次数中的比例”,它们的概率累加为1就显得自然而然了,而这里分子的主体是抛骰子的结果,每个结果都多出现一次,那分母要加上6即k=6才能继续保持概率累加为1。

回到NB-MBEM与NB-MEM的参数ϕ[jk]中,我们要对式(24)(25)与式(35)(36)做拉普拉斯平滑,使得ϕ[jk]不为0。

NB-MBEM:

p(xj=1y=1)=ϕjy=1=mi=1I{(x(i)j=1)Λ(y(i)=1)}+1mi=1I{y(i)=1}+2(39)

p(xj=1y=0)=ϕjy=0=mi=1I{(x(i)j=1)Λ(y(i)=0)}+1mi=1I{y(i)=0}+2(40)

在这里,式子的主体是邮件(参看式(24)(25)中其所表达的意义),邮件可能的取值有两个,垃圾邮件或非垃圾邮件,所以k=2

NB-MEM:

p(xj=ky=1)=ϕky=1=mi=1nij=1I{(x(i)j=k)Λ(y(i)=1)}+1mi=1I{y(i)=1}ni+|V|(41)

p(xj=ky=0)=ϕky=0=mi=1nij=1I{(x(i)j=k)Λ(y(i)=0)}+1mi=1I{y(i)=0}ni+|V|(42)

在这里,式子的主体是单词(参看式(35)(36)中其所表达的意义),单词的取值就多了,{1,2,3,,|V|},所以k=|V|,这样才能保证其概率累加和仍然为1。

经过这样的处理,就算某个单词在训练样本中未出现,在新样本分类时出现了,也不会使某个ϕ[jk]=0,而是会赋予它一个较小的值,避免了某个分类结果直接变成0的情况,让分类过程更合理。

1 0
原创粉丝点击