zoukankan      html  css  js  c++  java
  • 朴素贝叶斯算法

    朴素贝叶斯算法

    1. 文本分类模型

    在结束生成算法模型之前,我们将一种专门用于文本分类的算法。对于分类问题,朴素贝叶斯算法通常效果很好,而对于文本分类而言,则有更好的模型。

    对于文本分类,之前提到的朴素贝叶斯算法又称之为多元伯努力事件模型(multi-variate Bernoulli event model)。模型分析,在之前已经讨论过了。这里,我们解释一下如何理解数据的生成呢?在该模型中,我们假设邮件是按照先验概率(p(y))随机发送邮件或垃圾邮件到用户手里的,之后遍历词汇表,以伯努力分布生成该邮件单词(特征向量,同时假设了各个单词在邮件中出现的概率是条件独立),之后根据p(xi= 1|y) =φi|y进行后验概率的计算,得到p(y)(只要计算后验概率的分子即可,各个类分母均相等,用于归一化)。该模型中,x取值仅有{01},且生成特征的方式是以遍历词汇表的方式。

    这里我们介绍另外一种方法,称之为多项事件模型(multinomial event model)。为了更好的表示,这里采用另一种表示的方法。其中,xi表示单词i在词汇表中的地址,那么xi取值范围是{1,2,3…|V|},其中 |V| 是词汇表的词汇数量。举个例子而言,一封邮件有n个单词,表示为向量(x1, x2, . . . , xn),注意这里的n对于不同的文档来说是不一样的。举例而言,一封邮件开头是"a nips…"那么x1=1,x2=3500(词汇表中,a是第一个单词,nips是第3500)

    在多项事件模型中,同样看看数据是如何生成呢?我们假设以随机的方式产生(当然还是存在先验概率p(y))垃圾邮件或非垃圾邮件,之后按照多项分布生成邮件中的第一个单词,在同样的分布下,生成其他的单词直到xn(每次的生成都相互独立),因此产生该邮件的全部概率值就是p(y),虽然该生成概率值与之前的多项伯努力分布很像,但是代表含义不同,尤其是xi|y现在是多项分布而不是伯努力分布。

    对于新模型中的参数如下,注意这里假设了对于所有的j(j是样本的下标), p(xj|y)的值均相等(生成哪个单词的概率分布并不依赖于该样本在整体中的位置),其中k表示具体的单词。

    φy = p(y=1)

    φk|y=1 = p(xj=k | y=1)(对于每一个j)

    φk|y=0 = p(xj=k | y=0) )(对于每一个j)

    对于给定的数据集{(x(i), y(i)); i = 1, . . . , m},其中x(i)=(x(i)1, x(i)2, . . . , x(i)ni)(这里的ni表示第i的个样本中的单词数),对于数据的最大似然函数如下:

    求解最大似然函数,结果如下:

    该结果显示,φk|y=1 的分子是单词k在每一封垃圾邮件中的出现次数的总和,分母是每一封垃圾邮件长度的总和;φy分子表示垃圾邮件个数,分母表示样本总数。

    如果采用拉普拉斯平滑,那么结果如下,即在分子中加1,在分母中加上词汇表长度:

    在许多分类问题中,尽管可能不一定是最优模型,贝叶斯模型也是最值得第一个尝试的模型,因为他相对简单且容易解释。

    在文本分类的过程中,通常情况下多项事件模型比朴素贝叶斯模型要好,因为他考虑了词语出现的次数。当然,研究者仍存在争论。在文本分类中,仍然是非常优秀的。当然,考虑了词语的顺序等等,也会提高分类效果,如马尔可夫链模型,但只是很细微提高。

    1. 神经网络模型

    在之前的模型中,无论是logistic回归还是贝叶斯分类(朴素贝叶斯模型是前置假设是多项分布的多项事件模型,所以也可以划到logistic回归)等模型,其最终结果反映在数据上都是一条直线或是一个超平面,即这些模型均是线性模型。如果数据并不线性可分的话,这些模型的性能就会变差。针对该问题,出现了很多针对非线性可分数据进行分类的算法。其中之一就是神经网络模型,这也是出现最早的一种。

    对于logistic回归,我们可以用如下的方法表示:

    其中,Xi是输入的特征变量,中间的sigmoid函数用计算单元的形式表示,最终输出结果。而神经网络就是将这些简单的单元组合起来,如下图所示:

    其中,a1,a2,a3是中间单元的计算输出。通常,我们也会在输入特征中则加x0=1,这样更吻合实际的logistic回归。这里,我们取函数g来表示sigmoid函数,则有下式:

    这里就不再细数神经网络模型,关于神经网络模型是一个非常复杂的模型,包含的种类也很多。采用sigmoid函数作为计算单元(在神经网络中称之为神经元),且仍然采用梯度下降法进行参数的优化,这种神经网络通常称之为反向传播(back propagation)神经网络。

    上面的例子中,与输入直接相连的层称之为隐藏层(hidden layer),与输出直接相连的称为输出层(output layer)。在神经网络中,可以自定义的设置隐藏层中神经元个数,然而我们并不知道隐藏层计算的东西的意义何在,属于黑盒子模型。此外,对于神经网络而言,获得全局最优将会更难,因为它不是凸函数优化,存在很多局部最优解。相比于神经网络,我们会更倾向于svm ,因为svm高效且无需定制,而神经网络用的会比较少,因为其存在严重的优化问题,且相对复杂。

    1. 支持向量机

    在上一讲我们提到了一点SVM,这里我们将详细的讲述SVM算法,当然有一部分认为SVM是最好的分类算法。在监督式学习算法中,SVM无需做出太多的改动,就能得到很好的分类效果。为了更好的讲述SVM,我们需要从划分数据的空间间隔(margins)说起,然后讨论最优间隔分类器(optimal margin classifier),其中会涉及拉格朗日对偶(Lagrange duality)。此外,还会涉及核方法(kernels)以此解决高维特征数据的分类问题,最后我们使用SMO(Sequential minimal optimization,序列最小优化)

    1. 直觉上的间隔

    首先我们从间隔开始说起。这里先从直观的角度去看间隔和分类的效果,之后再正式的推倒。考虑一下logistic回归,概率p(y=1 | x;θ) 是等于hθ(x) = g(θTX) 的,如果hθ(x)大于0.5(或者等价于θTX大于0),那么我们就预测分类结果是1,反之则预测为0。现在我们考虑一个训练样本y=1,如果θTX越大,那么hθ(x) = p(y = 1|x; w, b) 越大,因此我们越有信心(confidence)判断结果为1。通俗的说,如果θTx ≫ 0,那么我们就有十足的信心认为y=1,同样如果θTx ≪ 0,那么我们就有十足的信心认为y=0。因此,对于所有的训练集合,如果我们找到了合适的参数,使得在y(i) =1的样本中 θTx(i) ≫ 0,而在y(i) =0的样本中 θTx(i) ≪ 0,这就暗示了我们有很大的信心说这是一个好的分类器。这个想法看起来很通俗直观,之后我们会用正式的表达式表示函数间隔。

    此外,我们用另一种直观的表示,如下图所示,x标记的点表示y=1的样本点,o标记的点表示y=0的样本点,中间的决策边界(decision boundary)如图所示,该边界直线方程是θTx=0。其中A点离决策边界非常远,那么θTx(i) ≫ 0,也就是说我们有很大的信心认为A点属于y=1类别。而C点离决策边界较近,那么我们就没A点和B点那么大的信心认为C点属于y=1。通俗的说,就是在决策边界的两边的点,距离决策边界越远的点,我们越有信心确定该点的所属分类。即找到一个分割两类样本的决策边界,且使得样本点离决策边界足够远,这样我就更有信心确定该点的所属分类。

    1. 符号表示

    为了更好的讨论SVM,这里使用一些新的符号表示。这里仍然是从二元分类说起,对于类别为y,特征为x的问题,我们使用y ∈ {−1, 1} (与之前的 {0, 1}不同)表示不同的类别。与之前线性分类器不同的向量参数θ不同,这里的参数使用wb,分类器假设为:

    hw,b(x) = g(wTx + b)

    其中,如果z ≥0,则g(z) = 1,反之,z<0,则g(z) = -1。这里设置两个不同参数,故可以把截距项b单独的对待(与之前不同,之前会在特征数据中增加x0=1)。简单的看,b类似于之前的θ0,而w则表示了12,…θn]T。需要注意的是,与之前定义的g不同,这里的g仅有-11两个值,中间并没有估计y=1的概率。

    1. 几何间隔

    这里我们正式的表示函数间隔(functional margin)和几何间隔(类似于点到直线距离公式,但有区别)。对于一个训练样本(x(i), y(i)),函数间隔为

    ˆγ (i)= y(i)(wTx + b)

    如果y(i) = 1,为了让函数间隔ˆγ(i)越大(即预测为y=1类的信心愈大),那么我们希望wTx + b是一个非常大的正数。相反,如果y(i) = -1,为了让函数间隔ˆγ(i)越大,那么我们希望wTx + b是一个非常小的负数。此外,如果y(i)(wTx + b) > 0,则说明该样本的分类预测正确。因此,函数间隔ˆγ(i)越大,则说明我们越有信心得到一个正确的分类结果。

    对于一个选择了函数g(仅有结果{-1,1})的线性分类器,有一个特征使得他并不能很好的度量信心。对于g,如果我们把wb分别用2w2b来替换,那么g就可以表示为g(2wTx + 2b),但是这对hw,b(x)没有任何影响,因为hw,b(x)仅依赖于正负号。但是对于间隔来说却是翻倍了,换句话说我们不需要考虑实际的样本,而仅通过改变wb的值就可以无限的扩大间隔。因此,直觉上我们希望通过归一化如||w||2= 1来解决这个问题。我们之后在进行讨论归一化的问题。

    上面的函数间隔定义是针对于一个样本,而对于给定的数据集S = {(x(i), y(i)); i = 1, . . . , m},这里我们定义的函数间隔为有所间隔中最小的间隔:

    ˆγ= mini=1-m( γ(i) )

    现在我们讨论一下几何间隔(geometric margins),考虑下图:

    对应(w, b)的决策边界如图所示,其中w正交于超平面。(对于直线 wT x+b=0,方向为 )。对于表示训练集合中输入特征x(i)且分类为y(i) =1A点而言,它到决策边界的距离为 γ(i),即线段AB。那么我们如何求得γ(i)呢?我们知道w/||w|| 表示BA的单位向量,即方向向量w的单位向量。对于已知A点是x(i),那么B点的输入为:x(i) (i) *( w/||w||) (即由A点按照向量w的反方向移动γ(i)个单位之后得到B)。同时,我们知道B点在决策边界上,满足决策边界方程。因此有:

    wT ( x(i) (i) *(w/||w||) ) + b = 0

    因为wTw/||w|| = ||w||,因此求得γ(i) = (wT/||w|| ) x(i) + b / ||w|| 。这里求得的距离是针对y=1A点,距离γ是正数。如果是在决策边界的另一侧呢?

    更普遍的说,我们定义几何距离(geometric margin),对于给定的训练样本(x(i) y(i) ),几何距离如下:

    γ(i) = y(i) ( (wT / ||w|| ) x(i) + b / ||w|| )

    注意如果 ||w|| = 1,那么几何间隔恰好等于函数间隔,这也就是两种不同表示之间的关系。同样,几何间隔不随着参数wb尺度的改变而改变。举例而言,如果wb分别扩大一倍为2w2b,那么几何间隔不会变化(因为分母||w||也会随之变为2||w||)。在后面。这会非常方便做一些变化处理等,比如我们可以利用这该不变性灵活的处理wb,比如通过缩放wb使得|w1| = 5 或者 |w1 + b| + |w2| = 2等等。

    最后,对于给定的训练集合S = {(x(i), y(i)); i = 1, . . . , m},这里我们定义的几何间隔为有所几何间隔中最小的间隔:

    γ= mini=1-m( γ(i) )

  • 相关阅读:
    tensorflow2.0——手写数据集预测(多元逻辑回归)
    tensorflow2.0——鸢尾花数据集的一元分类
    tensorflow2.0——实现波士顿房价数据集的分类问题
    tensorflow2.0——代码实现一元逻辑回归
    tensorflow2.0——交叉熵损失函数
    tensorflow2.0——波士顿房价数据预测(3)
    子序列计数
    HDU 5687 Problem C
    linux中巧用ctrl-z后台运行程序
    Failed to set MokListRT: Invalid Parameter Something as gone seriously wrong: import_mok_state() failed: Invalid Parameter
  • 原文地址:https://www.cnblogs.com/kexinxin/p/9904402.html
Copyright © 2011-2022 走看看