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. c# 控制台程序 隐藏控制台窗口

    在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口.实现的方法很多,有的是修改链接命令.我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针, ...

  2. hihoCoder #1312 : 搜索三·启发式搜索(A*, 康托展开)

    原题网址:http://hihocoder.com/problemset/problem/1312 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 在小Ho的手机上有 ...

  3. lua(简单的传参)

    #include <iostream> #include <string.h> extern "C" { /*头文件lua.h定义了Lua提供的基础函数,包 ...

  4. Sum of Remainders(数学题)

    F - Sum of Remainders Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I ...

  5. 学习Sharding JDBC 从入门到出门-02:源码揣测

    sjdbc有读写分离的功能,要使用这个功能,在创建数据源对象是要使用类:MasterSlaveDataSource,并且设置主备数据源和数据库名称 这个对象有下面的属性: name:数据库的名称 ma ...

  6. 为什么Git 比 SVN 好

    原文链接:http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html Why Git is better than SVN ...

  7. python+NLTK 自然语言学习处理四:获取文本语料和词汇资源

    在前面我们通过from nltk.book import *的方式获取了一些预定义的文本.本章将讨论各种文本语料库 1 古腾堡语料库 古腾堡是一个大型的电子图书在线网站,网址是http://www.g ...

  8. python学习-4-类的使用

    class Animal: def __init__(self, name): # Constructor of the class self.name = name def talk(self): ...

  9. Linux vim 中文显示乱码解决方法

    因为在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码.改动了一下配置文件,使vi支持gb编码就好了.$vi ~/.vimrclet &a ...

  10. php正则表达式和数组

    一.正则表达式 1. “/”代表定界符,"^"代表起始符号,"$"代表结束符号 $str1="abc123def45ghjk6789lou" ...