本文结合网易云吴恩达机器学习公开课中文课件内容以及个人理解,对这一章节进行介绍。红色部分为关键部分或个人的一些理解。
1. 生成模型与判别模型
1.1 两种模型的区别
我们首先假设x为特征,y为类别结果。那么分以下几种方式来理解生成模型与判别模型。
(1)官方定义:判别模型是根据特征值来求结果的概率。形式化表示为,在参数确定的情况下,求解条件概率,通俗的解释为在给定特征后预测结果出现的概率。
而生成模型是知道结果的情况下,对样本特征建立概率模型,是在给定样本所属类的情况下。形式化表示为。当然这里最大的记忆难点就是x和y在形式化表示中的位置,因此建议下一种方式进行记忆。
(2)顾名思义:判别模型,即要判断这个东西到底是哪一类,也就是要求y,那给定的就是x,所以是p(y|x)。生成模型同样,是要生成一个模型,那就是谁根据什么生成了模型,谁就是类别y,根据的内容就是x,所以是。
(3)深度记忆:这里举例说明。比如我们的任务是判断一只羊是山羊还是绵羊,判别模型就是先从历史数据中提取这些羊的特征来判断它是哪种羊。生成模型则是我先给你山羊,你研究山羊的特征,然后生成一个山羊的模型,绵羊同理。那么判断新来的一只羊时,把他的特征丢到两个模型中去,哪个模型得到的概率大,那这只羊就属于哪个种类。
1.2 两种模型的联系
利用贝叶斯公式发现两个模型的统一性:
由于两种模型生成后,都是来预测一个新的y因此我们关注的是y的离散值结果中哪个类别的概率,而不是关心具体的概率,因此上面的公式可以改写为:
2. 生成模型—高斯判别分析(GDA)
2.1 多值正态分布
多变量正态分布描述的是n维随机变量的分布情况,这里的变成了向量,也变成了矩阵。写作。假设有n个随机变量X1,X2,…,Xn。的第i个分量是E(Xi),而。
概率密度函数如下:
如下图:
2.2 高斯判别分析模型
如果输入特征x是连续型随机变量,那么可以使用高斯判别分析模型来确定p(x|y)。这里有一个假设,那就是假设p(x|y)服从多元高斯分布,这个假设的含义就是指在给定某一类别下,所属类别的所有样本的分布为高斯分布。
模型如下:
输出结果服从伯努利分布,在给定模型下特征符合多值高斯分布。通俗地讲,在山羊模型下,它的胡须长度,角大小,毛长度等连续型变量符合高斯分布,他们组成的特征向量符合多值高斯分布。
这样,可以给出概率密度函数:
最大似然估计如下:
注意这里的参数有两个,表示在不同的结果模型下,特征均值不同,但我们假设协方差相同。反映在图上就是不同模型中心位置不同,但形状相同。这样就可以用直线来进行分隔判别。求导后,得到参数估计公式:
如前面所述,在图上表示为:
直线两边的y值不同,但协方差矩阵相同,因此形状相同。不同,因此位置不同。
2.3 高斯判别分析(GDA)与logistic回归的关系
这是https://www.cnblogs.com/yinheyi/p/6131875.html的一张图
例如现在我想获得在高斯判别分析中P(y=1|x)概率值的走向,从X轴左边开始,由于这里下方的叉叉×表示y=0的情况,圈圈表示y=1的情况,从左往右的过程中y=1的情况可能性越来越大,其形状就和sigmoid函数一样,上图中的losgtic回归网线就是p(y=1|x) = p(x |y=1)p(y=1) / p(x)的曲线。两个高斯分布交界的地方就是logistic曲线等于0.5的地方,因为在这一点p(y = 0)与p(y =1)的概率相同。其计算可由贝叶斯公式可以得到
P(x|y)可以直接由高斯判别函数的y值得到,p(y=1)可以由伯努利模型得到,p(x)如图中红色的部分得到。
如果p(x|y)符合多元高斯分布,那么p(y|x)符合logistic回归模型。反之,不成立。为什么反过来不成立呢?因为GDA有着更强的假设条件和约束。
如果事先知道训练数据满足多元高斯分布,那么GDA能够在训练集上是最好的模型。然而,我们往往事先不知道训练数据满足什么样的分布,不能做很强的假设。Logistic回归的条件假设要弱于GDA,因此更多的时候采用logistic回归的方法,也就是说即使不知道训练数据满足何种分布方式,logistic回归也能保持其稳定性。
,或者其他类型的指数分布簇,那么p(y|x)也是logistic回归的。这个时候如果采用GDA,那么效果会比较差,因为训练数据特征的分布不是多元高斯分布,而是泊松分布,所以通常不知道训练数据满足何种分布。这也是logistic回归用的更多的原因。
3. 生成模型—朴素贝叶斯模型
在GDA中,我们要求特征向量x是连续实数向量。如果x是离散值的话,可以考虑采用朴素贝叶斯的分类方法。
假如要分类垃圾邮件和正常邮件。分类邮件是文本分类的一种应用。
假设采用最简单的特征描述方法,首先找一部英语词典,将里面的单词全部列出来。然后将每封邮件表示成一个向量,向量中每一维都是字典中的一个词的0/1值,1表示该词在邮件中出现,0表示未出现。
比如一封邮件中出现了“a”和“buy”,没有出现“aardvark”、“aardwolf”和“zygmurgy”,那么可以形式化表示为:
假设字典中总共有5000个词,那么x是5000维的。
对应到上面的问题上来,把每封邮件当做一次随机试验,那么结果的可能性有种。意味着pi有个,参数太多,不可能用来建模。
换种思路,我们要求的是p(y|x),根据生成模型定义我们可以求p(x|y)和p(y)。假设x中的特征是条件独立的。这个称作朴素贝叶斯假设。如果一封邮件是垃圾邮件(y=1),且这封邮件出现词“buy”与这封邮件是否出现“price”无关,那么“buy”和“price”之间是条件独立的。
回到问题中
这里p(x2|y,x1)=p(x2|y)就可以理解成x2为buy,x1为price,也就是我知不知道price出现和buy有没有出现并没有关系。
这里我们发现朴素贝叶斯假设是约束性很强的假设,“buy”从通常上讲与“price”是有关系,我们这里假设的是条件独立。(注意条件独立和独立是不一样的)
建立形式化的模型表示:
那么我们想要的是模型在训练数据上概率积能够最大,即最大似然估计如下:
注意这里是联合概率分布积最大,说明朴素贝叶斯是生成模型。
求解得:
最后一个式子是表示y=1的样本数占全部样本数的比例,前两个表示在y=1或0的样本中,特征Xj=1的比例。
然而我们要求的是(没错,不管什么模型,最后都是给一个新样本判断它的类型)
实际是求出分子即可,分母对y=1和y=0都一样。
当然,朴素贝叶斯方法可以扩展到x和y都有多个离散值的情况。对于特征是连续值的情况,我们也可以采用分段的方法来将连续值转化为离散值。具体怎么转化能够最优,我们可以采用信息增益的度量方法来确定(参见Mitchell的《机器学习》决策树那一章)。
比如房子大小可以如下划分成离散值:
4 拉普拉斯平滑
朴素贝叶斯方法有个致命的缺点就是对数据稀疏问题过于敏感。
比如前面提到的邮件分类,现在新来了一封邮件,邮件标题是“NIPS call for papers”。我们使用更大的网络词典(词的数目由5000变为35000)来分类,假设NIPS这个词在字典中的位置是35000。然而NIPS这个词没有在之前的训练数据中出现过,这封邮件第一次出现了NIPS。那我们算概率的时候如下:
由于NIPS在以前的不管是垃圾邮件还是正常邮件都没出现过,那么结果只能是0了。
显然最终的条件概率也是0。
原因就是我们的特征概率条件独立,使用的是相乘的方式来得到结果。为了解决这个问题,我们打算给未出现特征值,赋予一个“小”的值而不是0。
具体平滑方法如下:
假设离散型随机变量z有{1,2,…,k}个值,我们用来表示每个值的概率。假设有m个训练样本中,z的观察值是其中每一个观察值对应k个值中的一个。那么根据原来的估计方法可以得到
说白了就是z=j出现的比例。
拉普拉斯平滑法将每个k值出现次数事先都加1,通俗讲就是假设他们都出现过一次。
那么修改后的表达式为:
这个有点像NLP里面的加一平滑法,当然还有n多平滑法了,这里不再详述。
回到邮件分类的问题,修改后的公式为:
5. 文本分类的事件模型——多项式事件模型
回想一下我们刚刚使用的用于文本分类的朴素贝叶斯模型,这个模型称作多值伯努利事件模型(multi-variate Bernoulli event model)。在这个模型中,我们首先随机选定了邮件的类型(垃圾或者普通邮件,也就是p(y)),然后一个人翻阅词典,从第一个词到最后一个词,随机决定一个词是否要在邮件中出现,出现标示为1,否则标示为0。然后将出现的词组成一封邮件。决定一个词是否出现依照概率p(xi|y)。那么这封邮件的概率可以表示为,其中xi为0或1,n为50000。
让我们换一个思路,这次我们不先从词典入手,而是选择从邮件入手。让i表示邮件中的第i个词,xi表示这个词在字典中的位置,那么xi取值范围为{1,2,…|V|},|V|是字典中词的数目。这样一封邮件可以表示成,n可以变化,因为每封邮件的词的个数不同。然后我们对于每个xi随机从|V|个值中取一个,这样就形成了一封邮件。这相当于重复投掷|V|面的骰子,将观察值记录下来就形成了一封邮件。当然每个面的概率服从p(xi|y),而且每次试验条件独立。这样我们得到的邮件概率是。居然跟上面的一样,那么不同点在哪呢?注意第一个的n是字典中的全部的词,下面这个n是邮件中的词个数。上面xi表示一个词是否出现,只有0和1两个值,两者概率和为1。下面的xi表示|V|中的一个值,|V|个p(xi|y)相加和为1。上面的x向量都是0/1值,下面的x的向量都是字典中的位置。
这里要注意词典的功能,我们可以这样对比理解两种方法:第一种方法是固定词典,每次将邮件的内容对照着词典里的50000个词比较,看哪些词出现(注意,这是出现,没有去计算出现多少次,因为X只有0或1两种选择),那么第二种方法就是将邮件的所有词都对应到词典的位置中,例如邮件中第一个词是buy,但是对应的词典的位置可能是{20},第二个词是price,对应的位置可能是{1},但是这都没关系,因为这个模型并不关心词在字典中的位置,也就是说邮件里的所有词可以任意排序。词典在这里的功能就像一个中介,因为每个邮件的单词数是不固定的,但是词典的位置是固定,这个位置就是这个词,所以我们统计词典中这个位置出现的次数,就是统计得到对应的单词出现的次数。我们最后是根据一个新邮件中给定的词典位置这个特征,来计算出这个邮件总偏向出现哪些词,从而判断它是否为一个垃圾邮件。
形式化表示为:
那么我们仍然按照朴素贝叶斯的方法求得最大似然估计概率为
解得,
个人对这个表达式在两种模型表达式的区别理解:
第一个模型为多值伯努利事件模型,理解为有m个样本邮件,其中我确定的s个为垃圾邮件,这s个垃圾邮件中都出现了buy这个词,那么buy的比例就是n/m
第二个模型为多项式事件模型,理解为有m个样本邮件,其中有s个垃圾邮件,这s个垃圾邮件每个邮件的单词数为ni个,那么这s个垃圾邮件总共有s*Σni个单词。而每个垃圾邮件中出现buy这个词的个数为si,那么这s个垃圾邮件一共出现了s*Σsi个buy单词,那么buy的比例就是Σsi/Σni,也就是考虑了每个邮件中词出现的个数
与以前的式子相比,分母多了个ni,分子由0/1变成了k。
举个例子:
X1 | X2 | X3 | Y |
1 | 2 | - | 1 |
2 | 1 | - | 0 |
1 | 3 | 2 | 0 |
3 | 3 | 3 | 1 |
假如邮件中只有a,b,c这三词,他们在词典的位置分别是1,2,3,前两封邮件都只有2个词,后两封有3个词。
Y=1是垃圾邮件。
那么,
假如新来一封邮件为b,c那么特征表示为{2,3}。
那么
那么该邮件是垃圾邮件概率是0.6。
注意这个公式与朴素贝叶斯的不同在于这里针对整体样本求的,而朴素贝叶斯里面针对每个特征求的,而且这里的特征值维度是参差不齐的。
这里如果假如拉普拉斯平滑,得到公式为:
表示每个k值至少发生过一次,这里V为50000,表示有50000中可能的位置值。
另外朴素贝叶斯虽然有时候不是最好的分类方法,但它简单有效,而且速度快,其次朴素贝叶斯实际也是指数分布簇,使用它最后得到的结果同样是logistic回归线性分类器。
6. 总结
本文大部分还是对照着吴恩达老师的中文笔记注释,其中大部分标红的部分为个人的在看视频时的一些理解,希望对大家有帮助,如果文中出现了一些错误的话,也希望大家包含,批评指正。