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是样本数量):
然后通过最大似然估计得到我们的参数: