Python机器学习笔记:SVM(2)——SVM核函数

  上一节我学习了完整的SVM过程,下面继续对核函数进行详细学习,具体的参考连接都在上一篇文章中,SVM四篇笔记连接为:html

Python机器学习笔记:SVM(1)——SVM概述

Python机器学习笔记:SVM(2)——SVM核函数

Python机器学习笔记:SVM(3)——证实SVM

Python机器学习笔记:SVM(4)——sklearn实现

  热身实例

  我在上一节有完整的学习了SVM算法,为了避免让本身这么快就忘了,这里先学习一个实例,回顾一下,并引出核函数的概念。算法

  数据是这样的:有三个点,其中正例 x1(3,  3),x2(4,3),负例 x3(1,1)数组

   求解:网络

   约束条件为:dom

  这个约束条件是经过这个获得的(为何这里强调一下呢,由于咱们这个例子自己说的就是SVM的求解过程):机器学习

   咱们能够知道  y1 = +1, y2 = +1 , y3 = -1,同时,代入 α ,则获得:函数

  α1 +  α2 - α3=0工具

  下面经过SVM求解实例。post

  咱们将数据代入原式中:性能

   因为 α1 + α2 = α3 化简可得:

   而后分别对  α1 和 α2 求偏导,偏导等于 0 可得: α1 = 1.5   α2 = -1 ,可是咱们发现这两个解并不知足约束条件  αi >= 0,i=1,2,3,因此解应该在边界上(正常状况下,咱们须要对上式求偏导,进而算出 w,b)。

  首先令  α1 = 0,得出 α2 = -2/13  ,α3 = -2/13   (不知足约束)

  再令 α2 = 0,得出 α1 = 0.25  ,α3 = 0.25  (知足约束)

  因此最小值在(0.25, 0,0.25)处取得。

  咱们将 α 的结果代入求解:

   因此咱们代入 w  b ,求得最终的平面方程为:

  热身完毕,下面学习核函数,为了方便理解咱们下面要说的核函数,我在知乎找了一个简单易懂的故事,让咱们了解支持向量机,更是明白支持向量机的核函数是个什么鬼,下面看故事。

1,故事分析:支持向量机(SVM)是什么?

  下面故事来源于此(这是源做者连接):点击我便可

  在好久之前的情人节,有一个大侠要去救他的爱人,可是魔鬼和他玩了一个游戏。

  魔鬼在桌面上彷佛有规律放了两种颜色的球,说:“你用一根棍分开他们?要求:尽可能在放更多球以后,仍然使用”

  因而大侠这样作,干得不错吧:

  而后魔鬼又在桌上放了更多的球,彷佛有一个球站错了阵营。

  SVM就是试图把棍放在最佳位置,好让在棍的两边有尽量大的间隙。

  如今即便魔鬼放了更多的球,棍仍然是一个好的分界线。

  而后,在SVM工具箱中有另外一个更加剧要的trick 。魔鬼看到大侠已经学会了一个trick,因而魔鬼给了大侠一个新的挑战。

  如今,大侠没有棍能够很好地帮他分开这两种球了,如今怎么办,固然像全部武侠片中同样大侠桌子一拍,球飞到空中。而后凭借着大侠的轻功,大侠抓起一张纸,插到了两种球的中间。

  如今,从魔鬼的角度看这些球,这些球好像是被一条曲线分开了。

  在以后,无聊的大人们,把这些球叫作 「data」,把棍子 叫作 「classifier」, 最大间隙trick 叫作「optimization」, 拍桌子叫作「kernelling」, 那张纸叫作「hyperplane」。

  因此说,Support Vector Machine,一个普通的SVM就是一条直线罢了,用来完美划分linearly separable的两类。可是这又不是一条普通的直线,这是无数条能够分类的直线当中最完美的,由于它刚好在两个类的中间,距离两个类的点都同样远。而所谓的Support vector就是这些离分界线最近的点,若是去掉这些点,直线多半是要改变位置的。若是是高维的点,SVM的分界线就是平面或者超平面。其实没有差,都是一刀切两块,咱们这里统一叫作直线。

  再理解一下,当一个分类问题,数据是线性可分的,也就是用一根棍就能够将两种小球分开的时候,咱们只要将棍的位置放在让小球距离棍的距离最大化的位置便可。寻找这个最大间隔的过程,就叫作最优化。可是,显示每每是残酷的,通常的数据是线性不可分的。也就是找不到一个棍将两种小球很好的分类,这时候咱们就须要像大侠同样,将小球排起,用一张纸代替小棍将两种小球进行分类,想让数据飞起,咱们须要的东西就是核函数(kernel),用于切分小球的纸,就是超平面。

2,核函数的概念

  上面故事说明了SVM能够处理线性可分的状况,也能够处理非线性可分的状况。而处理非线性可分的状况是选择了核函数(kernel),经过将数据映射到高位空间,来解决在原始空间中线性不可分的问题。

  咱们但愿样本在特征空间中线性可分,所以特征空间的好坏对支持向量机的性能相当重要,可是在不知道特征映射的状况下,咱们是不知道什么样的核函数是适合的,而核函数也只是隐式的定义了特征空间,因此,核函数的选择对于一个支持向量机而言就显得相当重要,若选择了一个不合适的核函数,则数据将映射到不合适的样本空间,从而支持向量机的性能将大大折扣。

  因此构造出一个具备良好性能的SVM,核函数的选择是关键。而核函数的选择包含两部分工做:一是核函数类型的选择,二是肯定核函数类型后相关参数的选择。

  咱们知道,核函数的精妙之处在于不用真的对特征向量作核映射,而是直接对特征向量的内积进行变换,而这种变换却等价于先对特征向量作核映射而后作内积。

  SVM主要是在用对偶理论求解一个二次凸优化问题,其中对偶问题以下:

   求得最终结果:

  固然这是线性可分的状况,那么若是问题自己是线性不可分的状况呢?那就是先扩维后再计算。具体来讲,在线性不可分的状况下,支持向量机首先在低维空间中完成计算,而后经过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上自己很差分的非线性数据分开。以下图所示,一堆数据在二维空间中没法划分,从而映射到三维空间中划分:

   而在咱们遇到核函数以前,若是用原始的方法,那么在用线性学习器学习一个非线性关系,须要选择一个非线性特征集,而且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器。所以,考虑的假设集是这种类型的函数:

   这里 Φ :X -> F 是从输入空间到某个特征空间的映射,这意味着创建非线性学习器分为两步:

  • 1,使用一个非线性映射将数据变换到一个特征空间 F
  • 2,在特征空间使用线性学习器分类

  而因为对偶形式就是线性学习器的一个重要性质,这意味着假设能够表达为训练点的线性组合,所以决策规则能够用测试点和训练点的内积来表示:

  为向量加上核映射后,要求解的最优化问题变为:

  根据核函数知足的等式条件,它等价于下面的问题:

  其线性不可分状况的对偶形式以下:

   其中 Φ(xi) 表示原来的样本扩维后的坐标。

  最后获得的分类判别函数为:

   和不用核映射相比,只是求解的目标函数,最后的断定函数对特征向量的内积作了核函数变换。若是K是一个非线性函数,上面的决策函数则是非线性函数,此时SVM是非线性模型。当训练样本不少,支持向量的个数很大的时候,预测时的速度是一个问题,所以不少时候咱们会使用线性支持向量机。

3,举例说明核函数的巧妙之处

  下面先从一个小例子来阐述问题。假设咱们有两个数据, x = (x1,  x2,  x3)  y = (y1,  y2,  y3)。此时在3D空间已经不能对其进行线性划分了,那么咱们经过一个函数将数据映射到更高维的空间,好比9维的话,那么 f(x) = (x1x1, x1x2, x1x3, x2x1, x2x2, x2x3, x3x1, x3x2, x3x3),因为须要计算内积,因此在新的数据在 9 维空间,须要计算  <f(x),  f(y)> 的内积,须要花费 O(n^2)。

  再具体点,令 x = (1, 2, 3), y = (4, 5, 6),那么 f(x)  = (1, 2, 3, 2, 4, 6, 3, 6, 9),f(y) = (16, 20, 24, 20, 25, 36, 24, 30, 36)

  此时: <f(x),  f(y)>  = 16 + 40 + 72 +40 +100 + 180 + 72 +180 +324 = 1024

  对于3D空间这两个数据,彷佛还能计算,可是若是将维数扩大到一个很是大数的时候,计算起来可就不是这么一点点问题了。

  然而,咱们发现  K(x, y) = (<x, y>)^2   ,代入上式: K(x, y) = (4 + 10 + 18)^2 = 32^2 = 1024

  也就是说 : K(x, y) = (<x, y>)^2  = <f(x),  f(y)>

  可是 K(x, y) 计算起来却比 <f(x), f(y)> 简单的多,也就是说只要用 K(x, y)来计算,效果与 <f(x), f(y)> 是同样的,可是计算效率却大幅度提升了,如  K(x, y) 是 O(n),而  <f(x), f(y)> 是 O(n^2),因此使用核函数的好处就是,能够在一个低维空间去完成一个高纬度(或者无限维度)样本内积的计算,好比上面例子中 K(x, y)的3D空间对比 <f(x), f(y)> 的9D空间。

  下面再举个例子来证实一下上面的问题,为了简单起见,假设全部样本点都是二维点,其值分别为(x,  y),分类函数为:

   它对应的映射方式为:

   能够验证:任意两个扩维后的样本点在3维空间的内积等于原样本点在二维空间的函数输出

   有了这个核函数,之后的高维内积均可以转换为低维的函数运算了,这里也就是说只须要计算低维的内积,而后再平方。明显问题获得解决且复杂度下降极大。总而言之:核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积

  固然上述例子是多项式核函数的一个特例,其实核函数的种类还有不少,后文会一一介绍。

4,核函数的计算原理

  经过上面的例子,咱们大概能够知道核函数的巧妙应用了,下面学习一下核函数的计算原理。

  若是有一种方法能够在特征空间中直接计算内积  <Φ(xi , Φ(x)> ,就像在原始输入点的函数中同样,就有可能将两个步骤融合到一块儿创建一个非线性的学习器,这样直接计算的方法称为核函数方法。

  设 x 是输入空间(欧式空间或者离散集合),H为特征空间(希尔伯特空间),若是存在一个从 x 到 H 的映射:

  核是一个函数 K,对于全部 x, z ∈ χ, 则知足:

   则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。

  参考网友的理解:任意两个样本点在扩维后的空间的内积,若是等于这两个样本点在原来空间通过一个函数后的输出,那么这个函数就叫核函数

  因为映射函数十分复杂难以计算,在实际中,一般都是使用核函数来求解内积,计算复杂度并无增长,映射函数仅仅做为一种逻辑映射,表征着输入空间到特征空间的映射关系。至于为何须要映射后的特征而不是最初的特征来参与计算,为了更好地拟合是其中一个缘由,另外的一个重要缘由是样例可能存在线性不可分的状况,而将特征映射到高维空间后,每每就可分了。

  下面将核函数形式化定义。若是原始特征内积是 <X ,  Z>,映射 <Φ(xi • Φ(x)>,那么定义核函数(Kernel)为:

  到这里,咱们能够得出结论,若是要实现该节开头的效果,只须要计算 Φ(x) ,而后计算 Φ(x)TΦ(x)便可,然而这种计算方式是很是低效的。好比最初的特征是n维的,咱们将其映射到 n2 维,而后再计算,这样须要O(n2 ) 的时间,那么咱们能不能想办法减小计算时间呢?

  先说结论,固然是能够的,毕竟咱们上面例子,活生生的说明了一个将须要 O(n2 ) 的时间 转换为 须要O(n ) 的时间。

  先看一个例子,假设x和z都是n维度的,

  展开后,获得:

  这个时候发现咱们能够只计算原始特征 x 和 z 内积的平方(时间复杂度为O(n)),就等价于计算映射后特征的内积。也就是说咱们不须要花O(n2 ) 的时间了。

  如今看一下映射函数(n = 3),根据上面的公式,获得:

  也就是说核函数  Κ(x,z) = (xTz)2  只能选择这样的 φ 做为映射函数时才可以等价于映射后特征的内积

  再看另一个核函数,高斯核函数:

  这时,若是 x 和 z 很相近 (||x - z || 约等于 0),那么核函数值为1,若是 x 和 z 相差很大(||x - z ||  >> 0),那么核函数值约等于0.因为这个函数相似于高斯分布,所以称为高斯核函数,也叫作径向基函数(Radial Basis Function 简称为RBF)。它可以把原始特征映射到无穷维。

  下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。

  注意,使用核函数后,怎么分类新来的样本呢?线性的时候咱们使用SVM学习出w和b,新来样本x的话,咱们使用 wTx + b 来判断,若是值大于等于1,那么是正类,小于等因而负类。在二者之间,认为没法肯定。若是使用了核函数后,wTx + b 就变成了 wTΦ(x) + b,是否先要找到 Φ(x) ,而后再预测?答案确定不是了,找 Φ(x) 很麻烦,回想咱们以前说过的。

  只需将 <(x(i) , x> 替换成  (x(i) , x),而后值的判断同上。

4.1  核函数有效性的断定

  问题:给定一个函数K,咱们可否使用K来替代计算 Φ(x)TΦ(x),也就说,是否可以找出一个 Φ,使得对于全部的x和z,都有 K(x, z) = Φ(x)TΦ(x),即好比给出了 K(x, z) = (xTz)2,是否可以认为K是一个有效的核函数。

  下面来解决这个问题,给定m个训练样本(x(1),x(2), ....,x(m)),每个x(i) 对应一个特征向量。那么,咱们能够将任意两个 x(i) 和 x(j) 带入K中,计算获得Kij = K(x(i), x(j))。i 能够从1到m,j 能够从1到m,这样能够计算出m*m的核函数矩阵(Kernel Matrix)。为了方便,咱们将核函数矩阵和 K(x, z) 都使用 K 来表示。若是假设 K 是有效地核函数,那么根据核函数定义:

  可见,矩阵K应该是个对称阵。让咱们得出一个更强的结论,首先使用符号ΦK(x)来表示映射函数 Φ(x) 的第 k 维属性值。那么对于任意向量 z,得:

  最后一步和前面计算 K(x, z) = (xTz)2 时相似。从这个公式咱们能够看出,若是K是个有效的核函数(即 K(x, z)   Φ(x)TΦ(z)等价),那么,在训练集上获得的核函数矩阵K应该是半正定的(K>=0)。这样咱们获得一个核函数的必要条件:K是有效的核函数 ==> 核函数矩阵K是对称半正定的。

  Mercer定理代表为了证实K是有效的核函数,那么咱们不用去寻找 Φ ,而只须要在训练集上求出各个 Kij,而后判断矩阵K是不是半正定(使用左上角主子式大于等于零等方法)便可。

 

5,核函数:如何处理非线性数据

  来看个核函数的例子。以下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据自己就是线性不可分的,此时咱们该如何把这两类数据分开呢?

   事实上,上图所示的这个数据集,是用两个半径不一样的圆圈加上了少许的噪音生成获得的,因此,一个理想的分界应该是“圆圈” 而不是“一条线”(超平面)。若是用 X1 和 X2 来表示这个二维平面的两个坐标的话,咱们知道一条二次曲线(圆圈是二次曲线的一种特殊状况)的方程能够写做这样的形式:

   注意上面的形式,若是咱们构造另一个五维的空间,其中五个坐标的值分别为:

   那么显然,上面的方程在新的坐标系下能够写作:

   关于新的坐标 Z,这正是一个 hyper plane 的方程!也就是说,若是咱们作一个映射:

   将X按照上面的规则映射为 Z,那么在新的空间中原来的数据将变成线性可分的,从而使用以前咱们推导的线性分类算法就能够进行处理了。这正是Kernel方法处理非线性问题的基本思想。

  再进一步描述 Kernel 的细节以前,不妨再来看看上述例子在映射事后的直观形态。固然,咱们没法将五维空间画出来,不过因为我这里生成数据的时候用了特殊的情形,因此这里的超平面实际的方程是这个样子的(圆心在X2轴上的一 个正圆):

   所以我只须要把它映射到下面这样一个三维空间中便可:

   下图便是映射以后的结果,将坐标轴通过适当的旋转,就能够很明显的看出,数据是能够经过一个平面来分开的

  核函数至关于把原来的分类函数:

   映射成:

   而其中的 α 能够经过求解以下 dual 问题而获得的:

   这样一来问题就解决了吗?彷佛是的:拿到非线性数据,就找一个映射(Φ(•),而后一股脑把原来的数据映射到新空间中,再作线性SVM便可。不过事实上问题好像没有这么简单)。

  细想一下,刚才的方法是否是有问题:

  在最初的例子里,咱们对一个二维空间作映射,选择的新空间是原始空间的全部一阶和二阶的组合,获得了五个维度;

  若是原始空间是三维(一阶,二阶和三阶的组合),那么咱们会获得:3(一次)+3(二次交叉)+3(平方)+3(立方)+1(x1 * x2 * x3) + 2*3(交叉,一个一次一个二次,相似 x1*x2^2)=19 维的新空间,这个数目是呈指数级爆炸性增加的,从而势必这给 Φ(•) 的计算带来很是大的困难,并且若是遇到无穷维的状况,就根本无从计算了。

  这个时候,可能就须要Kernel出马了。

  不妨仍是从最开始的简单例子触发,设两个向量为:

   而 Φ(•) 便是前面说的五维空间的映射,所以映射事后的内积为:

   (公式说明:上面的这两个推导过程当中,所说的前面的五维空间的映射,这里说的即是前面的映射方式,回顾下以前的映射规则,再看看那个长的推导式,其实就是计算x1,x2各自的内积,而后相乘相加便可,第二个推导则是直接平方,去掉括号,也很容易推出来)

  另外,咱们又注意到:

   两者有不少类似的地方,实际上,咱们只要把某几个维度线性缩放一下,而后再加上一个常数维度,具体来讲,上面这个式子的计算结果实际上和映射

   以后的内积  <Φ(xi • Φ(x)>  的结果是相等的,那么区别在什么地方呢?

  • 1,一个是映射到高维空间中,而后再根据内积的公式进行计算
  • 2,另外一个则直接在原来的低维空间中进行计算,而不须要显式地写出映射后的结果

  (公式说明:上面之中,最后的两个式子,第一个算式,是带内积的彻底平方式,能够拆开,而后,再经过凑一个获得,第二个算式,也是根据第一个算式凑出来的)

  回想刚才提到的映射的维度爆炸,在前一种方法已经没法计算的状况下,后一种方法却依旧能从容处理,甚至是无穷维度的状况也没有问题。

  咱们把这里的计算两个向量在隐式映射事后的空间中的内积的函数叫作核函数(kernel Function),例如,在刚才的例子中,咱们的核函数为:

   核函数能简化映射空间中的内积运算——恰好“碰巧”的是,在咱们的SVM里须要计算的地方数据向量老是之内积的形式出现的。对比刚才咱们上面写出来的式子,如今咱们的分类函数为:

   其中 α 由以下 dual 问题计算而得:

  这样一来计算的问题就算解决了,避免了直接在高维空间中进行计算,而结果倒是等价的!固然,由于咱们这里的例子很是简单,因此能够手工构造出对应于 Φ(•) 的核函数出来,若是对于任意一个映射,想要构造出对应的核函数就很是困难了。

6,核函数的本质

  下面概况一下核函数的意思:

  • 1,实际上,咱们会常常遇到线性不可分的样例,此时,咱们的经常使用作法是把样例特征映射到高位空间中去(好比以前有个例子,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的)
  • 2,进一步,若是凡是遇到线性不可分的样例,一概映射到高维空间,那么这个维度大小是会高到可怕的(甚至是无穷维),因此核函数就隆重出场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表如今了高维上,也就是上文所说的避免了直接在高维空间中的复杂计算。

  下面引用这个例子距离下核函数解决非线性问题的直观效果。

  假设如今你是一个农场主,圈养了一批羊群,但为了预防狼群袭击羊群,你须要搭建一个篱笆来把羊群圈起来。可是篱笆应该建在哪里呢?你极可能须要依据羊群和狼群的位置搭建一个“分类器”,好比下图这几种不一样的分类器,咱们能够看到SVM完成了一个很完美的解决方案。

   这个例子侧面简单说明了SVM使用非线性分类器的优点,而逻辑模式以及决策树模式都是使用了直线方法。

7,几种常见的核函数

  核函数有严格的数学要求,因此设计一个核函数是很是困难的,科学家们通过不少不少尝试也就只尝试出来几个核函数,因此咱们就不要在这方面下无用功了,直接拿这常见的几个核函数使用就OK。

  下面来分别学习一下这几个常见的核函数。

7.1  线性核(Linear Kernel )

  基本原理:实际上就是原始空间中的内积

   这个核存在的主要目的是使得“映射后空间中的问题” 和 “映射前空间中的问题” 二者在形式上统一块儿来了(意思是说:咱们有的时候,写代码或者写公式的时候,只要写个模板或者通用表达式,而后再代入不一样的核,即可以了。于此,便在形式上统一了起来,不用再找一个线性的和一个非线性的)

     线性核,主要用于线性可分的状况,咱们能够看到特征空间到输入空间的维度是同样的。在原始空间中寻找最优线性分类器,具备参数少速度快的优点。对于线性可分数据,其分类效果很理想。所以咱们一般首先尝试用线性核函数来作分类,看看效果如何,若是不行再换别的。

优势

  • 方案首选,奥多姆剃刀定理
  • 简单,能够快速解决一个QP问题
  • 可解释性强:能够轻易知道哪些feature是重要的

限制

  • 只能解决线性可分问题

7.2 多项式核(Polynomial Kernel)

  基本原理:依靠升维使得本来线性不可分的数据线性可分。

  多项式核函数能够实现将低维的输入空间映射到高维的特征空间。多项式核适合于正交归一化(向量正交且模为1)数据,属于全局核函数,容许相距很远的数据点对核函数的值有影响。参数d越大,映射的维度越高,计算量就会越大。

优势

  • 可解决非线性问题
  • 可经过主观设置Q来实现总结的预判

缺点

  • 多项式核函数的参数多,当多项式的阶数d比较高的是,因为学习复杂性也会太高,易出现“过拟合”现象,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大道没法计算。

 

7.3  高斯核(Gaussian Kernel)/ 径向基核函数(Radial Basis Function)

  径向基核函数是SVM中经常使用的一个核函数。径向基函数是一个采用向量做为自变量的函数,可以基于向量距离运算输出一个标量。

   也能够写成以下格式:

  径向基函数是指取值仅仅依赖于特定点距离的实值函数,也就是:

  任意一个知足上式特性的函数 Φ 都叫径向量函数,标准的通常使用欧氏距离,尽管其余距离函数也是能够的。因此另外两个比较经常使用的核函数,幂指数核,拉普拉斯核也属于径向基核函数。此外不太经常使用的径向基核还有ANOVA核,二次有理核,多元二次核,逆多元二次核。

  高斯径向基函数是一种局部性强的核函数,其能够将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,不管大样本仍是小样本都有比较好的性能,并且其相对于多项式核函数参数要少,所以大多数状况下在不知道用什么样的核函数的时候优先使用高斯核函数

  径向基核函数属于局部核函数,当数据点距离中心点变远时,取值会变小。高斯径向基核对数据中存在的噪声有着较好的抗干扰能力,因为其很强的局部性,其参数决定了函数做用范围,随着参数 σ 的增大而减弱。

优势

  • 能够映射到无线维
  • 决策边界更为多样
  • 只有一个参数,相比多项式核容易选择

缺点

  • 可解释性差(无限多维的转换,没法算出W)
  • 计算速度比较慢(当解决一个对偶问题)
  • 容易过拟合(参数选很差时容易overfitting)

上述所讲的径向核函数表达式

  幂指数核(Exponential Kernel)

  拉普拉斯核(LaplacIan Kernel)

 

   ANOVA 核(ANOVA Kernel)

  二次有理核(Rational Quadratic Kernel)

  多元二次核(Multiquadric Kernel)

  逆多元二次核(Inverse Multiquadric Kernel)

7.4  Sigmoid核

   Sigmoid核函数来源于神经网络,被普遍用于深度学习和机器学习中

  采用Sigmoid函数做为核函数时,支持向量机实现的就是一种多层感知器神经网络,应用SVM方法,隐含层节点数目(它肯定神经网络的结构),隐含层节点对输入节点的权重都是在设计(训练)的过程当中自动肯定的。并且支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部最优值,也保证了它对未知样本的良好泛化能力而不会出现过学习线性。

8,核函数的选择

8.1,先验知识

  利用专家的先验知识预先选定核函数

8.2,交叉验证

  采起Cross-Validation方法,即在进行核函数选取时,分别试用不一样的核函数,概括偏差最小的核函数就是最好的核函数。如针对傅里叶核,RBF核,结合信号处理问题中的函数回归问题,经过仿真实验,对比分析了在相同数据条件下,采用傅里叶核的SVM要比采用RBF核的SVM偏差小不少。

8.3,混合核函数

  采用由Smits等人提出的混合核函数方法,该方法较以前二者是目前选取核函数的主流方法,也是关于如何构建核函数的又一开创性的工做,将不一样的核函数结合起来后有更好的特性,这是混合核函数方法的基本思想。

8.4,经验

  当样本特征不少时,特征的维度很高,这是每每样本线性可分,可考虑用线性核函数的SVM或者LR(如何不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的)

  当样本的数量不少,但特征较少时,能够手动添加一些特征,使样本线性可分,再考虑用线性核函数的SVM或者LR

  当样本特征维度不高时,样本数量也很少时,考虑使用高斯核函数(RBF核函数的一种,指数核函数和拉普拉斯核函数也属于RBF核函数)

8.5,吴恩达给出的选择核函数的方法

   若是特征的数量大道和样本数量差很少,则选用LR或者线性核的SVM

  若是特征的数量小,样本的数量正常,则选用SVM+ 高斯核函数

  若是特征的数量小,而样本的数量很大,则须要手工添加一些特征从而变成第一种状况

8.6  核函数选择的例子

  这里简单说一下核函数与其余参数的做用(后面会详细学习关于使用Sklearn学习SVM):

  • kernel='linear' 时,C越大分类效果越好,但有可能会过拟合(default C=1)
  • kernel='rbf'时,为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。

  咱们来看一个简单的例子,数据为[-5.0 , 9.0] 的随机数组,函数以下 :

  下面分别使用三种核SVR:两种乘法系数高斯核rbf和一种多项式核poly。代码以下:

from sklearn import svm
import numpy as np
from matplotlib import pyplot as plt
import warnings

warnings.filterwarnings('ignore')

X = np.arange(-5.0 , 9.0 , 0.1)
# print(X)
X = np.random.permutation(X)
# print('1X:',X)
X_ = [[i] for i in X]
b = 0.5
y = 0.5 * X ** 2.0 + 3.0 * X + b + np.random.random(X.shape) * 10.0
y_ = [i for i in y]

# degree = 2 , gamma=, coef0 =
rbf1 = svm.SVR(kernel='rbf',C=1,)
rbf2 = svm.SVR(kernel='rbf',C=20,)
poly = svm.SVR(kernel='poly',C=1,degree=2)

rbf1.fit(X_ , y_)
rbf2.fit(X_ , y_)
poly.fit(X_ , y_)


result1 = rbf1.predict(X_)
result2 = rbf2.predict(X_)
result3 = poly.predict(X_)


plt.plot(X,y,'bo',fillstyle='none')
plt.plot(X,result1,'r.')
plt.plot(X,result2,'g.')
plt.plot(X,result3,'b.')
plt.show()

  结构图以下:

  蓝色是poly,红色是c=1的rbf,绿色c=20的rbf。其中效果最好的是C=20的rbf。若是咱们知道函数的表达式,线性规划的效果更好,可是大部分状况下咱们不知道数据的函数表达式,所以只能慢慢实验,SVM的做用就在这里了。

9,总结

  支持向量机是一种分类器。之因此称为“机”是由于它会产生一个二值决策结果,即它是一种决策“机”。支持向量机的泛化错误率较低,也就是说它具备良好的学习能力,且学到的结果具备很好的推广性。这些优势使得支持向量机十分流行,有些人认为它是监督学习中最好的定式算法。

  支持向量机视图经过求解一个二次优化问题来最大化分类间隔。在过去,训练支持向量机常采用很是复杂而且低效的二次规划求解方法。John Platt 引入了SMO算法,此算法能够经过每次只优化2个 α 值来加快SVM的训练速度。

  核方法或者说核技巧会将数据(有时候是非线性数据)从一个低维空间映射到一个高维空间,能够将一个在低维空间中的非线性问题转化为高维空间下的线性问题来求解。核方法不止在SVM中适用,还能够用于其余算法。而其中的径向基函数是一个经常使用的度量两个向量距离的核函数。

相关文章
相关标签/搜索