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 ,即垃圾邮件里是成立的。

因此,我们有:

p(x1,x2,...x5000|y)=p(x1|y)p(x2|y,x1)p(x3|y,x1,x2)...p(x5000|y,x1,x2,...x4999)=p(x1|y)p(x2|y)p(x3|y)...p(x5000|y)=∏i=1np(xi|y)

这个模型可以由 ϕ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,

我们可以得到训练数据的联合概率

L(ϕy,ϕi|y=0,ϕi|y=1)=∏i=1mp(x(i),y(i))

利用最大似然估计,可以得到:

ϕj|y=1ϕj|y=0ϕy=∑mi=11{x(i)j=1∧y(i)=1}∑mi=11{y(i)=1}=∑mi=11{x(i)j=1∧y(i)=0}∑mi=11{y(i)=0}=∑mi=11{y(i)=1}m

上式中,符号∧表示逻辑运算“与”,ϕj|y=1表示垃圾邮件中第j个单词出现的概率,一旦得到所有的参数,那么给定一个新的特征向量,要判断其是不是垃圾邮件,我们可以计算其概率:

p(y=1|x)=p(x|y=1)p(y=1)p(x)=(∏ni=1p(xi|y=1))p(y=1)(∏ni=1p(xi|y=1))p(y=1)+(∏ni=1p(xi|y=0))p(y=0)

最后,我们要注意,虽然我们提出的Naive Bayes 算法处理的是二值化的特征向量,但是对于多个离散值的情况,我们可以用多项式分布代替伯努利分布对 p(xi|y) 进行建模。

Laplace Smoothing

Naive Bayes学习算法可以很好地处理很多分类问题,接下来,我们要讨论如何对该算法做一点小小地改进让它更好地工作,特别是处理文本分类问题。在介绍这个改进之前,我们先来看一个问题。

假设我们用Naive Bayes算法建立了一个分类器对邮件进行分类,对一封邮件的单词进行判断从而确定该邮件是否垃圾邮件。如果有一封新邮件,里面含有一个从未见过的单词,即在训练样本里面从未出现过的单词,我们假设该单词在字典里的顺序为j,那么Naive Bayes 算法对该单词的最大似然估计为:

ϕj|y=1ϕj|y=0=∑mi=11{x(i)j=1∧y(i)=1}∑mi=11{y(i)=1}=0=∑mi=11{x(i)j=1∧y(i)=0}∑mi=11{y(i)=0}=0

因为训练集里的样本邮件(不管是不是垃圾邮件)都没有这个单词,所以估计得参数 ϕj|y=1 和 ϕj|y=0 都是0,当我们要确定含有该单词的某封邮件是不是垃圾邮件时,我们可以计算其后验概率为:

p(y=1|x)=p(x|y=1)p(y=1)p(x)=(∏ni=1p(xi|y=1))p(y=1)(∏ni=1p(xi|y=1))p(y=1)+(∏ni=1p(xi|y=0))p(y=0)=00

因为 ∏ni=1p(xi|y) 中含有 p(xj|y)=0, 所以使得最终计算的后验概率为 0/0, 这个结果无法进行预测。这显然不是我们希望看到的。换句话说,如果因为一个训练集中从未出现的单词,而将概率估计为0,这是个很糟糕的想法。

为了避免这个尴尬的问题,我们可以利用Laplace Smoothing, 则新的概率估计为:

ϕj|y=1ϕj|y=0=∑mi=11{x(i)j=1∧y(i)=1}+1∑mi=11{y(i)=1}+2=∑mi=11{x(i)j=1∧y(i)=0}+1∑mi=11{y(i)=0}+2

可以看到,我们在分子,分母上分别加了一个常数,这样可以避免概率为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个训练样本的单词个数,则训练数据的似然率为:

L(ϕ,ϕi|y=1,ϕi|y=0)=∏i=1m(x(i),y(i))=∏i=1m⎛⎝∏j=1np(x(i)j|y;ϕi|y=1,ϕi|y=0)⎞⎠p(y(i);ϕy)

利用最大似然估计,可以得到

ϕk|y=1ϕk|y=0ϕy=∑mi=1∑nij=11{x(i)j=k∧y(i)=1}∑mi=11{y(i)=1}ni=∑mi=1∑nij=11{x(i)j=k∧y(i)=0}∑mi=11{y(i)=0}ni=∑mi=11{y(i)=1}m

如果我们利用Laplace Smoothing估计 ϕk|y=1和ϕk|y=0,我们可以对分子加常数1,对分母加常数|V|,则可以得到:

ϕk|y=1ϕk|y=0=∑mi=1∑nij=11{x(i)j=k∧y(i)=1}+1∑mi=11{y(i)=1}ni+|V|=∑mi=1∑nij=11{x(i)j=k∧y(i)=0}+1∑mi=11{y(i)=0}ni+|V|

这个就是multinomial event model的概率估计。

参考文献

Andrew Ng, “Machine Learning”, Stanford University.

机器学习 Generative Learning Algorithm (B)的更多相关文章

  1. 机器学习 Generative Learning Algorithm (A)

    引言 前面几讲,我们主要探讨了如何对 p(y|x;θ) (即y 相对于x的条件概率)进行建模的几种学习算法,比如,logistic regression 对 p(y|x;θ) 进行建模的假设函数为 h ...

  2. 生成学习算法(Generative Learning algorithms)

    一.引言 前面我们谈论到的算法都是在给定\(x\)的情况下直接对\(p(y|x;\theta)\)进行建模.例如,逻辑回归利用\(h_\theta(x)=g(\theta^T x)\)对\(p(y|x ...

  3. Andrew Ng机器学习公开课笔记 -- Generative Learning algorithms

    网易公开课,第5课 notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 学习算法有两种,一种是前面一直看到的,直接对p(y|x; θ)进行建模 ...

  4. 【Perceptron Learning Algorithm】林轩田机器学习基石

    直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...

  5. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  6. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

  7. 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)

    ##机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2)---#####注:机器学习资料[篇目一](https://github.co ...

  8. 微软推 Azure 机器学习工具:Algorithm Cheat Sheet

    微软推 Azure 机器学习工具:Algorithm Cheat Sheet [日期:2015-05-15] 来源:CSDN  作者:Linux [字体:大 中 小]   Azure Machine ...

  9. 机器学习(Machine Learning)&amp;深度学习(Deep Learning)资料

    机器学习(Machine Learning)&深度学习(Deep Learning)资料 機器學習.深度學習方面不錯的資料,轉載. 原作:https://github.com/ty4z2008 ...

随机推荐

  1. windowsphone8.1学习笔记之应用数据(四)

    应用数据的存储格式常用的分为json和xml两种(其实我都想略过这个地方的,json我一直用的是json.net,而wp上操作xml的方式与其他相比也没太多变化). 先说说json数据存储,关于jso ...

  2. 九度OJ 1195:最长&最短文本 (搜索)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3144 解决:1156 题目描述: 输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输 ...

  3. Linux环境安装Nginx详细步骤

    1.yum解决编译nginx所需的依赖包,之后你的nginx就不会报错了yum install gcc patch libffi-devel python-devel  zlib-devel bzip ...

  4. python __name__及__main()__的妙处

    #hello.py def sayHello(): str="hello" print(str); if __name__ == "__main__": pri ...

  5. 中国移动OnetNet云平台 GET指令使用

    GET /devices//datastreams/KEY HTTP/1.1 Host: api.heclouds.com api-key: pmWLtnkDBSreKfvg7GsClUXdXa4A ...

  6. AbstractQueuedSynchronizer(一)

    应该将子类定义为非公共内部帮助器类,一般并发包类用内部类Sync sync来继承并实现.为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架.此类的设计目 ...

  7. Linux Shell 下的输出重定向

    linux 环境中支持输入输出重定向,用符号<和>来表示. 0.1和2分别表示标准输入.标准输出和标准错误信息输出, 可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表 ...

  8. c的详细学习(11)文件

    为了提高数据输入/输出的处理效率,可以将程序运行时所需要的原始数据从文件中读取,并将程序运行的结果写入到文件中.     (1)文件概述     1)基本概念 文件是指存储在外部介质上数据的集合,可以 ...

  9. 视图的创建与使用 Sql Server View

    创建教材的三个数据表Student.Course及SC. create database S_T Use S_T CREATE TABLE Student (Sno CHAR(9), Sname CH ...

  10. 申请内存的方式(1,malloc/free;2,new/delete)

    一.malloc/free的方式 // 4个int 的大小int *p = (int*) malloc(16); for (int i = 0; i < 4; ++i) { p[i] = i; ...