http://discussions.youdaxue.com/t/svm-rbf-kernel/6088
在我们机器学习的过程中,很多同学包括我自己也疑惑过rbf kernel函数的实际作用是什么?不同的参数又有什么作用。
上周我参加了上海的夏令营,这里就是我们讨论的结果。
首先我们要知道Support Vector Machine到底是什么东西。看过课程视频的同学都是到,SVM旨在将一组不可线性分割的数据线性分割。怎么做到的呢?通过将低维度的数据投影到高维度来实现。
这里又涉及到两个关键词“线性分割”、“投影”。
线性可分割
线性分割就是一组数据可以被一条直线(高维度空间中是超平面)分为两半。
如上图所示,A是线性可分的,B不是。
那么在更高维度中,线性就是指的一个平面。在三维空间中是平面,在更高维度中就是超平面。
投影
投影(映射)就是一个函数。z = f(x, y) 就是把x,y投影到z。“投影”这个用词其实是一个几何空间的借喻。意思就是说,将(x,y)这个本来属于二维空间的点‘’投影‘’到第三维。如下:
(x1, y1) => (x1, y1, z1)
(x2, y2) => (x2, y2, z2)
(x3, y3) => (x3, y3, z3)
....
依次类推
内核函数 Kernel Function
内核函数就是投影所具体使用的函数。这里就用rbf来举例。rbf全称是Radial Based Function,基于半径的函数。
在解释 rbf 之前,先来看一个更简单地例子。
如上图所示,左边的圈圈和叉叉是不可线性分割的。但是我们可以看出,一个圆圈可以将它们分开。这个圆其实就代表不同的点到原点(0,0)的距离的分界线。距离更大的叉叉在圆外面,距离小的圈圈在圆里面。
那么什么函数才可以仅仅基于 x1 和 x2 就算出离原点的距离呢?答案是:
define 距离函数 f(x1, x2) 为: sqrt( x1^2 + x2 ^ 2 ) 。然后让 f(x1,x2) 投影到 x3
这里开不开根号其实无所谓,因为我们关心的不是绝对的距离,而是一个可以区分不同距离的尺度。
那么对于SVM来说,我们的 f 就是内核函数。通过这个 f,我们就可以将左边的二维坐标系投影成右边的三维坐标系。然后很明显的,我们的数据变得线性可分割了(通过那个切面)。
Radial Based Function
现在我们再来看 rbf1
这是 rbf 的数学公式。当然,更一般性的写法是
公式的具体含义这里不作很数学的解释(比如说什么是 exponential function)
要注意的有3个方面。
- X 和 X’ 不是标量,是向量(别名:矢量)
- | X - X' | ^ 2 就是一个距离公式,X’ 是相对于 X 的另外一个点 (一个向量可以被当做一个点)
- gamma 是一个常数 (具体含义后面讲)
我们可以观察到,之前算到原点距离的 f 就是 这里的 rbf 的一种特殊情况。X’ 就是 (0,0)。而 rbf 中 X’ 是根据具体情况而定的。
我们可以再看到这个图
对于图 B 来说,用原点作为参考点肯定是不合适的。参考点应该是蓝色数据的中心点。然后 rbf 可以算出每个点到该中心的距离,从而将其投影到一个三维空间,让其变得可以线性分割。
rbf 投影后的结果大概就长这样(图片仅供参考)
gamma 参数什么意思
我们通过公式可知,gamma 是一个常量,而且是一个线性的因数。所以大家可以想象,gamma的作用,其实就是控制数据在向高维度投影后的缩放比例。如果 gamma 很大,那么上图的点就会离切面很远。如果 gamma 很小,上图的点就会离切面很近。
而这个缩放比例就会影响线性分割面的运算结果(不同的loss function对距离的惩罚度不一样)。这也是SVM对数据 Scaling 和 Normalization 是敏感的原因之一。因为最后都是算的一个 Linear Model
这就是为什么,有人说如果原始数据比较分散,gamma可以小一点。反之,如果原始数据很密集,gamma可以大一点。当然,这不是绝对的,所以我们才要做 GridSearch
通常我们会 0.01、0.1、1、10、100 ... 这样指数级地搜索一个比较好的 gamma
sklearn SVM 里的 C 是什么意思?
我都写了这么多,这就留给你当作业吧。多看 sklearn 文档3。记住,gamma 和 C 是好基友
你可以在评论里面写自己对 C 的理解