内容提要
这篇博客的主要讲生成学习算法,主要包括两个算法:
- 高斯判别分析(Gaussian Discriminant Analysis)
- 朴素贝叶斯(Naive Bayes)
now let’s begin
前言
今天学习的生成学习算法依然属于监督式学习算法,我们需要输入训练集,训练参数,然后进行分类。比如我们输入动物的特征x(function () {的关系如下:
其中p(x)。根据我们对这些特征分布的不同假设,就有了高斯判别分析和朴素贝叶斯。首先来看高斯判别分析:
高斯判别分析(Gaussian Discriminant Analysis)
高斯判别分析就是假设p(x|y)往往是一个向量。所以我们有必要先复习一下,多元高斯分布:
多元高斯分布
多元高斯分布中:μ∈Rn,则概率密度为:
X的期望为:
X,最终结果为:
下面我们再来看看协方差矩阵和均值向量对密度函数的影响。首先看看协方差对密度函数的影响,如图示:
可以看出:
1. 协方差矩阵主对角线缩小图像就变得尖了,当增大时,图像就变得平摊了。
2. 协方差矩阵副对角线为正时,并且缩小,图像就以y=x为对称轴变扁。增大时,效果相反。
3. 协方差矩阵副对角线为负时,并且缩小,图像就一y=−x为对称轴变扁。增大时,效果相反。
利用等高线图,可以更加清楚的看到这个性质:
再来看看均值向量对密度函数的影响,如下图(协方差矩阵∑=I):
总结起来,可以看出这种多元的高斯分布和一元的高斯分布非常类似。多元的均值向量影响的也是密度函数中心的位置,协方差矩阵影响的是密度函数的“胖瘦”。说是多元其实就是二元,更多元的我现在也不知道,因为,一元的时候是方差,二元的时候是协方差矩阵,那么三元的。。。我现在不知道,再看看。
高斯判别分析模型(Gaussian Discriminant Analysis model(简称GDA))
首先做出如下的假设,Andrew Ng老师在课上也没有解释为什么是这样的假设。我想可能是在实验中,做出这样的假设,得到的效果比较好。进而也将这种假设系统的设计成一种模型或者算法。
Andrew Ng老师解释说这不是条件概率,只是形式和他像。但是我就是像条件概率一样去理解他,也行。下来我们具体的写出它们的密度函数:
和之前一样,写出它的似然函数然后去对数(这个似然函数有一个转门的名字:Joint Likelihood):
然后令对数似然函数达到最大,利用之前的梯度上升,牛顿法都可以。但是对于这个式子具体的怎么推导我也不知道。Andrew Ng老师直接给出了,计算的结果。有了参数的就算结果,就可以让模型工作了。
下来,我们看看一个简单的例子,一元的。如下图:
横坐标上的叉和圆圈都代表我们的输入特征,叉和圆圈仅仅是为了区分。你可以把他想象成狗和大象的特征。经过这些,数据的训练,我们就可以得到ϕ,μ1,μ2,∑的值,利用的公式是:
从左至右给出一些 x
下面我们再来看看二维的分类效果:
这张图中高斯密度函数利用等高线绘制,最终我们得到了蓝色直线,它将两类分开。这就是高斯判别分析,写来是我们对高斯判别分析的讨论。
高斯判别分析的讨论
上图给出了一些关系,其实如果x|y服从的是泊松分布,而你假设成了高斯分布,那么计算的结果就没有逻辑回归得到的好。但是如果你的输入就是严格服从高斯,或者近似服从高斯,相比于逻辑回归你只需要更少的训练就可以得到很好的效果。在实际中这就要求我们根据具体情况进行权衡。
朴素贝叶斯(Naive Bayes)
加入你现在有两百封邮件,需要去标记它是不是垃圾邮件(y=1:垃圾邮件;y=0:不是垃圾邮件)(y∈{0,1}),下一步就是怎么去表示一封邮件的特征,一般的想法是建立字典:
上图中右边单词或字母就是我们训练集中所有单词构成的字典。如果,一封邮件中出现了字典中的词,我们就在对应的特征位置标为1。但是,很容易想到词典的大小应该是一个很大的数,这就意味着我们特征向量的维数也是这个级别的或者更高,这就不是很好了。所以,朴素贝叶斯假设xi的表达式,先利用条件概率的链式法则,再利用朴素贝叶斯的假设,就可以得到下面的式子:
条件概率链式规则的说明:
由p(B|A)=p(AB)p(A)
同理先将AB看成一个整体:p(ABC)=p(AB)p(C|AB)=p(A)p(B|A)P(C|AB)Andrew Ng老师也大概给出了,怎么去生成字典,一种比较有效的方式:对于垃圾邮件,我们去遍历他,将其中出现3次的单词提取出来就得到了,我们的词典。也学你还有更好的方法。
从例子中可以看出:p(x|y)∈{0,1}中情况。
特别的:朴素贝叶斯的假设一般不成立,比如出现了KFC就很可能出现buy,他们之间是有关系的。但是朴素贝叶斯在在实践中表现的很好,比如在邮件分类中。
下来我们要对各种情况的分布进行假设,我觉得这也是这两种生成学习算法的区别(不同分布的假设)。分布的假设是:伯努利分布,同时给出响应的参数:
如果我们有训练集{x(i),y(i);i=1,2…m},此时我们就可以给出 joint 似然函数(joint likelihood)如下:
使得joint似然函数最大,便可以得到各个参数的似然估计,如下:
上式中x(i)j个分量。
最终我们就可以得到判断垃圾邮件的响应函数,本质上就是一个贝叶斯公式:
其中对于p(x|y)的展开就是利用我们前面条件概率链式法则加朴素贝叶斯假设得到的那个公式,稍微往上看看,你就看到了。
在来细细看看上面这个式子,我们发现它是一个分数的形式,这就需要考虑到分子为零情况。那么什么情况写分子才可能为零呢?p(y=1),p(y=0)这个的位置就是0,则得到的参数均为零:
在判断这封邮件时判断垃圾邮件的响应函数就出现了00的情况,怎么处理呢?Laplace smoothing
Laplace smoothing
我们先举个例子,比如一个球队的战绩:
时间 | 对手 | 比赛结果(0:失败) |
---|---|---|
2/1 | A | 0 |
2/2 | B | 0 |
2/3 | C | 0 |
2/4 | D | 0 |
2/5 | E | ? |
求该对在与E对决中获胜的概率是多少?
p(y=1)=比赛结果“1”的个数+1比赛结果“1”的个数+1+比赛结果“0”的个数+1=16
这就是Laplace smoothing,我觉得他其中最关键的就是添加了“安全因子”,使得分母不为零。
对于朴素贝叶斯我们就可以做出如下改进:
|V|是字典的维数。
再谈朴素贝叶斯
先来回顾一下,我们判断垃圾邮件的响应函数:
公式是这样写的,但是假如来了一封邮件,我们到底是怎样来判断他是否为垃圾邮件的?过程是这样的:来了一封邮件,我们得到了他的特征向量x这两个概率就是我们前面训练的参数。
对应下标,带入即可。最终响应函数可以进一步简写成如下样子:
其中y∈{0,1}向量中的每一个分量的取值非0即1,所以这个模型称之为:多变量伯努利模型(multi-variate Bernoulli event model)
下来我们再来看看多项式模型(multinomial event model),在这个模型中,x是词典中第i个词。参数的表示形式和上面的一样,在给定训练集的情况下,我们似的似然函数取得最大值,求出参数:
其中,ni表示,在训练集中所有垃圾邮件的单词总数。同样的,我们可以对参数进行拉普拉斯平滑:
最终分类的表达形式还可以表达成和上面的式子相同的样子:
参考资料
Andrew Ng老师的斯坦福公开课
end
- ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append( numbering); for (i = 1; i