本文主要是介绍生成模型、高斯判别分析、朴素贝叶斯——斯坦福CS229机器学习个人总结(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、生成学习算法(Generative Learning Algorithm)
1.1、判别模型与生成模型
判别模型:训练出一个总模型,把新来的样本放到这个总模型中,直接判断这个新样本是猫还是狗。
生成模型:先训练出一个猫的模型,再训练出一个狗的模型。把新来的样本放到猫的模型里,看它生成的概率是多少,再把它放到狗的模型里,看它生成的概率是多少。如果用猫的模型生成的概率比较大,就把新样本判断为猫,如果用狗的模型生成的概率比较大,就把新样本判断为狗。
- | 判别模型 | 生成模型 |
---|---|---|
区别 | 反映异类数据之间的差异 | 反映同类数据之间的相似度 |
形式化 | 直接对 p(y∣x) 建模 | 对 p(x∣y) 建模,再求 p(y∣x) |
生产性能 | 高(直接判断) | 低(逐个生成概率并对比) |
学习难度 | 简单,容易学习 | 复杂,较难学习 |
转化关系 | 判别模型不能转化为生成模型 | 生成模型能转化为判别模型 |
其他 | 黑盒,不可视; 能清晰分辨出各类差异特征; 使用范围更广 | 研究单类问题更灵活; 可以把整个场景描述出来; 要满足特定条件才能使用 |
常见模型 | logistic回归; SVM; 神经网络等 | 高斯判别分析; 贝叶斯算法; 隐马尔科夫模型等 |
1.2、生成模型的一般做法
因为目前还没有做过相关工程,而且本人也还只是处于学习阶段,下面只是一些自己的总结,若有错误的地方,请指正。
判别模型是直接对 p(y∣x) 建模进行估计,生成模型是先求 p(x∣y) 再求 p(y∣x) ,它们之间是怎么转换的?
首先引出贝叶斯规则:
再配合上联合概率我一般是这么记的,这样就可以随便切来切去不会搞混了:
上面说了,我们需要生成一个猫的模型:
再生成一个狗的模型:
然后比较是 p(y=猫∣x) “这个样本是猫的概率”更大,还是 p(y=狗∣x) “这个样本是狗的概率”更大。
我们可以看到(3)式和(4)式的分母是一样的,就只比较分子的大小,所以问题就变成了是 p(x∣y=猫)p(y=猫) 更大还是 p(x∣y=狗)p(y=狗) 更大。
形式化一下就是:
p(y) ,先验概率(Prior),表示:对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小”,比如猫或者狗在我们的生活中出现的频率(这个看起来是一样的,但如果是狗和狼,就有 p(y=狗)>p(y=狼) ,因为狼比狗更常见);
p(x∣y) ,似然性(Likelihood),表示:“这个猜测生成我们观测到的数据的可能性大小”。(如果样本里有一项特征表达出“鼻子较长”这个信息,那么假设样本是猫的同时观察到“鼻子较长”,和假设样本是狗的同时观察到“鼻子较长”的可能性是不一样的,明显后者的可能性更高)
每一个猜测都有属于自己的先验概率 p(y=n) 与似然性 p(x∣y=n) 的乘积,用来对 p(y=n∣x) 做估计,表示“同一组输入产生的每个猜测的可能性大小”。
比如同一组数据 x ,通过对
2、高斯判别分析(Gaussian Discriminant analysis)
高斯判别分析(GDA)名字中虽然有“判别”二字,却是地地道道的生成算法。
GDA解决的是连续型随机变量的分类问题。
什么是连续型随机变量呢?举两个例子:
公交车15分钟一趟,某人的等车时间 x 是区间
抛20枚硬币,硬币朝上的数量 x 只能取
而且只有连续型随机变量的分布函数可以积分,得到概率密度函数,这样才能用多元高斯分布对
下面给出高斯判别分析的假设:
接着给出一个 k 维向量
由此可以得到下面的分布( x 是n维向量):
这里有先验概率 p(y) (因为是伯努利分布,所以 y 的取值是0或者1),具体猜测的似然性
而这些分布里面一共有
进一步地,得到我们的似然函数(m是样本数量):
然后通过最大似然估计得到我们的参数:
ϕ : y 的取值是1的样本在整个样本集中的比例;
下面是讲义里给出的一个分类结果的图:
3、朴素贝叶斯(Naive Bayes)
3.1、具体例子-文本分类
GDA针对的是特征向量 x 是连续值的问题,朴素贝叶斯针对的是特征向量
朴素贝叶斯算法的标准应用也是最常见的的应用就是文本分类问题,例如邮件是否为垃圾邮件的分类。
朴素贝叶斯也是生成模型,按照前面提到的生成模型的一般做法,我们应该先计算出一封邮件是垃圾邮件的概率,再计算出这封邮件不是垃圾邮件的概率,取较大的那个概率为分类结果。
对此,我们假设 y=1 表示分类结果为垃圾邮件, y=0 表示分类结果为非垃圾邮件,向量 x 表示需要判断的邮件本身,它由
那么,这封邮件是垃圾邮件的概率为:
同样地,我们可以得到这封邮件不是垃圾邮件的概率为:
又因为要比较这两者的大小,它们的分母又一样,所以我们只需要比较 p(x∣y=1)p(y=1) 与 p(x∣y=0)p(y=0) 的大小即可得到分类结果。
目前为止都还只是很一般性的推导,朴素贝叶斯体现在哪里?在邮件 x 上。
前面说到要用向量
讲义里给出了两种用向量表示邮件的方法,进而推导出了两种模型,一种称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称NB-MBEM),另一种称为多项式事件模型(Multivariate Event Model,以下简称NB-MEM),下面就对这两个模型进行说明。
3.2、文本表示方法一——多元伯努利事件模型(NB-MBEM)
在多元伯努利模型下(NB-MBEM),一封邮件的特征向量可以表示成如下形式:
在此模型下,向量 x 是一本词典,它的每一个元素都是一个单词,对于词典中的每一个词都有一个向量中对应的元素
接着因为我们要求 p(x∣y) ,假设 x 中的特征是条件独立的(条件独立与独立不同),这个称为朴素贝叶斯假设。
上面的式子表示,在给定Z的情况下,X与Y条件独立。
还要引出链式规则:
可以看到,当 n=2 的时候,它的形式跟(2)式是一样的,当 n=3 的时候,我们可以来推导一下:
这跟式(14)的形式是一致的。
由链式规则与条件独立假设,我们对 p(x∣y) 有如下展开:
这里的 xj 只能取值为0或者1,所以 xj∣y 实际上是一个伯努利分布。
回到我们的式(10)与式(11),我们有(这里省去了分母):
这样我们就得到了下面的参数:
又到了求参数的时间,我们希望模型在训练数据上概率积能达到最大(m为样本数量,n为词典中单词的数量),所以有:
对其做最大似然估计就得到了参数值,带入式(17)与式(18)中即可对新样本进行分类:
以上就是最基本的朴素贝叶斯方法。
3.3、文本表示方法二——多项式事件模型(NB-MEM)
在上面的在多元伯努利模型(NB-MBEM)下,向量 x 是一本词典,每个词用0或者1标记,词典里被标记了1的单词组成了我们的邮件(式(12)):
虽然上一节里推导出了这种表示形式下的解法,但是 x 未免维数太大了,有没有另外的表示方法可以降低
那就是在多项式事件模型(NB-MEM)下,第二种邮件的特征向量表示形式了:
向量 x 在这里不再是一本词典,而是邮件本身,每一个元素都是邮件中的一个单词,对应地,向量
在多项式事件模型(NB-MEM)中,我们假设一封邮件是由随机过程生成的。首先确定这封邮件是垃圾或者非垃圾邮件( p(y) ),在此前提下,我们假设邮件中的第一个单词 x1 是根据多项式分布来确认的( p(x1∣y) ),第二个单词 x2 在与 x1 条件独立的情况下,通过同一个多项式分布来确定,再以同样的方式确定 x3 、 x4 等,直到这封邮件被生成。
所以,同样地,我们对 p(x∣y) 展开:
形式上看起来跟式(16)是一样的,但是 xj∣y 在这里是多项式分布,不再是伯努利分布。
而且这里n的取值不是再是词典的中单词的个数,而是邮件中单词的个数;同时 xj 的取值不再是0或者1,而是1~词典中单词的个数 |V| 。
同样地,我们有省去分母的垃圾邮件模型与非垃圾邮件模型:
这里的 k 表示词典中的第
于是我们有如下参数:
并得到几乎一样的似然函数:
对其做最大似然估计,最终得到如下参数:
我们可以看到,在用两种向量 x 来表示同样的邮件样本的时候,第二种方法NB-MEM中向量
第一种方法NB-MBEM的参数 ϕj 里的 j 取值范围是词典中单词的数量,
第二种方法NB-MEM的参数
这表示词典中的每一个单词都有属于自己的一个概率值
回到我们最开始的地方,朴素贝叶斯是生成学习算法,生成学习算法的一般做法是分别做一个猫的模型与一个狗的模型,把新模型分别放到这两个模型中比较所得概率的大小。
在这里的文本分类中,我们对应地要分别做出一个垃圾邮件的模型与一个非垃圾邮件的模型,新邮件到来之后,把它分别放到这两个邮件模型中,看它是垃圾邮件的概率更大还是非垃圾邮件的概率更大。
以垃圾邮件的模型来看,我们最终使用参数的地方在:
式(17),NB-MBEM—— p(y=1∣x)=(∏nj=1p(xj=1∣y=1))p(y=1) ;
与式(28),NB-MEM—— p(y=1∣x)=(∏nj=1p(xj=k∣y=1))p(y=1)
这两个式子中 p(y=1) 都表示新样本是垃圾邮件的概率,区别就在于连乘的后验概率 p(x∣y=1)=ϕ[jk]∣y=1 了,直观上来看仅是 xj 的取值从1变成了k而已。
但是,在式(17)中,向量 x 是词典,这里的n是词典中单词的数量,如果该词典中有50000个单词,n就等于50000,所以每计算一个新样本是垃圾邮件的概率,都必须把50000个
在式(28)中,向量 x 是邮件本身,n是邮件中单词的数量,如果新样本邮件中有125个单词,那么n等于125,每计算一个新样本是垃圾邮件的概率只需要把125个
虽然两个方法都需要计算出 50000∗2 个 ϕ[jk] ,但是在NB-MBEM中,每个 ϕj 在每一次分类时都会被使用;而在NB-MEM中,只有该单词在邮件中出现了,该 ϕk 才会被使用。
正常来看,一本词典中单词的数量是远远多于一封邮件中单词的数量的,所以明显后者的效率更高。
3.4、拉普拉斯平滑(Laplace smoothing)
上面的推导已经告一段落,但以上面的形式来看,还面临着一个致命的问题:朴素贝叶斯方法对数据稀疏的问题过于敏感。
比如,单词“go”没有在某类样本邮件中出现过,这就会使得求得的某个参数 ϕ[jk]=0 ,如果这个时候新样本中出现了“go”这个单词,那么这个等于0的 ϕ[jk] 是要拿来做连乘的,一旦乘起来就出事了,结果是0,这显然是不合理的,不能因为某个单词没有出现过就判断这个邮件肯定不属于这一类。
为了解决这个问题,我们应该给未出现过的特征值对应的参数,赋予一个很小的值,而不是0。
对于一个随机变量 z ,它的取值范围是{
并有 ∑mj=1ϕj=1
使用拉普拉斯平滑,它的具体做法是假设每个特征值都出现过一次,公式变为:
也有 ∑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:
在这里,式子的主体是邮件(参看式(24)(25)中其所表达的意义),邮件可能的取值有两个,垃圾邮件或非垃圾邮件,所以 k=2 。
NB-MEM:
在这里,式子的主体是单词(参看式(35)(36)中其所表达的意义),单词的取值就多了,{ 1,2,3,⋯,|V| },所以 k=|V| ,这样才能保证其概率累加和仍然为1。
经过这样的处理,就算某个单词在训练样本中未出现,在新样本分类时出现了,也不会使某个 ϕ[jk]=0 ,而是会赋予它一个较小的值,避免了某个分类结果直接变成0的情况,让分类过程更合理。
这篇关于生成模型、高斯判别分析、朴素贝叶斯——斯坦福CS229机器学习个人总结(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!