在网上找了很多支持向量机的资料看都是迷迷糊糊没完全搞懂,可能是我理解能力比较差,最后还是 Coursera 上吴大神的 Machine Learning 课程把我一下子讲懂了。


由于支持向量机是由逻辑回归(Logistic Regression)衍生而来的,所以学习 SVM 之前务必完全理解逻辑回归。另外,文章中有些关于逻辑回归的东西(例如符号标记、函数的具体由来及其的一些性质)还请参考之前的两篇文章,这里就不在赘述了:
《机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)》
《机器学习笔记05:正则化(Regularization)、过拟合(Overfitting)》

支持向量机的应用很广泛,在工业、计算机行业和学术界都有比较多的应用,而且它应该是最常用的分类器。所以喜欢 Machine Learning 的童鞋们应该好好掌握 SVM 这一大杀器。


一、最大间隔分类(Large Margin Classification)

1.优化目标(Optimization Objective)

在了解 SVM 之前,我们先来看看之前的逻辑回归的误差函数(Cost function):

J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]=1mi=1m[y(i)log(11+eθTx(i))+(1y(i))log(111+eθTx(i))]
<script type="math/tex; mode=display" id="MathJax-Element-1">\begin{aligned} J(\theta) &=-\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} log(h_\theta(x^{(i)})) +(1-y^{(i)}) log(1-h_\theta(x^{(i)})) \right] \\ &= -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} log(\frac{1}{1+e^{-\theta^Tx^{(i)}}}) +(1-y^{(i)}) log(1-\frac{1}{1+e^{-\theta^Tx^{(i)}}}) \right] \end{aligned}</script>
把求和符号之外的负号放到求和部分里面,上式就等价于下面这个式子:
J(θ)=1mi=1m[y(i)log(11+eθTx(i))(1y(i))log(111+eθTx(i))]=1mi=1m[y(i)(log(11+eθTx(i)))+(1y(i))(log(111+eθTx(i)))](11)
<script type="math/tex; mode=display" id="MathJax-Element-2">\begin{aligned} J(\theta) &= \frac{1}{m} \sum_{i=1}^m \left[ -y^{(i)} log(\frac{1}{1+e^{-\theta^Tx^{(i)}}}) -(1-y^{(i)}) log(1-\frac{1}{1+e^{-\theta^Tx^{(i)}}}) \right] \\ &=\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} (-log(\frac{1}{1+e^{-\theta^Tx^{(i)}}}))+(1-y^{(i)}) (-log(1-\frac{1}{1+e^{\theta^Tx^{(i)}}})) \right] \end{aligned} \quad\quad (1-1)</script>
回忆一下,在逻辑回归中,假设函数是 hθ(x)=g(z)=11+ez=11+eθTX <script type="math/tex" id="MathJax-Element-3">h_\theta(x)=g(z)=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-\theta^TX}}</script>,其图像如下图所示:

这里写图片描述

当我们用逻辑回归来进行分类的时候,一般有
y={10if hθ(x)0.5 ;if hθ(x)<0.5 .
<script type="math/tex; mode=display" id="MathJax-Element-4">y=\begin{cases} 1 & \text{if $h_\theta(x)\ge 0.5$} \text{ ;} \\ 0 & \text{if $h_\theta(x)< 0.5$} \text{ .} \end{cases}</script>
即当 θTX0 <script type="math/tex" id="MathJax-Element-5">\theta^TX \ge 0</script> 时,预测为 1,当 θTX<0 <script type="math/tex" id="MathJax-Element-6">\theta^TX < 0</script> 时,预测为 0。再回到式子 (1-1),我们可以画出 (log(11+eθTx(i))) <script type="math/tex" id="MathJax-Element-7">(-log(\frac{1}{1+e^{-\theta^Tx^{(i)}}}))</script> 和 (log(111+eθTx(i))) <script type="math/tex" id="MathJax-Element-8">(-log(1-\frac{1}{1+e^{\theta^Tx^{(i)}}}))</script> 的图像,分别如下面的左图和右图中的黑色曲线所示(至于图像为什么是这种形状,读者可以不难根据其公式画出):


这里写图片描述


而在支持向量机中,我们不仅要求 θTX0 <script type="math/tex" id="MathJax-Element-9">\theta^TX \ge 0</script> 或 θTX<0 <script type="math/tex" id="MathJax-Element-10">\theta^TX < 0</script>,还要求 θTX>>0 <script type="math/tex" id="MathJax-Element-11">\theta^TX >> 0</script> 或 θTX<<0 <script type="math/tex" id="MathJax-Element-12">\theta^TX << 0</script> 的时候才分别预测 y=1 <script type="math/tex" id="MathJax-Element-13">y=1</script> 或 y=0 <script type="math/tex" id="MathJax-Element-14">y=0</script>,一般可以取1作为界限。我们令:

Cost1(θTx(i))=max(0,K(1z))Cost0(θTx(i))=max(0,K(1+z))
<script type="math/tex; mode=display" id="MathJax-Element-15">Cost_1(\theta^Tx^{(i)})=max(0,K(1-z)) \\ Cost_0(\theta^Tx^{(i)})=max(0,K(1+z))</script>
上面这两个函数分别对应于左图和右图中紫红色的分段线。我们用 Cost1(θTx(i)) <script type="math/tex" id="MathJax-Element-16">Cost_1(\theta^Tx^{(i)})</script> 和 Cost0(θTx(i)) <script type="math/tex" id="MathJax-Element-17">Cost_0(\theta^Tx^{(i)})</script> 分别替换 (log(11+eθTx(i))) <script type="math/tex" id="MathJax-Element-18">(-log(\frac{1}{1+e^{-\theta^Tx^{(i)}}}))</script> 和 (log(111+eθTx(i))) <script type="math/tex" id="MathJax-Element-19">(-log(1-\frac{1}{1+e^{\theta^Tx^{(i)}}}))</script> 之后得到:
J(θ)=1mi=1m[y(i)Cost1(θTx(i))+(1y(i))Cost0(θTx(i))]
<script type="math/tex; mode=display" id="MathJax-Element-20">\begin{aligned} J(\theta) &=\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)}Cost_1(\theta^Tx^{(i)})+(1-y^{(i)})Cost_0(\theta^Tx^{(i)})\right] \end{aligned}</script>
加上正则化项后为:
J(θ)=1mi=1m[y(i)Cost1(θTx(i))+(1y(i))Cost0(θTx(i))]+λ2mj=1nθ2j
<script type="math/tex; mode=display" id="MathJax-Element-21">\begin{aligned} J(\theta) &=\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)}Cost_1(\theta^Tx^{(i)})+(1-y^{(i)})Cost_0(\theta^Tx^{(i)})\right] \end{aligned}+\frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2</script>
在 SVM 中,我们不用除以样本数量 m <script type="math/tex" id="MathJax-Element-22">m</script> ,并且两个求和项都除以 λ<script type="math/tex" id="MathJax-Element-23">\lambda</script>,并记 C=1λ <script type="math/tex" id="MathJax-Element-24">C=\frac{1}{\lambda}</script>。所以支持向量机的误差函数为:
J(θ)=Ci=1m[y(i)Cost1(θTx(i))+(1y(i))Cost0(θTx(i))]+12j=1nθ2j
<script type="math/tex; mode=display" id="MathJax-Element-25">\begin{aligned} J(\theta) &=C \sum_{i=1}^m \left[ y^{(i)}Cost_1(\theta^Tx^{(i)})+(1-y^{(i)})Cost_0(\theta^Tx^{(i)})\right] \end{aligned}+\frac{1}{2}\sum_{j=1}^n \theta_j^2</script>
其实,参数 C <script type="math/tex" id="MathJax-Element-26">C</script> 和逻辑回归中的 λ<script type="math/tex" id="MathJax-Element-27">\lambda</script> 的功能是一样的,同样是为了控制 欠拟合过拟合之间的平衡。从 SVM 的误差函数中我们可以看出,如果要最小化误差,即使第一个求和项为0。即最优化支持向量机,就需要使得参数 θ <script type="math/tex" id="MathJax-Element-28">\theta</script> 对于训练集中的每组样本都要达到: 当 y=1 <script type="math/tex" id="MathJax-Element-29">y=1</script> 时 θTx(i)1 <script type="math/tex" id="MathJax-Element-30">\theta^Tx^{(i)} \ge1</script>;当 y=0 <script type="math/tex" id="MathJax-Element-31">y=0</script> 时 θTx(i)1 <script type="math/tex" id="MathJax-Element-32">\theta^Tx^{(i)} \le -1</script>。另外,后面的求和项,即惩罚项(正则化项),是为了使训练得到的 θ <script type="math/tex" id="MathJax-Element-33">\theta</script> 比较的小,如此一来, 我们对 θTx(i) <script type="math/tex" id="MathJax-Element-34">\theta^Tx^{(i)}</script> 的约束条件就造成了最大间隔分类的效果。下面会具体解释最大间隔。


2.什么是大间隔(Large Margin Intuition)

都说 SVM 是一个大间隔分类器,现在就来讲一讲什么是大间隔。

在误差函数 J(θ) <script type="math/tex" id="MathJax-Element-35">J(\theta)</script> 中,如果我们将 C <script type="math/tex" id="MathJax-Element-36">C</script> 的值设置为一个非常大的数,那么误差函数将会给 θ<script type="math/tex" id="MathJax-Element-37">\theta</script> 加以约束使得

A=i=1m[y(i)Cost1(θTx(i))+(1y(i))Cost0(θTx(i))]=0
<script type="math/tex; mode=display" id="MathJax-Element-38">A=\sum_{i=1}^m \left[ y^{(i)}Cost_1(\theta^Tx^{(i)})+(1-y^{(i)})Cost_0(\theta^Tx^{(i)})\right]=0</script>其原因涉及到凸二次规划以及概率论中的先验概率分布,这里不做深究。( 留个位置在这里,以后写了贴链接)。

那么,现在反过来想,既然 C <script type="math/tex" id="MathJax-Element-39">C</script> 非常大,就会使得 A=0<script type="math/tex" id="MathJax-Element-40">A=0</script>,要使得 A=0 <script type="math/tex" id="MathJax-Element-41">A=0</script>,我们就需要在训练过程中对 θ <script type="math/tex" id="MathJax-Element-42">\theta</script> 做如下约束:

1)如果 y=1 <script type="math/tex" id="MathJax-Element-43">y=1</script>,要求 θTX1 <script type="math/tex" id="MathJax-Element-44">\theta^TX \ge 1</script>,(不仅是 θTX0 <script type="math/tex" id="MathJax-Element-45">\theta^TX \ge 0</script>);
2)如果 y=0 <script type="math/tex" id="MathJax-Element-46">y=0</script>,要求 θTX1 <script type="math/tex" id="MathJax-Element-47">\theta^TX \le -1</script>,(不仅是 θTX<0 <script type="math/tex" id="MathJax-Element-48">\theta^TX<0</script>)。

(回忆一下前面,上面这个约束以 1 作为阈值是因为 Cost1(θTx(i))=max(0,K(1z)),Cost0(θTx(i))=max(0,K(1+z)) <script type="math/tex" id="MathJax-Element-49">Cost_1(\theta^Tx^{(i)})=max(0,K(1-z))\,,Cost_0(\theta^Tx^{(i)})=max(0,K(1+z))</script>,所以上面的约束以 1 作为阈值才能使 A=0 <script type="math/tex" id="MathJax-Element-50">A=0</script>)。


好了,通过设置非常大的正则化参数 C <script type="math/tex" id="MathJax-Element-51">C</script>,再加上上面对参数 θ<script type="math/tex" id="MathJax-Element-52">\theta</script> 的约束,我们使得 A=0 <script type="math/tex" id="MathJax-Element-53">A=0</script>,那么,误差函数 J(θ) <script type="math/tex" id="MathJax-Element-54">J(\theta)</script> 可以简化为如下形式:

J(θ)=C0+12j=1nθ2j=12j=1nθ2j
<script type="math/tex; mode=display" id="MathJax-Element-55">J(\theta)=C\cdot0+\frac{1}{2} \sum_{j=1}^n\theta_j^2=\frac{1}{2} \sum_{j=1}^n\theta_j^2</script>
在 SVM 的训练过程中,会最小化上面这个误差函数( 此文章不包括SVM的训练,SVM 的训练涉及到较多的数学知识和一些数值计算技巧,而且也不推荐大家自己写代码来训练 SVM,有一个非常好的库叫做 libsvm,可以直接调用接口进行训练自己的 SVM)。


和逻辑回归不同的是,如下图所示,SVM 的决策边界会最大限度地离正样本和负样本尽可能地远。决策边界和离决策边界最近的那个样本之间的距离就称为 间隔(margin)。这也正是 SVM 被称为大间隔分类器的原因。

这里写图片描述

需要注意的是,仅当 C <script type="math/tex" id="MathJax-Element-56">C</script> 非常大是,才会有“大间隔分类”的效果。同时,如果有一些样本太偏离大多数样本的总体位置,可以减小 C<script type="math/tex" id="MathJax-Element-57">C</script> 的值来防止过拟合。

可能对于上面这个不太像解释的解释还是感到很疑惑,其实大间隔就如上图中所示的一样, 支持向量机的决策边界会在正负样本之间离正负样本尽可能的远。下面来看其中的数学原理。


3.最大间隔分类背后的数学原理(Mathematics Behind Large Margin Classification)

先来看看什么是向量的内积。假如我们有两个向量:

u=[u1u2],v=[v1v2]
<script type="math/tex; mode=display" id="MathJax-Element-58">u=\left[\begin{matrix}u_1\\u_2\end{matrix}\right],\quad v=\left[\begin{matrix}v_1\\v_2\end{matrix}\right]</script>
我们记向量 v <script type="math/tex" id="MathJax-Element-59">v</script> 的长度为 v<script type="math/tex" id="MathJax-Element-60">\Arrowvert v\Arrowvert</script>,它表示从原点到点 (v1,v2) <script type="math/tex" id="MathJax-Element-61">(v_1,v_2)</script> 的直线距离。由毕达哥拉斯定理可知,向量 v <script type="math/tex" id="MathJax-Element-62">v</script> 的长度为 v=v21+v22<script type="math/tex" id="MathJax-Element-63">v=\sqrt{v_1^2+v_2^2}</script>。我们知道 vTu=vcosαu <script type="math/tex" id="MathJax-Element-64">v^T\cdot u=\Arrowvert v\Arrowvert\cos\alpha\Arrowvert u\Arrowvert</script>,其中 α <script type="math/tex" id="MathJax-Element-65">\alpha</script> 为向量 v <script type="math/tex" id="MathJax-Element-66">v</script> 和 u<script type="math/tex" id="MathJax-Element-67">u</script> 的夹角:

这里写图片描述

如上图,我们把 v <script type="math/tex" id="MathJax-Element-68">v</script> 在 u<script type="math/tex" id="MathJax-Element-69">u</script> 上的投影 vcosα <script type="math/tex" id="MathJax-Element-70">\Arrowvert v\Arrowvert cos\alpha</script> 记为 p <script type="math/tex" id="MathJax-Element-71">p</script>。所以:vTu=vcosαu=pu=u1v1+u2v2<script type="math/tex" id="MathJax-Element-72">v^T\cdot u=\Arrowvert v\Arrowvert\cos\alpha\Arrowvert u\Arrowvert=p\cdot \Arrowvert u\Arrowvert=u_1v_1+u_2v_2</script>,需要注意的是,如果它们的夹角大于 90°,那么向量的内积将为负值,因为 cosα<0 <script type="math/tex" id="MathJax-Element-73">cos\alpha<0</script>。


内积就讲这么多,相信大家在高中都学过。现在我们回到上一节,回忆一下,在使得 A=mi=1[y(i)Cost1(θTx(i))+(1y(i))Cost0(θTx(i))]=0 <script type="math/tex" id="MathJax-Element-74">A=\sum_{i=1}^m \left[ y^{(i)}Cost_1(\theta^Tx^{(i)})+(1-y^{(i)})Cost_0(\theta^Tx^{(i)})\right]=0</script> 之后,误差函数简化为 J(θ)=C0+12nj=1θ2j=12nj=1θ2j <script type="math/tex" id="MathJax-Element-75">J(\theta)=C\cdot0+\frac{1}{2} \sum_{j=1}^n\theta_j^2=\frac{1}{2} \sum_{j=1}^n\theta_j^2</script>,可以改写为:

J(θ)=12j=1nθ2j=12(θ21+θ22+...+θ2n)=12(θ21+θ22+...+θ2n)2=12θ2
<script type="math/tex; mode=display" id="MathJax-Element-76">\begin{aligned} J(\theta)&=\frac{1}{2} \sum_{j=1}^n\theta_j^2 \\ &= \frac{1}{2}(\theta_1^2+\theta_2^2+...+\theta_n^2) \\ &= \frac{1}{2}(\sqrt{\theta_1^2+\theta_2^2+...+\theta_n^2})^2 \\ &= \frac{1}{2}\Arrowvert\theta\Arrowvert^2 \end{aligned}</script>即,我们要最小化参数向量 θ <script type="math/tex" id="MathJax-Element-77">\theta</script> 的长度。同样地,我们有:
x(i)θT=p(i)θ=θ1x(i)1+θ2x(i)2+...+θnx(i)n
<script type="math/tex; mode=display" id="MathJax-Element-78">x^{(i)}\theta^T=p^{(i)}\cdot\Arrowvert\theta\Arrowvert=\theta_1x_1^{(i)}+\theta_2x_2^{(i)}+...+\theta_nx_n^{(i)}</script>注意,我们一般把样本特征向量 x(i) <script type="math/tex" id="MathJax-Element-79">x^{(i)}</script> 投影到参数向量 θ <script type="math/tex" id="MathJax-Element-80">\theta</script> 上。所以,我们在上一节中提到的约束条件就变为:

1)如果 y=1 <script type="math/tex" id="MathJax-Element-81">y=1</script>,要求 p(i)θ1 <script type="math/tex" id="MathJax-Element-82">p^{(i)}\cdot\Arrowvert\theta\Arrowvert \ge 1</script>;
2)如果 y=0 <script type="math/tex" id="MathJax-Element-83">y=0</script>,要求 p(i)θ1 <script type="math/tex" id="MathJax-Element-84">p^{(i)}\cdot\Arrowvert\theta\Arrowvert \le -1</script>。

由于在训练过程中, θ <script type="math/tex" id="MathJax-Element-85">\theta</script> 会变得很小,而又必须满足上述的约束条件,所以 p(i)=x(i)cosα <script type="math/tex" id="MathJax-Element-86">p^{(i)}=\Arrowvert x^{(i)}\Arrowvert cos\alpha</script> 将会变得尽可能的大,因为 x(i) <script type="math/tex" id="MathJax-Element-87">\Arrowvert x^{(i)}\Arrowvert</script> 为常量,所以在训练过程中,参数向量 θ <script type="math/tex" id="MathJax-Element-88">\theta</script> 与 各个训练样本特征值向量 x(i) <script type="math/tex" id="MathJax-Element-89">x^{(i)}</script> 的夹角会越来越小。我们知道,训练完成时,决策边界是一条满足 θ1x1+θ2x2+...+θnxn=0 <script type="math/tex" id="MathJax-Element-90">\theta_1x_1+\theta_2x_2+...+\theta_nx_n=0</script> 的曲线或者直线,所以向量 θ <script type="math/tex" id="MathJax-Element-91">\theta</script> 和各个训练样本 x(i) <script type="math/tex" id="MathJax-Element-92">x^{(i)}</script> 是尽可能保持垂直的(任意维数),从而导致决策边界会离正负样本尽可能地远。(读者可以自行画图体验一下。)


二、核函数(Kernels)

用markdown编辑器写数学公式,只要篇幅一长,编写就会很卡,所以核函数另起一篇。先留个位置在这里。


以上就是支持向量机的大概内容(不包括核函数),核函数请参考上面链接的文章
如有错误,期望您能纠正,留言或者加入QQ群

——–转载请注明出处,谢谢——–

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐