SVM支持向量机作为一种常用的分类器可以说是应用非常广泛的,我们直接进入正题,来手动推导SVM,让大家一起加深SVM的算法流程。首先SVM的意义就是在空间中找到一个超平面,把空点中的两个线性可分的点集完全分开,我们把这个超平面定义成wxi+b=0w \cdot {x_i} + b = 0,其中ww是一个n维的向量xi{x_i}表示空间中的点。与此同时,我们不仅需要用超平面将空间中的两个点集分开,同时需要超平面两侧距离超平面最近的样本点到超平面的距离最大化。我们在二维的平面看看这些数据吧:
手动推导SVM
从二维平面可以看出,我们最终的目的就是最大化margin,两个类别中存在距离超平面最近的点我们称作支持向量,支持向量所在的与超平面平行的两个平面之间的距离被称为margin。在n维空间中,点xx到直线wTxi+b=0{w^T} \cdot {x_i} + b = 0的距离为wTx+bw\frac{{\left| {{w^T}x + b} \right|}}{{\left\| w \right\|}},其中w=w12+w22 + ... + wd2\left\| w \right\| = \sqrt {w_1^2 + w_2^2{\text{ + }}...{\text{ + }}w_d^2},根据定义每个类别到超平面最近的点和超平面的距离为dd,那么这个类别其他所有的点到超平面的距离都是大于dd的,可以得到如下式子:
{wTxi+bwdyi=1wTxi+bwdyi=1\begin{cases} \frac{{{w^T}{x_i} + b}}{{\left\| w \right\|}} \geqslant d\quad{y_i} = 1\\ \\ \frac{{{w^T}{x_i} + b}}{{\left\| w \right\|}} \leqslant - d\quad{y_i} = 1 \end{cases}
同时也可以知道:
{wTxi+b>0yi=1wTxi+b<0yi=1\begin{cases} {w^T}{x_i} + b > 0\quad{y_i} = 1\\ \\ {w^T}{x_i} + b < 0\quad{y_i} = -1 \end{cases}
所以可以得到:
yi(wTxi+b)>0{y_i}({w^T}{x_i} + b) > 0
因为margin就是最小的距离,所以可以得到以下式子:
maxmargin=maxminwTxi+bw;s.t.yi(wTxi+b)>0\max\quad margin = \max\quad\min \frac{{\left| {{w^T}{x_i} + b} \right|}}{{\left\| w \right\|}};\quad\quad s.t.\quad{y_i}({w^T}{x_i} + b) > 0
上述式子等价于:
maxmargin=maxmin(wTxi+b)yiw;s.t.yi(wTxi+b)>0\max\quad margin = \max\quad\min \frac{{ ({{w^T}{x_i} + b}){y_i} }}{{\left\| w \right\|}};\quad\quad s.t.\quad{y_i}({w^T}{x_i} + b) > 0
我们可以将上述公式拆开来看:
maxmargin=max1wmin(wTxi+b)yi;s.t.yi(wTxi+b)>0\max\quad margin = \max \frac{{ 1 }}{{\left\| w \right\|}}min{{ ({{w^T}{x_i} + b}){y_i} }};\quad\quad s.t.\quad{y_i}({w^T}{x_i} + b) > 0
我们再来看看分类的图,我们要将所有的点分成+1和-1两个类,那么如图所示:
手动推导SVM
由上图可知,所有的点一定会在平面wTxi+b=1{w^T}{x_i} + b = 1wTxi+b=1{w^T}{x_i} + b =- 1两侧,所以minyi(wTxi+b)=1\min {y_i}({w^T}{x_i} + b) = 1,再结合上述公式我们可以得到:
maxmargin=max1w;s.t.yi(wTxi+b)1\max margin = \max \frac{1}{{\left\| w \right\|}};\quad s.t.\quad{y_i}({w^T}{x_i} + b) \geqslant 1
这个问题同样可以等价于:
maxmargin=min12w2;s.t.yi(wTxi+b)1\max m\arg in = \min \frac{1}{2}{\left\| w \right\|^2};\quad s.t.\quad {y_i}({w^T}{x_i} + b) \geqslant 1
接下来就是求解SVM优化问题的过程:

1.构造拉格朗日函数

因为约束函数yi(wTxi+b)11yi(wTxi+b)0{y_i}({w^T}{x_i} + b) \geqslant 1 \Leftrightarrow 1 - {y_i}({w^T}{x_i} + b) \leqslant 0,所以我们可以构造柱函数的拉格朗日函数:
L(w,b,λ)=12w2 + i=1mλi[1(wTxi+b)yi]L(w,b,\lambda ) = \frac{1}{2}{\left\| w \right\|^2}{\text{ + }}\sum\limits_{i = 1}^m {{\lambda _i}[1 - ({w^T}{x_i} + b){y_i}]}
其中λi0{\lambda _i} \geqslant 0i=1,2,...,mi = 1,2,...,m

2.求拉格朗日函数对于w和b最小

原来的目标函数为:
maxmargin=minw,bmaxλL(w,b,λ)\max \quad margin = {\min _{w,b}}\quad{\max _\lambda }L(w,b,\lambda )
上述式子我们可以用对偶关系转化一下:
maxmargin=maxλminw,bL(w,b,λ);s.t.λi0\max \quad margin = {\max _\lambda }\quad {\min _{w,b}}L(w,b,\lambda );\quad s.t.\quad {\lambda _i} \geqslant 0
一般来说要求一个数学表达式的极值的话,我们采用求偏导的方法,首先我们对ww求偏导,可以得到:
Lw=wi=1mλixiyi=0w=i=1mλixiyi\frac{{\partial L}}{{\partial w}} = w - \sum\limits_{i = 1}^m {{\lambda _i}{x_i}{y_i} = 0} \Leftrightarrow w = \sum\limits_{i = 1}^m {{\lambda _i}{x_i}{y_i}}
bb求偏导数可以得到:
Lb=i=1mλiyi=0\frac{{\partial L}}{{\partial b}} = \sum\limits_{i = 1}^m {{\lambda _i}{y_i} = 0}
再将结果带入拉格朗日表达式中:
L(w,b,λ)=12i=1mj=1mλiλjyiyjxixj+i=1mλii=1mλiyi((j=1mλjyjxj)xi+b)L(w,b,\lambda ) = \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j} + \sum\limits_{i = 1}^m {{\lambda _i}} - \sum\limits_{i = 1}^m {{\lambda _i}{y_i}((\sum\limits_{j = 1}^m {{\lambda _j}{y_j}{x_j}){x_i} + b} )} } }
我们继续优化拉格朗日表达式:
L(w,b,λ)=12i=1mj=1mλiλjyiyjxixj+i=1mλii=1mj=1mλiλjyiyjxixjbi=1mλiyiL(w,b,\lambda ) = \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j} + \sum\limits_{i = 1}^m {{\lambda _i} - \sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j} - b\sum\limits_{i = 1}^m {{\lambda _i}{y_i}} } } } } }
因为i=1mλiyi=0{\sum\limits_{i = 1}^m {{\lambda _i}{y_i}} }=0,所以整个式子可以简化成:
L(w,b,λ)=i=1mλi12i=1mj=1mλiλjyiyjxixjL(w,b,\lambda ) = \sum\limits_{i = 1}^m {{\lambda _i}} - \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j}} }

3.求minw,bL(w,b,λ){\min _{w,b}}L(w,b,\lambda )λ\lambda最大

上述说过用对偶转换,整体的目标函数可以写成:
minw,bL(w,b,λ)=maxλL(w,b,λ){\min _{w,b}}L(w,b,\lambda ) = {\max _\lambda }L(w,b,\lambda )
那么现在的求解变成了如下表达式:
maxλL(w,b,λ)=maxλ[i=1mλi12i=1mj=1mλiλjyiyjxixj];s.t.i=1mλiyi=0λi0{\max _\lambda }L(w,b,\lambda ) = {\max _\lambda }[\sum\limits_{i = 1}^m {{\lambda _i}} - \frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j}} } ];\quad s.t.\quad\sum\limits_{i = 1}^m{{\lambda _i}{y_i} = 0} \quad{\lambda _i} \geqslant 0
为了方便计算,我们将表达式前面加上一个负号,那么求极大值就变成了极小值:
minλL(w,b,λ)=minλ[12i=1mj=1mλiλjyiyjxixji=1mλi];s.t.i=1mλiyi=0λi0{\min _\lambda }L(w,b,\lambda ) = {\min _\lambda }[\frac{1}{2}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {{\lambda _i}{\lambda _j}{y_i}{y_j}{x_i}{x_j}} }-\sum\limits_{i = 1}^m {{\lambda _i}} ];\quad s.t.\quad\sum\limits_{i = 1}^m{{\lambda _i}{y_i} = 0} \quad{\lambda _i} \geqslant 0

4.求解w{w^*}b{b^*}

对于原始问题和对偶问题,充分必要条件就是满足KTT条件,于是可以得到如下公式:
1.L(w,b,λ)w=0\frac{{\partial L(w,b,\lambda )}}{{\partial w}} = 0

2.L(w,b,λ)b=0\frac{{\partial L(w,b,\lambda )}}{{\partial b}} = 0

3.L(w,b,λ)λ=0\frac{{\partial L(w,b,\lambda )}}{{\partial \lambda}} = 0

4.λi(1yi(wTxi+b))=0{\lambda _i}(1 - {y_i}({w^T}{x_i} + b)) = 0

5.λi0{\lambda _i} \geqslant 0

6.1yi(wTxi+b)01 - {y_i}({w^T}{x_i} + b) \leqslant 0

我们假设整个问题的最优解是w{w^*}b{b^*}λ{\lambda ^*},由KTT条件可以推断出不可能所有的λi{\lambda _i}都是0,如果所有的λi{\lambda _i}都等于0的话,那么w=0{w^*}=0,这显然是错误的,所以至少有一个λ{\lambda}是大于0的,这个时候根据第4个公式可以得到:1yi(wxi+b)=01 - {y_i}({w^*}{x_i} + {b^*}) = 0因为由公式1可以得到:
w=i=1mλiyixi{w^*} = \sum\limits_{i = 1}^m {\lambda _i^*{y_i}{x_i}}
这个时候我们可以将w{w^*}带入到1yi(wxi+b)=01 - {y_i}({w^*}{x_i} + {b^*}) = 0中去,因为yi=±1{y_i} = \pm 1,所以yi2=1y_i^2 = 1,由上述公式可以得到:
yjyj2(i=1mλiyixixj+b)=0{y_j} - y_j^2(\sum\limits_{i = 1}^m {\lambda _i^*{y_i}{x_i}{x_j} + {b^*}} ) = 0最终可以求得:
b=yji=1mλiyixixj=yji=1mλiyi(xixj){b^*} = {y_j} - \sum\limits_{i = 1}^m {\lambda _i^*{y_i}{x_i}{x_j}} = {y_j} - \sum\limits_{i = 1}^m {\lambda _i^*{y_i}({x_i}{x_j}} )
这个时候我们就求出了所有的w{w^*}b{b^*},就可以求出分类的超平面为:
i=1mλiyi(xxi)+b=0\sum\limits_{i = 1}^m {\lambda _i^*{y_i}(x{x_i})} + {b^*} = 0
同理,分类决策函数就可以写成:
f(x)=sign(i=1mλiyi(xxi)+b)f(x) = sign(\sum\limits_{i = 1}^m {\lambda _i^*{y_i}(x{x_i})} + {b^*})

到这里,整个SVM的推导过程就完成了,希望这篇博文能够帮助大家对SVM分类的理解有所帮助,SVM是一种基础的很重要的分类算法,也希望大家能够理解和掌握,文中如有纰漏,请大家不吝指教;如有转载,也请标明出处,谢谢大家。

相关文章: