SVM(3)核函数

核函数

以下内容来自http://www.blogjava.net/zhenandaci/archive/2009/03/06/258288.html
之前一直在讨论的线性分类器,器如其名(汗,这是什么说法啊),只能对线性可分的样本做处理。如果提供的样本线性不可分,结果很简单,线性分类器的求解程序会无限循环,永远也解不出来。这必然使得它的适用范围大大缩小,而它的很多优点我们实在不原意放弃,怎么办呢?是否有某种方法,让线性不可分的数据变得线性可分呢?

有!其思想说来也简单,来用一个二维平面中的分类问题作例子,你一看就会明白。事先声明,下面这个例子是网络早就有的,我一时找不到原作者的正确信息,在此借用,并加进了我自己的解说而已。

例子是下面这张图:
这里写图片描述
我们把横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类。试问能找到一个线性函数把两类正确分开么?不能,因为二维空间里的线性函数就是指直线,显然找不到符合条件的直线。

但我们可以找到一条曲线,例如下面这一条:
这里写图片描述
显然通过点在这条曲线的上方还是下方就可以判断点所属的类别(你在横轴上随便找一点,算算这一点的函数值,会发现负类的点函数值一定比0大,而正类的一定比0小)。这条曲线就是我们熟知的二次曲线,它的函数表达式可以写为:

g(x)=c0+c1x+c2x2 g ( x ) = c 0 + c 1 x + c 2 x 2
问题只是它不是一个线性函数,但是,下面要注意看了,新建一个向量 y y a
y=y1y2y3=1xx2,a=a1a2a3=c0c1c2 y = ( y 1 y 2 y 3 ) = ( 1 x x 2 ) , a = ( a 1 a 2 a 3 ) = ( c 0 c 1 c 2 )
这样 g(x) g ( x ) 就可以转化为 f(y)=<a,y> f ( y ) =< a , y > ,你可以把y和a分别回带一下,看看等不等于原来的g(x)。用内积的形式写你可能看不太清楚,实际上 f(y) f ( y ) 的形式就是:
g(x)=f(y)=ay g ( x ) = f ( y ) = a y
在任意维度的空间中,这种形式的函数都是一个线性函数(只不过其中的a和y都是多维向量罢了),因为自变量y的次数不大于1。

看出妙在哪了么?原来在二维空间中一个线性不可分的问题,映射到四维空间后,变成了线性可分的!因此这也形成了我们最初想解决线性不可分问题的基本思路——向高维空间转化,使其变得线性可分。

小Tips:为什么说f(y)=ay是四维空间里的函数?
大家可能一时没看明白。回想一下我们二维空间里的函数定 g(x)=ax+b g ( x ) = a x + b ,变量x是一维的,为什么说它是二维空间里的函数呢?因为还有一个变量我们没写出来,它的完整形式其实是 y=g(x)=ax+b y = g ( x ) = a x + b y=ax+b y = a x + b . 看看,有几个变量?两个。那是几维空间的函数?2
再看看 f(y)=ay f ( y ) = a y , 里面的y是三维的变量,那 f(y) f ( y ) 是几维空间里的函数?4

用一个具体文本分类的例子来看看这种向高维空间映射从而分类的方法如何运作,想象一下,我们文本分类问题的原始空间是1000维的(即每个要被分类的文档被表示为一个1000维的向量),在这个维度上问题是线性不可分的。现在我们有一个2000维空间里的线性函数

f(x)=<ω,x>+b f ( x ′ ) =< ω ′ , x ′ > + b
注意向量的右上角有个 ’哦。它能够将原问题变得可分。式中的 ω ω ′ x x ′ 都是2000维的向量,只不过 ω ω ′ 是定值,而 x x ′ 是变量(好吧,严格说来这个函数是2001维的,哈哈),现在我们的输入呢,是一个1000维的向量 x x ,分类的过程是先把x变换为2000维的向量 x x ′ ,然后求这个变换后的向量 x x ′ 与向量 ω ω ′ 的内积,再把这个内积的值和 b b 相加,就得到了结果,看结果大于阈值还是小于阈值就得到了分类结果。

你发现了什么?我们其实只关心那个高维空间里内积的值,那个值算出来了,分类结果就算出来了。而从理论上说, x是经由 x x 变换来的,因此广义上可以把它叫做x的函数(有一个 x x ,就确定了一个x,对吧,确定不出第二个),而 ω ω ′ 是常量,它是一个低维空间里的常量 ω ω 经过变换得到的,所以给了一个 ω ω x x 的值,就有一个确定的f(x)值与其对应。这让我们幻想,是否能有这样一种函数 K(ω,x) K ( ω , x ) ,他接受低维空间的输入值,却能算出高维空间的内积值 <ω,x> < ω ′ , x ′ > <script type="math/tex" id="MathJax-Element-38"><\omega^{'},x^{'}></script>?

如果有这样的函数,那么当给了一个低维空间的输入 x x 以后,

g(x)=K(ω,x)+b

f(x)=<ω,x>+b f ( x ′ ) =< ω ′ , x ′ > + b
这两个函数的计算结果就完全一样,我们也就用不着费力找那个映射关系,直接拿低维的输入往 g(x) g ( x ) 里面代就可以了(再次提醒,这回的 g(x) g ( x ) 就不是线性函数啦,因为你不能保证 K(ω,x) K ( ω , x ) 这个表达式里的 x x 次数不高于1哦)。

万幸的是,这样的K(ω,x)确实存在(发现凡是我们人类能解决的问题,大都是巧得不能再巧,特殊得不能再特殊的问题,总是恰好有些能投机取巧的地方才能解决,由此感到人类的渺小),它被称作核函数(核,kernel),而且还不止一个,事实上,只要是满足了Mercer条件的函数,都可以作为核函数。核函数的基本作用就是接受两个低维空间里的向量,能够计算出经过某个变换后在高维空间里的向量内积值。几个比较常用的核函数,俄,教课书里都列过,我就不敲了(懒!)。

以下内容来自https://blog.csdn.net/macyang/article/details/38782399/

几个常见核函数

通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:多项式核、高斯核、线性核。
这里写图片描述
这里写图片描述
这里写图片描述

Kernel 方法处理非线性问题的基本思想

我们已经了解到了 SVM 处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 K(·,·) K ( · , · ) ,通过将数据 映射到高维空间,来解决在原始空间中线性不可分的问题。

在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数 将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从 而把平面上本身不好分的非线性数据分开。如下图所示,一堆数据在二维空间无法划分, 从而映射到三维空间里划分。
这里写图片描述
建立非线性学习分为两步:
1. 首先使用一个非线性映射将数据变换到一个特征空间 F;
2. 然后在特征空间使用线性学习器分类。

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

来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样 的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢?
这里写图片描述
事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用 X1 X 1 X2 X 2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次 曲线的一种特殊情况)的方程可以写作这样的形式:

a1X1+a2X21+a3X2+a4X22+a5X1X2+a6=0 a 1 X 1 + a 2 X 1 2 + a 3 X 2 + a 4 X 2 2 + a 5 X 1 X 2 + a 6 = 0
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 Z1=X1,Z2=X21,Z3=X2,Z4=X22,Z5=X1X2 Z 1 = X 1 , Z 2 = X 1 2 , Z 3 = X 2 , Z 4 = X 2 2 , Z 5 = X 1 X 2 , 那么显然,上面的方程在新的坐标系下可以写作:
i=15aiZi+a6=0 ∑ i = 1 5 a i Z i + a 6 = 0
关于新的坐标 Z ,这正是一个 hyper plane 的方程!也就是说,如果我们做一个
映射 φ : R2R5 R 2 → R 5 ,将 X 按照上面的规则映射为 Z ,那么在新的空间中原来的数据将 变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。
下图为高维空间旋转示意图:
这里写图片描述

回想我们上节说的求一个线性分类器,它的形式应该是:

g(x)=<i=1nαiyi(xi,x)>+b g ( x ) =< ∑ i = 1 n α i y i ( x i , x ) > + b
现在这个是高维空间里的线性函数(为了区别低维和高维空间里的函数和向量,我们将函数改名字,并且给 ω ω x x 都加上 ’):
f(x)=<i=1nαiyi(xi,x)>+b
我们就可以用一个低维空间里的函数(再一次的,这个低维空间里的函数就不再是线性的啦)来代替,
g(x)=i=1nαiyiK(xi,x)+b g ( x ) = ∑ i = 1 n α i y i K ( x i , x ) + b

又发现什么了? f(x) f ( x ′ ) g(x) g ( x ) 里的 αyb α , y , b 全都是一样一样的!这就是说,尽管给的问题是线性不可分的,但是我们就硬当它是线性问题来求解,只不过求解过程中,凡是要求内积的时候就用你选定的核函数来算。这样求出来的 α α 再和你选定的核函数一组合,就得到分类器啦!

明白了以上这些,会自然的问接下来两个问题:
1. 既然有很多的核函数,针对具体问题该怎么选择?
2. 如果使用核函数向高维空间映射后,问题仍然是线性不可分的,那怎么办?

第一个问题现在就可以回答你:对核函数的选择,现在还缺乏指导原则!各种实验的观察结果(不光是文本分类)的确表明,某些问题用某些核函数效果很好,用另一些就很差,但是一般来讲,径向基核函数是不会出太大偏差的一种,首选。(我做文本分类系统的时候,使用径向基核函数,没有参数调优的情况下,绝大部分类别的准确和召回都在85%以上,可见。虽然libSVM的作者林智仁认为文本分类用线性核函数效果更佳,待考证)

对第二个问题的解决则引出了我们下一节的主题:松弛变量。

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。最常用的径向基函数是高斯核函数。建议首选RBF核函数,http://blog.sina.com.cn/s/blog_4a1853330100u2zb.html因为:
1. 能够实现非线性映射;( 线性核函数可以证明是他的一个特例;SIGMOID核函数在某些参数上近似RBF的功能。)
2. 参数的数量影响模型的复杂程度,多项式核函数参数较多。
3. the RBF kernel has less numerical difficulties.

#### RBF核&linear核https://www.zhihu.com/question/21883548/answer/19693213
1. Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
2. RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。我个人的体会是:使用libsvm,默认参数,RBF核比Linear核效果稍差。通过进行大量参数的尝试,一般能找到比linear核更好的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值