本文转自公众号 象物(xiangwu_world)
支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,在统计学习理论的基础上发展起来的一种机器学习方法。在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并被推广应用到函数拟合等其他机器学习问题中。
在SVM出现之前,感知机和神经网络算法被广泛研究,他们也都是用于分类的算法。基于SVM的研究则是为了能更好的找到最优分类面。与前两者相较,SVM的优势在于可以运用核函数把低维空间中的点映射到高维空间,从而能够对非线性可分数据进行分离。
SVM是机器学习里用的比较多的一种分类算法。它是一种二类分类器,简言之,能够实现一个分类面对两类数据进行分类。这个分类面被叫做超平面。
之所以称之超平面,是因为SVM分类的数据可能是高维的。一维的分类面是一个点,二维的是一条直线,三维的是一个平面,更高维的就是超平面了。
下面我们来模拟一下SVM的简单实现过程:
首先,我们输入一个随机的线性数据集,如图1:
图1 一个给定的随机数据集
当我们对数据进行二分类时,分类面的方向和位置可以由无数种可能,那么怎么确定哪一个是最好的分类界限呢?
图2 对随机数据集寻找二分类面
实际计算过程中,SVM所要找的这个分类面需要满足两个条件:一分类面与两类样本间的距离相等;二分类面与两类样本间的距离最大。
因此,我们可以定义一个函数来表示间隔,进而只要找到函数的最大值就可以求出最大间隔,即找出最适的超平面了。
那么表示间隔的这个函数怎么求最大值呢?高等数学中我们学过拉格朗日函数求最值的方法,即引入拉格朗日乘子。这里我们同样用拉格朗日的方法来求间隔的最大值。这是一个有约束条件的优化问题:约束条件是指SVM的所要找的超平面要满足的条件,即距离两类样本等间距,优化问题是指求间隔的最大值。通过求这个优化问题就可以求出最大间隔和分类面,我们要求的SVM就得到啦~~
聊到这,我们需要考虑另一个问题:如果所给的数据(如下图3)并不是线性可分的,即无法清楚的找到两类数据的分界面,仿佛有一些点放错了位置,我们该怎么办?
图3一个非线性可分数据集
那么对于图3这样的数据集,我们可以允许一部分点出现在错误的一侧,即通过在函数中引入另外一个变量来允许错误的发生。该变量叫做松弛变量,松弛变量的大小决定了我们允许发生错误的概率的大小。
接下来我们来讨论一下线性不可分数据集,如下图4所示,它无法用一条直线来分类。
图4 一个线性不可分数据集
于是我们就要祭出本文的大招,核函数(kernel trick)啦~~
到底什么是核函数呢?简单来说,核函数是把输入空间的点映射到特征空间的函数。换言之,是用一个函数把低维空间上的点变换到高维空间。我们将图4所示的那些点通过核函数变换到高维空间后如图5所示:
图5 线性不可分数据集映射到高维空间
基于SVM在解决小样本,非线性问题中的诸多优势,它可以被应用到函数拟合等其他的机器学习问题中。当然,SVM的知识还远不止这些。
预告:下一篇文章,笔者将会给大家详细介绍我们今天祭出的大招kernel函数,有没有很期待呢~
联系客服