生成学习算法(Generative Learning algorithms)

一、引言

     前面我们谈论到的算法都是在给定x的情况下直接对p(y|x;θ)进行建模。例如,逻辑回归利用hθ(x)=g(θTx)p(y|x;θ)建模,这类算法称作判别学习算法。

     考虑这样一个分类问题,我们根据一些特征来区别动物是大象(y=1)还是狗(y=0)。给定了这样一个训练集,逻辑回归或感知算法要做的就是去找到一个决策边界,将大象和狗的样本分开来。可以换个思路,首先根据大象的特征来学习出一个大象的模型,然后根据狗的特征学习出狗的模型,对于一个新的样本,提取它的特征先放到大象的模型中求得是大象的概率,然后放到狗的模型中求得是狗的概率,最后我们比较两个概率哪个大,即确定这个动物是哪种类型。也即求p(y|x)=p(x|y)p(y)p(x)y为输出结果,x为特征。


现在我们来定义这两种解决问题的方法:

判别学习算法(discriminative learning algorithm):直接学习p(y|x)或者是从输入直接映射到输出的方法

生成学习算法(generative learning algorithm):p(x|y)(也包括p(y))进行建模。


y为输出变量,值为0或1,如果是大象取1,狗则取0

p(x|y=0):对狗的特征进行建模

p(x|y=1):对大象的特征建模

p(x|y)p(y)完成建模后,运用贝叶斯公式,就可以求得在给定x的情况下y的概率:

p(y|x)=p(x|y)p(y)p(x)

p(x)=p(x|y=1)p(y=1)+p(x|y=0)p(y=0)

由于我们关心的是y离散结果中哪一个的概率更大,而不是要求得具体的概率,所以上面的公式我们可以表达为:

argmaxyp(y|x)=argmaxyp(x|y)p(y)p(x)=argmaxyp(x|y)p(y)

argmaxyp(y|x)的含义:满足条件的最大y值。对y求取最大值,与p(x)无关,所以可以不需要计算p(x)

常见的生成模型有:隐马尔可夫模型HMM、朴素贝叶斯模型、高斯混合模型GMM、LDA等


二、高斯判别分析(Gaussian Discriminant Analysis)

下面介绍第一个生成学习算法GDA。在GDA中,假设xRn且是连续的,且p(x|y)满足多项正态分布。

2.1 多项正态分布(The multivariate normal distribution)

假设随机变量X满足n维的多项正态分布,参数为均值向量μRn,协方差矩阵ΣRn×n,记为N(μ,Σ)其概率密度表示为:

p(x;μ,Σ)=1(2π)n/2(detΣ)12exp(12(xμ)TΣ1(xμ))

detΣ表示矩阵Σ的行列式(determinant)。

均值向量 :μ

协方差矩阵:Σ=E[(XE[X])(XE[X])T]=E[(xμ)(xμ)T]

接下来我们用matlab来画一下二维正态分布的图像,我们可以调整均值和协方差矩阵来观察图像。

代码:

复制代码
mu=[0 0];
sigma=[1.0 0;0 1.0];
[x y]=meshgrid(linspace(-3,3,40)',linspace(-3,3,40)');
X=[x(:) y(:)];
z=mvnpdf(X,mu,sigma);
surf(x,y,reshape(z,40,40));
hold on;
figure;
contour(x,y,reshape(z,40,40));
复制代码

imageimage


μ决定中心位置,Σ决定投影椭圆的朝向和大小。

2.2高斯判别分析模型(The Gaussian Discriminant Analysis model)

现在有一个分类问题,训练集的特征值x是随机连续值,那么我们可以利用高斯判别分析模型,假设p(x|y)满足多值正态分布,即:

yBernoulli(ϕ)

x|y=0N(μ0,Σ)

x|y=1N(μ1,Σ)

概率分布为:

p(y)=ϕy(1ϕ)1y

p(x|y=0)=1(2π)n/2(detΣ)12exp(12(xμ0)TΣ1(xμ0))

p(x|y=1)=1(2π)n/2(detΣ)12exp(12(xμ1)TΣ1(xμ1))

模型参数为ϕ,Σ,μ0,μ1,对数似然函数为:

l(ϕ,μ0,μ1,Σ)=logmi=1p(x(i),y(i);ϕ,μ0,μ1,Σ)=logmi=1p(x(i)|y(i);μ0,μ1,Σ)p(y(i);ϕ)


注意这里的参数有两个μ,表示在不同的结果模型下,特征均值不同,但我们假设协方差相同。反映在图上就是不同模型中心位置不同,但形状相同。这样就可以用直线来进行分隔判别。

求得所有的参数:

ϕ=1mmi=11{y(i)=1}

μ0=mi=11{y(i)=0}x(i)mi=11{y(i)=0}

μ1=mi=11{y(i)=1}x(i)mi=11{y(i)=1}

Σ=1mmi=1(x(i)μy(i))(x(i)μy(i))T

ϕ是训练样本中结果y=1占有的比例。

μ0y=0的样本中特征均值。

μ1y=1的样本中特征均值。

Σ是样本特征方差均值。

所以通过上面所述,画出图像如下图:

image

直线两边的y值不同,但协方差矩阵相同,因此形状相同,μ不同,因此位置不同。
2.3讨论GDA和逻辑回归(Discussion: GDA and logistic regression)

现在我们把p(y=1|x;ϕ,μ0,μ1,Σ)看成是x的函数,则可以表达为:

p(y=1|x;ϕ,Σ,μ0,μ1)=11+exp(θTx)

θ 是参数ϕ,Σ,μ0,μ1的函数,这正是逻辑回归的形式。

逻辑回归和GDA在训练相同的数据集的时候我们得到两种不同的决策边界,那么怎么样来进行选择模型呢:

上面提到如果p(x|y)是一个多维的高斯分布,那么p(y|x)可以推出一个logistic函数;反之则不一定正确,p(y|x)是一个logistic函数并不能推出p(x|y)服从高斯分布.这说明GDA比logistic回归做了更强的模型假设.

如果p(x|y)真的服从或者趋近于服从高斯分布,则GDA比logistic回归效率高.

当训练样本很大时,严格意义上来说并没有比GDA更好的算法(不管预测的多么精确).

事实证明即使样本数量很小,GDA相对logisic都是一个更好的算法.

但是,logistic回归做了更弱的假设,相对于不正确的模型假设,具有更好的鲁棒性(robust).许多不同的假设能够推出logistic函数的形式. 比如说,如果x|y=0Poisson(λ0),x|y=1Poisson(λ1)那么p(y|x)是logistic。

logstic回归在这种类型的Poisson数据中性能很好. 但是如果我们使用GDA模型,把高斯分布应用于并不是高斯数据中,结果是不好预测的,GDA就不是很好了.

三:朴素贝叶斯(Naive Bayes)

在GDA中,特征向量x是连续的实数向量,那么现在谈论一下当x是离散时的情况。

我们沿用对垃圾邮件进行分类的例子,我们要区分邮件是不是垃圾邮件。分类邮件是文本分类的一种应用

将一封邮件作为输入特征向量,与现有的字典进行比较,如果在字典中第i个词在邮件中出现,则xi=1,否则\(x_i =0\),所以现在我们假设输入特征向量如下:

image


选定特征向量后,现在要对p(x|y)进行建模:

假设字典中有50000个词,x{0,1}50000   如果采用多项式建模, 将会有250000种结果,2500001维的参数向量,这样明显参数过多。所以为了对p(x|y)建模,需要做一个强假设,假设x的特征是条件独立的,这个假设称为朴素贝叶斯假设(Naive Bayes (NB) assumption),这个算法就称为朴素贝叶斯分类(Naive Bayes classifier).

解释:

如果有一封垃圾邮件(y=1),在邮件中出现buy这个词在2087这个位置,它对39831这个位置是否出现price这个词没有影响,也就是,我们可以这样表达p(x2087|y)=p(x2087|y,x39831),这个和x2087x39831相互独立不同,如果相互独立,则可以写为p(x2087)=p(x2087|x39831),我们这里假设的是在给定y的情下,x2087x39831独立。

现在我们回到问题中,在做出假设后,可以得到:

image

解释

第一个等号用到的是概率的性质 链式法则

第二个等式用到的是朴素贝叶斯假设

朴素贝叶斯假设是约束性很强的假设,一般情况下 buy和price是有关系的,这里我们假设的是条件独立 ,独立和条件独立不相同

模型参数:

ϕi|y=1=p(xi=1|y=1)

ϕi|y=0=p(xi=1|y=0)

ϕy=p(y=1)


对于训练集{(x(i) , y(i)); i =1, . . . , m},根据生成学习模型规则,联合似然函数(joint likelihood)为:

image

得到最大似然估计值:

image

最后一个式子是表示y=1的样本数占全部样本数的比例,前两个表示在y=1y=0的样本中,特征xj=1的比例。

拟合好所有的参数后,如果我们现在要对一个新的样本进行预测,特征为x,则有:

image

实际上只要比较分子就行了,分母对于y = 0和y = 1是一样的,这时只要比较p(y = 0|x)与p(y = 1|x)哪个大就可以确定邮件是否是垃圾邮件。

3.1拉普拉斯平滑(Laplace smoothing)

朴素贝叶斯模型可以在大部分情况下工作良好。但是该模型有一个缺点:对数据稀疏问题敏感。

  比如在邮件分类中,对于低年级的研究生,NIPS显得太过于高大上,邮件中可能没有出现过,现在新来了一个邮件"NIPS call for papers",假设NIPS这个词在词典中的位置为35000,然而NIPS这个词从来没有在训练数据中出现过,这是第一次出现NIPS,于是算概率时:

image

由于NIPS从未在垃圾邮件和正常邮件中出现过,所以结果只能是0了。于是最后的后验概率:

image

对于这样的情况,我们可以采用拉普拉斯平滑,对于未出现的特征,我们赋予一个小的值而不是0。具体平滑方法为:

假设离散随机变量取值为{1,2,···,k},原来的估计公式为:

image

使用拉普拉斯平滑后,新的估计公式为:

image

即每个k值出现次数加1,分母总的加k,类似于NLP中的平滑,具体参考宗成庆老师的《统计自然语言处理》一书。

  对于上述的朴素贝叶斯模型,参数计算公式改为:

image

posted on   迈克老狼2012  阅读(1849)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示