机器学习(三)—支持向量机(1)

摘要:

  本文对支持向量机做了简单介绍,并对线性可分支持向量分类机、线性支持向量分类机以及核函数做了详细介绍。

  最近一直在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习,今天学习支持向量机(Support Vector Machines,SVM),这个无论是在模式识别还是机器学习等领域都赫赫有名的工具。

  支持向量机是一项借助于最优化方法来解决机器学习问题的新工具,最初由 V.Vapnik 等人提出,近几年来其在理论研究和算法实现等方面都取得了很大的进展,开始成为克服“维数灾难”和过学习等困难的强有力的手段。

1. 最大间隔分隔数据

  我们知道分类的目的是学会一个分类器,将数据库中的数据映射到给定类别中的某一个,实现对未知数据类别的预测。

  对于二维数据集,将数据集分隔开的直线称为分隔超平面,如果分隔的是三维的,分类的就是面,如果是更高维的就是超平面。将分类的决策边界统称为超平面,分布在超平面一侧的所有数据都属于某个类别,而分布在另一侧的所有数据都属于另一个类别。

那么对于分类而言,合理的构建分类器就尤为重要了,怎样才能构造分类器使得分类结果更为可信。下面举个例子说明:

   对于左图坐标中的两类图形,如果让你画一条线,合理的将它们分开,你会如何怎样划分?这分法可就多了,到底哪种分法最好呢?我们可以引入一个实际问题:假设这两类图形分别代替的是两个居民区,现要在两居民区之间修一条路,那么该怎么修?我想大多数人都会选择那条红线吧,这条路权衡了远和近,也可以理解为折中,相对于每个点而言都是最公平的。

  该例子就可以看成是在样本中寻找超平面将不同类别分开,那么为了更好的分类,就要使得不同类别之间的间隔最大,(间隔指的是点到分隔面的距离),这样如果分错或者在有限数据上训练分类器的话,也能最大程度的保证分类器的健壮。上述例子是在二维平面中寻找超平面,直接用肉眼就可以抉择,然而如果是三维或者更高维的情况,单凭人类肉眼是无能为力的,但机智的我们是可以通过计算机来寻找啊,通过相应的数学知识,建立对应的数学模型,通过计算机来求解。

  这种寻找超平面分类思想就是SVM的思想,下来我们学习支持向量机。

2. 支持向量机

  用于分类的SVM本质上是一个二类分类模型。SVM属于监督学习,目的是在给定一个包含正例和反例的样本集合中寻找一个超平面对样本中的正例和反例进行分割,同时保证正例和反例之间的间隔最大。这样使得分类结果更为可信,而且对于未知的新样本才能有更好的分类预测能力。为了达到类别之间间隔最大,我们不需要考虑所有点,只需要让离分隔超平面最近的点距离分隔面的距离尽可能远即可,这里距离分隔超平面最近的那些点就是支持向量

下面来讲述一下SVM的原理:

首先,给定N个训练样本:{(x1,y1),(x2,y2)…(xn,yn)},其中x是d维向量,表明了每个样本具有d个属性;yi指的是类别,其中,yi属于{-1,1}。寻找一个实值函数g(x),从而用分类函数f(x) = sgn(g(x))推断任意一个样本x所对应的y值。

(1)硬间隔超平面

  线性可分SVM就是用上述的N个样本去训练学习得到一个线性分类器,也就是得到一个超平面:f(x) = sgn(w•x+b),线性可分表明当w•x+b>0时,对应的f(x) = 1,相应的当w•x+b<0时,对应的f(x) = -1,而w•x+b = 0就是所要寻找的超平面,此时对应的超平面为硬间隔超平面。接下来我们就来寻找这个超平面,基于之前的分析,这里我们需要将样本分成两类,且保证分隔面到这两类中最近的点的距离尽可能的远,下面我们结合数学公式进行分析:

如上图所示,我们要寻找一个超平面最大的分隔这两个类,保证这两个类别之间的距离尽可能大,问题可以转化为最大化这两个类别中距离分隔面最近的点(支持向量)之间的距离。

首先,在上图中找到两个和这个超平面平行且距离相等的超平面:w•x+b = -1和w•x+b = 1,保证在这两个超平面之间没有任何样本点,那么问题就可转化为最大化这两个超平面之间的距离;进而结合相关的数学知识,因为超平面均二维,则它们之间的距离可表示为:d = |1+1|/sqrt(w12 + w22) = 2 / ||w||,问题就是最大化2 / ||w||,可以转化为最小化||w||;最后结合两个超平面之间没有任何样本点这个约束,则有:对于任何一个正样本yi=+1,它都要处于w•x+b = 1这个超平面的右边,即要保证:y= w•x+b>=+1,同理对于任何一个负样本yi=-1,它都要处于w•x+b=-1的左边,也就是要保证:y = w•x+b <=-1,于是可以合并为:yi (w•xi+b)>=1。

于是寻找最优超平面的问题就可以转化为二次规划问题:

      min ||w||2/2

      s.t.  yi (w•xi+b)>=1    i = 1,2,...,N

该问题的特点是目标函数是凸函数,并且约束条件为线性,则可以引入lagrange函数:

进而根据wolf对偶的定义,将原问题的各变量偏导置零有:

进而带入拉格朗日函数可将问题转化为原问题的拉格朗日对偶问题:

求解上述问题的最优解,计算w*和b*:

由KKT互补条件可得:

只有当xi为支持向量的时候,对应的ai*才为正,否则皆为0,选择a*的一个正分量,计算可得:

由此可以构造分类超平面(w*•x)+b* = 0,由此求得决策函数:

  

进而得到分类函数:

        

从而对未知类别进行分类。根据KKT的条件,只有当xi为支持向量的时候,对应的ai*才为正,否则皆为0。所以,我们只需求得新来的样本和支持向量的内积,然后运算即可。

(2)软间隔超平面

  上面所分析的是样本点线性可分的情况,我们在寻找硬间隔超平面时,首先是找到了两个分类边界,并假定所有的样本点都在这两个分类边界以外,但现实不总是那么尽人意,下面这种情况也势必会遇到:

这幅图里正类和负类都有点跑到“另类”的地盘,这时候就找不到一条直线将它们分开了,那要如何才能折中呢?对于这种数据点有一定偏离超平面的情况,我们仍然能继续使用超平面进行划分,只是这时要对间隔进行“软化” ,构造软间隔超平面。简言之就是在两个分类边界之间允许出现样本点,这类样本点被称为边界支持向量。 这种向量机成为线性支持向量分类机,如下图所示:

对于该问题软化的方法是引入松弛变量:

从而得到软化之后针对于原问题的约束条件为:

松弛变量的设置,允许了某些样本点出现在对方的区域中,当松弛变量充分大时,样本点总是满足上述的约束条件,但也是要设法避免取值太大。为此我们可以重新调整目标函数,引入惩罚因子C,对离群点进行惩罚,则二次规划问题转化为:

  ,其中,C>0

对应的拉格朗日函数为:

对应原问题的对偶问题为:

我们发现与线性可分模型中知识多了C>=a这个约束条件,按照之前的方法,同理计算得:

    

分类函数为:

其中 C为无穷大时,就等价于线性可分的情形。

(3) 核函数

  上面讲述的是线性支持向量分类机,其中允许一定程度上的离群点,那若是样本点真的是线型不可分呢,那就得采用核函数进行处理了。

  联系到T.M.Cover的模式可分性定理:一个复杂的模式分析问题映射到高维空间后,会比在低维空间线性可分。核方法就是通过非线性映射将原始数据通过特征映射嵌入到新的特征空间(Hilbert空间),发现数据在特征空间上的线性模式,进而选取相应的核函数利用输入计算内积。根据对偶解法可得算法所需要的信息位于特征空间上数据点之间的内积,维数过大时会影响算法的高效性,所以,将内积作为输入特征的直接函数,更高效的计算内积,减少了算法的时间复杂度。

常用的核函数有:

基于上述分析,对于线型不可分的样本点,问题就转化为在Hilbert空间中寻找超平面:,相应的转化为二次规划问题:

其中核函数K满足条件:  

我们再次选用RBF核函数,得到拉格朗日对偶问题:

    

相应的计算求得分类函数为:

接下来就可以据此对线性不可分问题进行分类了。因为大多数的a*是0,所以我们只需要计算新样本和少量的训练样本的核函数,求和去符号就可完成新样本的分类了。而采用不同的核函数,相当于采用不同的相似度对样本进行分类。

至此,关于支持向量机的相关知识大致就学习完了,之后的一些细节也将继续学习。

时间: 2024-10-05 10:38:17

机器学习(三)—支持向量机(1)的相关文章

OpenCV 机器学习之 支持向量机的使用方法实例

用支持向量机进行文理科生的分类,根据的特征主要是 数学成绩与语文成绩,这两个特征都服从高斯分布 程序代码例如以下: 分类结果: OpenCV 机器学习之 支持向量机的使用方法实例

机器学习之支持向量机(三):核函数和KKT条件的理解

注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对偶函数的对偶因子α:第二部分是SMO算法对于对偶因子的求解:第三部分是核函数的原理与应用,讲核函数的推理及常用的核函数有哪些:第四部分是支持向量机的应用,按照机器学习实战的代码详细解读. 1 核函数 1.1 核函数的定义 设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一

机器学习 (三) 逻辑回归 Logistic Regression

文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人笔记,为我做个人学习笔记提供了很好的参考和榜样. § 3.  逻辑回归 Logistic Regression 1 分类Classification 首先引入了分类问题的概念——在分类(Classification)问题中,所需要预测的$y$是离散值.例如判断一封邮件是否属于垃圾邮件.判断一个在线交

机器学习笔记——支持向量机(3)

八.核(kernel) 如果样本点为线性不可分,那么,需要将数据映射到高维空间,使在原始空间内其线性可分变为线性可分.如下图所示: 上文提到,分类器可以写成: 那么,如果使用一种映射的方法,将低维数据映射到高维(),使得线性不可分变为线性可分.称为特征映射函数,这样,分类器就变为: (1)实例 低维映射到高维能否将线性不可分变为线性可分呢?下面就举个例子来看.假设数据可以用决策的边界表示(如下图左所示),那么,利用, ,做映射,可以得到决策边界:.经过上述的映射变换,原来在圆内的点都在超平面的一

机器学习——svm支持向量机的原理

前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末参考链接),但在描述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整概括和介绍支持向量机的导论性的文章. 本文在写的过程中,参考了不少资料,包括<支持向量机导论>.<统

机器学习之支持向量机(四):支持向量机的Python语言实现

注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对偶函数的对偶因子α:第二部分是SMO算法对于对偶因子的求解:第三部分是核函数的原理与应用,讲核函数的推理及常用的核函数有哪些:第四部分是支持向量机的应用,按照机器学习实战的代码详细解读. 1 数据样本集的介绍 这篇文章是根据<机器学习实战>一书的实例进行代码的详细解读,我在查找这方面的资料没有人对

机器学习(十一) 支持向量机 SVM(上)

一.什么是支撑向量机SVM (Support Vector Machine) SVM(Support Vector Machine)指的是支持向量机,是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类以及回归分析. Vapnik等人在多年研究统计学习理论基础上对线性分类器提出了另一种设计最佳准则.其原理也从线性可分说起,然后扩展到线性不可分的情况.甚至扩展到使用非线性函数中去,这种分类器被称为支持向量机(Support Vector Machine,简称SV

关于机器学习中支持向量机相关问题

前言 在机器学习中,分类问题占了很大一部分,而对于分类问题的处理有很多方法,比如决策树.随机森林.朴素贝叶斯.前馈神经网络等等:而最为常见的分类需求一般是二分类问题,即将样本分为两个集合,然后通过学习某些参数,对新的输入进行识别并划分到正确的类别中. 在解决分类问题中,应该说线性分类器就是最为简单的一类,虽然说起来较为简单,但其能处理的情况还是比较多的,而最为常用的一种线性分类器就是所谓的支持向量机(Support Vector Machine,简称SVM):其基本原理就是构建一个(对于而分类而

机器学习之支持向量机(一):支持向量机的公式推导

注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对偶函数的对偶因子α:第二部分是SMO算法对于对偶因子的求解:第三部分是核函数的原理与应用,讲核函数的 http://p.baidu.com/itopic/main/qlog?qid=eeb76162633965383962333600&type=questionloghttp://p.baidu.c

机器学习(三) Jupyter Notebook, numpy和matplotlib的详细使用 (上)

工欲善其事,必先利其器.在本章,我们将学习和机器学习相关的基础工具的使用:Jupyter Notebook, numpy和matplotlib.大多数教程在讲解机器学习的时候,大量使用这些工具,却不对这些工具进行系统讲解.我特意添加了这个章节,让同学们在后续编写机器学习算法的过程中,更加得心应手! 一.Jupyter Notebook基础 a--b:在Jupyter Notebook  选中的内容上面添加单元格------ 下面添加单元格 y: change cell to code m: ch