编程作业放到了github上:coursera_machine_learning
Support Vector Machine
支持向量机的目的,是将线性可分的数据集用一个超平面分开,而且让两个类的数据集都距离这个超平面尽可能的远。
将线性可分的数据集分开的超平面可以有无数个,这个用Perceptron就可以做到,但是让所有的点距离这个超平面尽可能的远,这样的解就是唯一的,使用SVM来求解。
接下来将分别从cost function、intuition和kernel来介绍SVM。
1. Optimization Objective
本节将从Logistic Regression来类比SVM。
先看Logistic Regression的“分类决策函数 h(x) ”以及“损失函数 J(θ) ”:
损失函数随着 z=θTx 的变化如下图。
当 y=1 时, J(θ)=−logh(x)=−log11+e−θTx
当 y=0 时, J(θ)=−log(1−h(x))=−log(1−11+e−θTx)
现在对上面的 J(θ) 做一些改变。
当 y=1 时, J(θ) 为下图中的紫色线:
当 y=0 时, J(θ) 为下图中的紫色线:
从上面的图中,可以知道,这个损失函数是希望,所有的负样例(
y=0
)的
θTx<−1
的,所有的正样例(
y=1
)的
θTx>1
的。
θTx
的含义其实是样例点到超平面的距离矢量。也就是说,损失函数希望所有的样例到超平面的距离都大于1,正负号代表方向(在超平面之上或者之下)。至于为什么是“1”,下面会详细讲到。
在SVM中,分类决策函数 h(x) 定义如下:
h(x) 的目的很简单,就是用一个超平面把正负样例分开。
损失函数 J(θ) 定义如下:
J(θ) 的目的是让正负样例尽可能地分开,距离超平面有一定的距离。希望: y=1 时, θTx>1 ; y=0 时, θTx<−1 。
2. Large Margin Intuition 1
SVM有如下optimization objective:
其中
C
是一个类似于
现在来看数据集线性可分的情况下,SVM选择超平面的策略,来看看SVM的intuition。
当数据集线性可分的时候,SVM挑选的超平面必须能够满足:
对所有的正样例有 θTx>1 ,所有的负样例有 θTx<−1 。
也就是说,所有的样例距离超平面都有一定的距离,就像下图中的蓝线所示:
如此一来,所有的 cost1=0 ,所有的 cost0=0 ,则优化目标变成如下形式:
minθ12∑j=1nθ2j
s.t. θTx>1 if y=1
θTx<−1if y=0
接下来看看SVM会选择怎样的超平面, θ 是超平面的法向量。
样例点
x
到超平面的距离
则
优化目标改写成:
第一种,margin非常小的时候:
0<p(1)≪1 的时候,为了使 p(1)∥θ∥>1 ,则 ∥θ∥ 需要很大;
−1≪p(2)<0 的时候,为了使 p(2)∥θ∥<−1 ,则 ∥θ∥ 需要很大;
这样一来,就违背了 minθ12∑nj=1θ2j ,所以,SVM不会选择这样的超平面。
第二种,margin比较大的时候:
p(1)>1 的时候, ∥θ∥ 不用很大,也能使 p(2)∥θ∥>1 ;
p(2)<−1 的时候, ∥θ∥ 不用很大,也能使 p(2)∥θ∥<−1 ;
这种情况符合 minθ12∑nj=1θ2j ,所以,SVM会选择这样的超平面。
3. Large Margin Intuition 2
上面Ng将的intuition没有解释为什么 θTx>1 ,这里的1究竟是怎么选择出来的。接下来结合李航的讲解来说明一下。
首先,定义几个术语。
定义1 (关于样例点的几何间隔):样例点到超平面的距离矢量
p(i)
,即:
定义2 (关于训练集的几何间隔):训练集中所有样例点的几何间隔的最小值,即:
SVM的目的就是找到使 p 最大的超平面。所以其optimization objective又可以写成如下形式:
明显地,
p
取值的变化,并不会影响到不等式的成立,只要
所以不如就令 p=1∥θ∥ ,如此一来,optimization objective被改写成如下形式:
又因为 maxθ1∥θ∥ 等价与 minθ12∥θ∥2 ,所以最终优化目为:
与上面Ng的optimization objective吻合。
需要注意的是:正如intuition1中所言,这个优化目标的使用是有约束条件的,其约束条件就是任意的 y(i)(θTx(i))⩾1 都要成立,也就是说,一定能够有一个超平面完美地分开数据集,即这个数据集是线性可分的。
总结一下,对于线性可分的数据集:
其分类决策函数 h(x) 定义如下:
h(x)={1if θTx>00 otherwise其优化目标/损失函数为:
minθ12∥θ∥2
s.t.y(i)(θTx(i))⩾1
4. Outlier - 存在特异值的数据集
上面讨论的都是数据集是线性可分的情况,实际上这种数据集太少了,实际操作中的数据集多多少少都有特异值(outlier)的干扰,除去这些outlier,剩下大部分样例点组成的数据是线性可分的。
那么对于这种存在少数的样例点不满足 y(i)(θTx(i))⩾1 的情况,SVM应该如何处理呢?
解决方法就是给每个样例点 x(i) 加上一个松弛变量 ε(i) ,使得约束条件变成:
对于每一个松弛变量,都要支付一个代价,于是优化目标变成:
再回过来看Ng在最开始给出的损失函数 J(θ) :
可以认为:
但实际求解中,不需要这样代换,因为 cost1 和 cost0 在 y(i)(θTx(i))<1 情况下的值是未知的,所以还不如直接将这个整体看成一个未知数,然后用其他的求最优解的算法来求得最优解即可。
总结一下,对于有outlier的数据集:
其分类决策函数 h(x) 定义如下:
h(x)={1if θTx>00 otherwise其优化目标/损失函数为:
minθ12∥θ∥2+C∑i=1mε(i)
s.t.y(i)(θTx(i))⩾1−ε(i)
5. Kernel - 核函数
上面的数据集都是基本上线性可分的,但是有些数据集,就是线性不可分的,比如像这样的:
之前讲Linear Regression的时候也出现过这种例子,那时候的处理方法也可以用在这里。
假设分类决策函数 h(x) 如下:
令 f1=x1 , f2=x2 , f3=x1x2 , f4=x21 , f5=x22 ,则:
这就又转化成了线性的。
把这些个 f1,f2,f3,f4,f5.... 称为新生成的特征,也就是说,需要生成一系列新的特征,把非线性的问题拉回到线性问题上来。
那么怎么生成这些新的特征?
在SVM中,使用核函数(kernel)来基于“现有特征”生成“新的特征”。
令:
然后对于第i个数据,其新的特征计算如下:
这里的 kernel() 是一个核函数,常用的核函数有“Guassian Kernel”,定义如下:
这样就将数据集由原来的
n
维特征空间映射到了新的
接下来的步骤就和上面处理线性可分数据集一样咯,只不过,现在SVM的输入不是
这里还有一个不确定的参数
6. 最优化问题求解
一般使用SMO算法来快速求解SVM。
详细过程涉及到数学相关的知识点,如“拉格朗日算子”、“对偶问题”。目前还没有弄得特别清楚,迷迷糊糊的。
实际操作中,这一步不需要自己去实现,套用现有的框架就可以实现了。