生成学习算法的例子

例一:高斯判别分析和logistic函数

我们来看一个例子,对于一个高斯判别分析问题,根据贝叶斯: p(y=1|x)=p(x|y=1)p(y=1)p(x) =p(x|y=1)p(y=1)p(x|y=0)p(y=0)+p(x|y=1)p(y=1)

在这里,我们提出几个假设:

  1. p(y)是均匀分布的,也就是p(y=1)=p(y=0)
  2. x的条件概率分布(p(x|y=0)p(x|y=1))满足高斯分布。

考虑二维的情况:

image-20180630164349595image-20180630164349595
image-20180630164349595

蓝色数据表达的是p(x|y=0)的分布,红色数据表达的是p(x|y=1)的分布,两条蓝色和红色的曲线分别是它们的概率密度曲线。

而灰色的曲线则表示了p(y=1|x)的概率密度曲线。

假设p(x|y=0)N(μ0,σ0)p(x|y=1)N(μ1,σ1),而p(y)均匀分布那么: p(y=1|x)=N(μ0,σ0)N(μ0,σ0)+N(μ1,σ1) = =11+σ0σ1exp(2σ21(xμ0)22σ20(xμ1)2

事实上,这条曲线跟我们之前见过的logistic曲线非常像,特别是当我们假设σ0=σ1的时候,就是一条logistic曲线。

我们有如下的推广结论: {p(x|y=1)ExpFamily(η1) p(x|y=0)ExpFamily(η0)p(y=1|x)logistic

但这个命题的逆命题并不成立,故而我们知道,logistic所需要的假设更少(无需假设x的条件概率分布),鲁棒性更强。而生成函数因为对数据的分布做出了假设,所以需要的数据量会少于logstic回归,我们需要在两者之间进行权衡。

例二:垃圾邮件分类(1)

这里我们会用朴素贝叶斯(Naive Bayes)来解决垃圾邮件分类问题(y{0,1})。

首先对邮件进行建模,生成特征向量如下: x=[0 0 0  1 ]a advark ausworth  buy 

这是一个类似于词频向量的特征向量,我们有一个50000个词的词典,如果邮件中出现了某个词汇,那么其在向量中对应的位置就会被标记为1,否则为0。

我们的目标是获取,垃圾邮件和非垃圾邮件的特征分别是怎么样的,也即p(x|y)x={0,1}n,y{0,1},这里我们的词典中词汇数量是50000,所以n=50000,特征向量x会有250000种可能,需要2500001个参数。

我们假设xi|y之间相互独立(虽然假设各个单词的出现概率相互独立不是很合理,但是即便这样,朴素贝叶斯的效果依旧不错),根据朴素贝叶斯,我们得到: p(x1,x2,,x50000|y)=p(x1|y)p(x2|y)p(x50000|y)

单独观察p(xj|y=1)p(xj|y=1)=p(xj=1|y=1)xjp(xj=0|y=1)1xj
给定三个参数: ϕj|y=1=p(xj=1|y=1) ϕj|y=0=p(xj=1|y=0) ϕy=p(y=1)
故: p(xj|y=1)=ϕxjj|y=1(ϕyϕj|y=1)1xj p(xj|y=0)=ϕxjj|y=0(1ϕy+ϕj|y=0)1xj p(xj|y)=p(xj|y=1)yp(xj|y=0)1y p(y)=ϕyy(1ϕy)1y
按照上个博客生成学习算法的概念中所述,我们会选用联合概率分布的极大似然来导出最优解: l(ϕy,ϕj|y=1,ϕj|y=0=mi=1p(x(i),y(i))=mi=1p(x(i)|y(i))p(y(i))

可以解得: ϕj|y=1=mi=11{xj(i)=1,y(i)=1}mi=11{y(i)=1}=j ϕj|y=0=mi=11{xj(i)=1,y(i)=0}mi=11{y(i)=0}=j ϕy=mi=11{y(i)=1}m=

通过以上的公式,我们已经可以完全推得p(x1,x2,,x50000|y)

Laplace平滑

假设,训练集中,我们重来没有碰到过"NIPS"这个词汇,假设我们词典中包含这个词,位置是30000,也就是说: p(x30000=1|y=1)=0 p(x30000=0|y=1)=0  p(x|y=1)=50000i=1p(xi|y=1)=0 p(x|y=0)=50000i=1p(xi|y=0)=0

故而在分类垃圾邮件时: p(y=1|x)=p(x|y=1)p(y=1)p(x) =p(x|y=1)p(y=1)p(x|y=0)p(y=0)+p(x|y=1)p(y=1) =00+0
所以,我们提出p(x30000=1|y=1)=0这样的假设不够好。

Laplace平滑就是来帮助解决这个问题的。

举例而言,在计算: ϕy=p(y=1)=numof(1)numof(0)+numof(1)

其中,numof(1)表示的是,被分类为1的训练集中数据个数。

Laplace平滑中,我们会采取如下策略: ϕy=p(y=1)=numof(1)+1numof(0)+1+numof(1)+1

比如,A球队在之前的五场比赛里面都输了,我们预测下一场比赛赢的概率: p(y=1)=0+10+1+5+1=17
而不是简单的认为(没有Laplace平滑)是0。

推广而言,在多分类问题中,y{1,,k},那么: p(y=j)=mi=11{y(i)=j}+1m+k

例三:垃圾邮件分类(2)

之前的垃圾分类模型里面,我们对邮件提取的特征向量是: x=[1,0,0,,1,]T

这种模型,我们称之为多元伯努利事件模型(Multivariate Bernoulli Event Model)。

现在,我们换一种特征向量提取方式,将邮件的特征向量表示为: x=[x1,x2,,xj,]T

xj表示词汇j在邮件中出现的次数。上述的特征向量也就是词频向量了。这种模型,我们称为多项式事件模型(Multinomial Event Model)。

对联合概率分布p(x,y)进行极大似然估计,得到如下的参数: ϕk|y=1=p(xj=k|y=1)=Cx=k+1Cy=1+n ϕk|y=0=p(xj=k|y=0)=Cx=k+1Cy=0+n ϕy=p(y=1)=Cy=1+1Cy=1+1+Cy=0+1

其中:

n表示词典中词汇的数量,也就是特征向量的长度; Cx=k=mi=1(1{y(i)=1}nij=11{x(i)j=k})

表示在训练集中,所有垃圾邮件中词汇k出现的次数(并不是邮件的次数,而是词汇的次数); Cy=1=ni=1(1{y(i)=1}ni)
表示训练集中垃圾邮件的所有词汇总长; Cy=0=ni=1(1{y(i)=0}ni)
表示训练集中非垃圾邮件的所有词汇总长;