机器学习 Generative Learning Algorithm (B)
Naive Bayes
在GDA模型中,特征向量x是连续的实数向量,在这一讲里,我们将要讨论另外一种算法用来处理特征向量x是离散值的情况。
我们先考虑一个例子,用机器学习的方法建立一个垃圾邮件过滤器,我们希望用一种算法来甄别邮件的信息以确定该邮件是不是垃圾邮件,通过学习这个算法,我们将能建立自己的垃圾邮件过滤器帮我们对邮件进行分类,邮件分类只是一系列我们称之为文本分类中的一种。
首先假设我们有一个训练集(包括了垃圾邮件和正常的邮件),我们用特征向量x表示一封邮件,特征向量的长度等于该邮件所含有的单词的数量,这些单词包含在我们预先建立的一部字典里。如果该邮件的第i个单词在该字典里,则该特征向量的第i个分量为1,即xi=1,反之xi=0. 邮件里每一个单词对应该特征向量的某个分量,单词的数量决定了该特征向量的长度。
现在,我们想建立一个分类模型来决定该邮件是不是垃圾邮件。所以我们要估计p(x|y),假设一封邮件有5000个单词,那么该特征向量就是5000维,即 x∈{0,1}5000,(x是一个只含有0和1的5000维的向量),如果我们用多项分布来对特征向量进行建模,那么该特征向量有25000 种可能,这个数据量显然太大了。
为了更方便的估计p(x|y),我们要做一个强一点的假设,我们假设邮件里的单词,即xi是相互\textbf{条件}独立的,这个假设称为Naive Bayes (NB) 假设,相应的算法称为Naive Bayes 分类。比如,如果 y=1 表示该邮件是垃圾邮件,那么单词A 和单词B 之间是相互条件独立的,也就是说如果邮件是垃圾邮件,那么该邮件中的单词A 出现的概率与单词B 出不出现没有关系,更一般地,我们可以得到如下关系:p(xi|y=p(xi|y,xj)), xi 表示单词A 是特征向量的第{i}个分量,xj表示单词B 是特征向量的第j个分量。(但是请注意:这不是说单词A 和单词B 是相互独立的,所以不能简单的写成:p(xi|y=p(xi|xj)), 这个是容易理解的,因为一般来说单词是有一定联系的,但是对于垃圾邮件来说,我们可以假设这些单词是毫无规律,没有任何联系,所以这里会强调单词之间的关系是条件独立的,也就是单词的相互独立在y=1 ,即垃圾邮件里是成立的。
因此,我们有:
这个模型可以由 ϕ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,
我们可以得到训练数据的联合概率
利用最大似然估计,可以得到:
上式中,符号∧表示逻辑运算“与”,ϕj|y=1表示垃圾邮件中第j个单词出现的概率,一旦得到所有的参数,那么给定一个新的特征向量,要判断其是不是垃圾邮件,我们可以计算其概率:
最后,我们要注意,虽然我们提出的Naive Bayes 算法处理的是二值化的特征向量,但是对于多个离散值的情况,我们可以用多项式分布代替伯努利分布对 p(xi|y) 进行建模。
Laplace Smoothing
Naive Bayes学习算法可以很好地处理很多分类问题,接下来,我们要讨论如何对该算法做一点小小地改进让它更好地工作,特别是处理文本分类问题。在介绍这个改进之前,我们先来看一个问题。
假设我们用Naive Bayes算法建立了一个分类器对邮件进行分类,对一封邮件的单词进行判断从而确定该邮件是否垃圾邮件。如果有一封新邮件,里面含有一个从未见过的单词,即在训练样本里面从未出现过的单词,我们假设该单词在字典里的顺序为j,那么Naive Bayes 算法对该单词的最大似然估计为:
因为训练集里的样本邮件(不管是不是垃圾邮件)都没有这个单词,所以估计得参数 ϕj|y=1 和 ϕj|y=0 都是0,当我们要确定含有该单词的某封邮件是不是垃圾邮件时,我们可以计算其后验概率为:
因为 ∏ni=1p(xi|y) 中含有 p(xj|y)=0, 所以使得最终计算的后验概率为 0/0, 这个结果无法进行预测。这显然不是我们希望看到的。换句话说,如果因为一个训练集中从未出现的单词,而将概率估计为0,这是个很糟糕的想法。
为了避免这个尴尬的问题,我们可以利用Laplace Smoothing, 则新的概率估计为:
可以看到,我们在分子,分母上分别加了一个常数,这样可以避免概率为0,而在实际的应用中,因为对训练集中对垃圾邮件和非垃圾邮件的划分通常比较合理,所以参数ϕy一般是一个比较合理的数,所以对ϕy的估计不需要利用 Laplace Smoothing.
Event models for text classification
最后,在结束Generative Learning 学习算法之前,我们再介绍一种针对文本分类问题的模型,虽然 Naive Bayes 算法可以很好地处理很多分类问题,但是对于文本分类,还有一种更加好的模型。
之前介绍的特定语境的文本分类问题,这里介绍的Naive Bayes算法用的是我们称之为\textbf{multi-variate Bernoulli event model},在这个模型中,我们对一封邮件,先根据先验概率p(y)计算其为垃圾邮件的概率,然后把这封邮件用事先建立好的字典进行检索,将出现的单词计算其概率p(xi=1|y)=ϕi|y, 最终该邮件是否为垃圾邮件的概率为:p(y)∏ni=1p(xi|y).
接下来,我们将介绍另外一种更加高效的模型,称为multinomial event model, 为了描述这个模型,我们使用不同的注释和特征来表示一封邮件。我们定义 xi 表示邮件里的第i个单词,xi 可以取整数值,其取值范围为{1,...|V|}, 其中|V|表示预先建立的字典里的单词数目,含有n个单词的一封邮件可以表示成一个n维向量(x1,x2,...xn), 不同的邮件单词数量不同,所以其特征向量的维数也不一样,注意:xi表示邮件的第i个单词,但它的取值是该单词在字典里的序号,比如xi表示邮件的第i个单词A, 但是单词A在字典里序号是1000,则xi=1000,在multinomial event 模型中,同样存在一个先验概率p(y)。然后,我们利用多项式分布计算第一个单词的概率p(x1|y),接下来计算第二个单词的概率,第二个单词与第一个单词是相互独立的,同样的方式,计算第三,第四,直到第n个单词,因此整封邮件的概率为p(y)∏ni=1p(xi|y),可以看到这个表达式和multi-variate Bernoulli event模型的概率表达式相似,但是他们的分布是不同的,一个是伯努利分布,一个是多项式分布。
这个模型我们需要计算的参数有ϕy=p(y), ϕi|y=1=p(xj=i|y=1) (对任何的j), ϕi|y=0=p(xj=i|y=0). 注意到我们假设对所有的j,p(xj|y)的概率是一样的(意味着一个单词出现的概率与该单词在邮件中的位置无关)。
如果给定一组训练样本 (x(i),y(i));i=1,...m, 其中x(i)=(x(i)1,x(i)2,...x(i)ni), ni 表示第i个训练样本的单词个数,则训练数据的似然率为:
利用最大似然估计,可以得到
如果我们利用Laplace Smoothing估计 ϕk|y=1和ϕk|y=0,我们可以对分子加常数1,对分母加常数|V|,则可以得到:
这个就是multinomial event model的概率估计。
参考文献
Andrew Ng, “Machine Learning”, Stanford University.
机器学习 Generative Learning Algorithm (B)的更多相关文章
- 机器学习 Generative Learning Algorithm (A)
引言 前面几讲,我们主要探讨了如何对 p(y|x;θ) (即y 相对于x的条件概率)进行建模的几种学习算法,比如,logistic regression 对 p(y|x;θ) 进行建模的假设函数为 h ...
- 生成学习算法(Generative Learning algorithms)
一.引言 前面我们谈论到的算法都是在给定\(x\)的情况下直接对\(p(y|x;\theta)\)进行建模.例如,逻辑回归利用\(h_\theta(x)=g(\theta^T x)\)对\(p(y|x ...
- Andrew Ng机器学习公开课笔记 -- Generative Learning algorithms
网易公开课,第5课 notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 学习算法有两种,一种是前面一直看到的,直接对p(y|x; θ)进行建模 ...
- 【Perceptron Learning Algorithm】林轩田机器学习基石
直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)
##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.co ...
- 微软推 Azure 机器学习工具:Algorithm Cheat Sheet
微软推 Azure 机器学习工具:Algorithm Cheat Sheet [日期:2015-05-15] 来源:CSDN 作者:Linux [字体:大 中 小] Azure Machine ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料
机器学习(Machine Learning)&深度学习(Deep Learning)资料 機器學習.深度學習方面不錯的資料,轉載. 原作:https://github.com/ty4z2008 ...
随机推荐
- iOS - 每隔一段时间,反复执行同一个任务
我们有时候会有这样的需求,当程序处于运行状态,每隔几秒给服务器发送一次请求. 这时我们可以这样处理: UILocalNotification *localNotification = [[UILoca ...
- 逻辑英语 第四季 Speaking and Listening
1. 发音的变革 背字典:牛津双解/朗文英汉 a. 如何一分钟变伦敦腔 发音有两种:伦敦腔/其他 生理分析: ① 后置发音:瞬间华丽变声第一步 东方人靠嘴巴发音: 西方人用胸腔发音[有共鸣] 方法1: ...
- 记录-移动端网页触摸内容滑动js插件
需求: 在webapp中需要左右滑动手机,移动主页的轮播图.也可用在引导页(欢迎页)的大图左右滑动 可用: 百度:swiper插件 在项目中导入插件,这里只有部分代码,具体百度swiper <l ...
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...
- zookeeper curator CRUD
目录 Curator客户端的基本操作 写在前面 1.1.1. Curator客户端的依赖包 1.1.2. Curator 创建会话 1.1.3. CRUD 之 Create 创建节点 1.1.4. C ...
- linux c编程:进程控制(四)进程关系
每一个进程除了有一个进程ID外,还属于一个进程组. 进程组是一个或多个进程的集合,通常情况下,他们是在同一作业中结合起来的,同一进程组的个进程接受来自同一终端的各种信号. 每一个进程组有一个唯一的进 ...
- ABAP下载服务器文件到本机
转自http://blog.sina.com.cn/s/blog_701594f40100l8ml.html ABAP:下载服务器文件到本机 对服务器的文件进行读写操作,SAP提供了OPEN DATA ...
- full_case parallel_case学习心得
一般情况下,DC把case语句综合成选择器电路,但也可能把case语句综合成优先权译码电路.有时,优先权译码电路是不必要的,这是可以使用“// synopsys parallel_case”引导语句强 ...
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...
- t-sql判断数据库对象是否存在
1 系统表sys.sysobjects 在数据库中创建的每个对象(例如约束.默认值.日志.规则以及存储过程)都对应一行,详细介绍参考MSDN 2 OBJECTPROPERTY 返回当前数据库中架构范围 ...