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. WPF 获取控件模板中的控件

    DG是控件名称public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) wher ...

  2. 源码安装Apache,报错:Cannot use an external APR with the bundled APR-util

    一般在第一次源码安装是没有问题的,在版本变化情况下在次源码安装可能会遇到此问题: apache2.0.x与apache2.2.x在apr有很大区别,前者为依赖公用apr,后者依赖于自身的apr.一般前 ...

  3. postman是如何使用的?

    1.地址:https://segmentfault.com/a/1190000005055899

  4. Python装饰器 计时器记录方法执行性能

    import time def timeit(func): def wrapper(): start = time.clock() func() end =time.clock() print 'us ...

  5. K.Bro Sorting(思维题)

    K.Bro Sorting Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)T ...

  6. EasyPlayer RTSP播放器运行出现: Unable to load DLL 找不到指定的模块。exception from HRESULT 0x8007007E 解决方案

    最近有EasyPlayer RTSP播放器的开发者反馈,在一台新装的Windows Server 2008的操作系统上运行EasyPlayer RTSP播放器出现"Unable to loa ...

  7. visual studio2017 无法添加引用 未能加载包ReferenceManagerPackage not such interface support 解决方法

    安装完visual studio 2017 后添加引用总是提示 未能加载包ReferenceManagerPackage, 这个问题困扰了两天,直到在网上看到了下面这一段 I just got thi ...

  8. 我的Android进阶之旅------>Android自定义窗口标题实例

    该实例的功能比较简单,但是通过该实例的扩展可以在自定义标题中做出菜单导航等实用的功能,为了实现自定义窗口标题,需要做以下几个步骤: 1.给自定义标题提供一个界面 2.将自定义标题应用给Activity ...

  9. python cookbook第三版学习笔记十七:委托属性

    我们想在访问实例的属性时能够将其委托到一个内部持有的对象上,这经常用到代理机制上 class A:     def spam(self,x):         print("class_A: ...

  10. zip 解压脚本

    zip 解压脚本 gpk-unzip.py #!/usr/bin/env python # -*- coding: utf-8 -*- # unzip-gbk.py import os import ...