毕业课题之------------SVM算法为什么须要核函数
生存?还是毁灭?——哈姆雷特
可分?还是不可分?——支持向量机
之前一直在讨论的线性分类器,器如其名(汗,这是什么说法啊),仅仅能对线性可分的样本做处理。
假设提供的样本线性不可分。结果非常easy,线性分类器的求解程序会无限循环。永远也解不出来。这必定使得它的适用范围大大缩小。而它的非常多长处我们实在不原意放弃。怎么办呢?是否有某种方法,让线性不可分的数据变得线性可分呢?
有。其思想说来也简单,来用一个二维平面中的分类问题作样例。你一看就会明确。
事先声明。以下这个样例是网络早就有的。我一时找不到原作者的正确信息,在此借用,并加进了我自己的讲解而已。
样例是以下这张图:
/
我们把横轴上端点a和b之间红色部分里的全部点定为正类。两边的黑色部分里的点定为负类。试问能找到一个线性函数把两类正确分开么?不能。由于二维空间里的线性函数就是指直线,显然找不到符合条件的直线。
但我们能够找到一条曲线,比如以下这一条:
显然通过点在这条曲线的上方还是下方就能够推断点所属的类别(你在横轴上随便找一点,算算这一点的函数值。会发现负类的点函数值一定比0大。而正类的一定比0小)。
这条曲线就是我们熟知的二次曲线,它的函数表达式能够写为:
问题仅仅是它不是一个线性函数,可是,以下要注意看了,新建一个向量y和a:
这样g(x)就能够转化为f(y)=<a,y>。你能够把y和a分别回带一下,看看等不等于原来的g(x)。
用内积的形式写你可能看不太清楚。实际上f(y)的形式就是:
g(x)=f(y)=ay
在随意维度的空间中,这样的形式的函数都是一个线性函数(仅仅只是当中的a和y都是多维向量罢了),由于自变量y的次数不大于1。
看出妙在哪了么?原来在二维空间中一个线性不可分的问题,映射到四维空间后,变成了线性可分的!因此这也形成了我们最初想解决线性不可分问题的基本思路——向高维空间转化,使其变得线性可分。
而转化最关键的部分就在于找到x到y的映射方法。遗憾的是,怎样找到这个映射,没有系统性的方法(也就是说,纯靠猜和凑)。
详细到我们的文本分类问题。文本被表示为上千维的向量。即使维数已经如此之高。也经常是线性不可分的,还要向更高的空间转化。当中的难度可想而知。
小Tips:为什么说f(y)=ay是四维空间里的函数?
大家可能一时没看明确。回忆一下我们二维空间里的函数定义
g(x)=ax+b
变量x是一维的。为什么说它是二维空间里的函数呢?由于另一个变量我们没写出来。它的完整形式事实上是
y=g(x)=ax+b
即
y=ax+b
看看,有几个变量?两个。那是几维空间的函数?(作者五岁的弟弟答:五维的。
作者:……)
再看看
f(y)=ay
里面的y是三维的变量,那f(y)是几维空间里的函数?(作者五岁的弟弟答:还是五维的。作者:……)
用一个详细文本分类的样例来看看这样的向高维空间映射从而分类的方法怎样运作,想象一下,我们文本分类问题的原始空间是1000维的(即每一个要被分类的文档被表示为一个1000维的向量)。在这个维度上问题是线性不可分的。如今我们有一个2000维空间里的线性函数
f(x’)=<w’,x’>+b
注意向量的右上角有个 ’哦。它可以将原问题变得可分。式中的 w’和x’都是2000维的向量,仅仅只是w’是定值,而x’是变量(好吧,严格说来这个函数是2001维的,哈哈),如今我们的输入呢,是一个1000维的向量x,分类的过程是先把x变换为2000维的向量x’,然后求这个变换后的向量x’与向量w’的内积。再把这个内积的值和b相加,就得到了结果,看结果大于阈值还是小于阈值就得到了分类结果。
你发现了什么?我们事实上仅仅关心那个高维空间里内积的值。那个值算出来了。分类结果就算出来了。而从理论上说, x’是经由x变换来的,因此广义上能够把它叫做x的函数(有一个x,就确定了一个x’。对吧,确定不出第二个),而w’是常量,它是一个低维空间里的常量w经过变换得到的。所以给了一个w 和x的值。就有一个确定的f(x’)值与其相应。
这让我们幻想。能否有这样一种函数K(w,x),他接受低维空间的输入值,却能算出高维空间的内积值<w’,x’>?
假设有这种函数,那么当给了一个低维空间的输入x以后,
g(x)=K(w,x)+b
f(x’)=<w’,x’>+b
这两个函数的计算结果就全然一样,我们也就用不着费力找那个映射关系,直接拿低维的输入往g(x)里面代就能够了(再次提醒,这回的g(x)就不是线性函数啦。由于你不能保证K(w,x)这个表达式里的x次数不高于1哦)。
万幸的是,这种K(w,x)确实存在(发现凡是我们人类能解决的问题,大都是巧得不能再巧。特殊得不能再特殊的问题。总是恰好有些能投机取巧的地方才干解决,由此感到人类的渺小)。它被称作核函数(核,kernel),并且还不止一个。其实,仅仅要是满足了Mercer条件的函数。都可以作为核函数。
核函数的基本作用就是接受两个低维空间里的向量,可以计算出经过某个变换后在高维空间里的向量内积值。
几个比較经常使用的核函数。俄,教课书里都列过。我就不敲了(懒!)。
回忆我们上节说的求一个线性分类器。它的形式应该是:
如今这个就是高维空间里的线性函数(为了差别低维和高维空间里的函数和向量,我改了函数的名字,而且给w和x都加上了 ’),我们就能够用一个低维空间里的函数(再一次的,这个低维空间里的函数就不再是线性的啦)来取代。
又发现什么了?f(x’) 和g(x)里的α。y。b全都是一样一样的!
这就是说,虽然给的问题是线性不可分的,可是我们就硬当它是线性问题来求解,仅仅只是求解过程中。凡是要求内积的时候就用你选定的核函数来算。
这样求出来的α再和你选定的核函数一组合,就得到分类器啦!
明确了以上这些,会自然的问接下来两个问题:
1. 既然有非常多的核函数,针对详细问题该怎么选择?
2. 假设使用核函数向高维空间映射后,问题仍然是线性不可分的。那怎么办?
第一个问题如今就能够回答你:对核函数的选择,如今还缺乏指导原则!
各种实验的观察结果(不光是文本分类)的确表明。某些问题用某些核函数效果非常好,用还有一些就非常差。可是一般来讲,径向基核函数是不会出太大偏差的一种。首选。(我做文本分类系统的时候,使用径向基核函数。没有參数调优的情况下,绝大部分类别的准确和召回都在85%以上,可见。
尽管libSVM的作者林智仁觉得文本分类用线性核函数效果更佳,待考证)
对第二个问题的解决则引出了我们下一节的主题:松弛变量。
第二个问题解决:给硬性阀值引入松弛变量,同意出现一些分类错误点,容错性。
自己总结:
线性不可分映射到高维空间。可能会导致维度大小高到可怕的(19维乃至无穷维的样例),导致计算复杂。核函数的价值在于它尽管也是讲特征进行从低维到高维的转换。但核函数绝就绝在它事先在低维上进行计算。而将实质上的分类效果表如今了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
最理想的情况下。我们希望知道数据的详细形状和分布。从而得到一个刚好能够将数据映射成线性可分的 ,然后通过这个 得出相应的 进行内积计算。然而,第二步一般是很困难甚至全然没法做的。只是,因为第一步也是差点儿无法做到。因为对于随意的数据分析其形状找到合适的映射本身就不是什么easy的事情,所以,人们通常都是“胡乱”选择映射的。所以,根本没有必要精确地找出相应于映射的那个核函数。而仅仅须要“胡乱”选择一个核函数就可以——我们知道它相应了某个映射,尽管我们不知道这个映射详细是什么。因为我们的计算仅仅须要核函数就可以,所以我们也并不关心也没有必要求出所相应的映射的详细形式。