二、SVM的求解过程

1、对问题的简单求解

其实上一章中的结果,已经是一个可求解的问题了,因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题,只要通过现成的QP包就能解决这个二次规划问题。

SVR模型及Python代码 svm算法python_svm

2、求解方式转换

由于这个结构具有特殊性,所以可以通过拉格朗日的对偶性( Lagrange Duality),将原问题转到对偶问题进行优化(两者等价)。

这样是有两个优点:一是对偶问题更容易求解,二是也可以引入核函数,解决非线性分类问题。

那么怎么才能变到对偶问题呢?

首先就要讲一下拉格朗日问题,我们大学高数都学过拉格朗日乘子法(Lagrange Multiplier) 求解。具体的原理我就不说了,请参考 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

主要举例说一下:

我们利用拉格朗日乘子将约束条件限制到一个拉格朗日函数里

SVR模型及Python代码 svm算法python_python_02


然后令

SVR模型及Python代码 svm算法python_svm_03


这个

SVR模型及Python代码 svm算法python_约束条件_04

就是我们要求解的原问题(primal problem),只要通过最小化

SVR模型及Python代码 svm算法python_约束条件_04

就可以解决 。为什么最小化

SVR模型及Python代码 svm算法python_约束条件_04

就可以了呢?我们以一个更一般的例子来解释一下这个求解原理。————————————————-原理 1(start)————————————————–

这个例子更为广泛,只不过多了一个等式限制

假设存在这样一个最优化的情况

SVR模型及Python代码 svm算法python_约束条件_07


我们通过拉格朗日乘子变为这种形式

SVR模型及Python代码 svm算法python_python_08


我们想要最小化的是min f(w),怎么用在拉格朗日公式中表达出这个呢?首先我们知道

SVR模型及Python代码 svm算法python_svm_09


SVR模型及Python代码 svm算法python_约束条件_10

是拉格朗日乘子,我们首先想到是不是要求解min L()啊,但是却恰恰相反,我们要最大化L。因为在g小于0的情况下如果我们无限的增大

SVR模型及Python代码 svm算法python_svm_09

,min L()其实是根本无解的,因为可以无限的小。为了排除这种情况,我们定义了如下函数:

SVR模型及Python代码 svm算法python_SVR模型及Python代码_12


尝试一下我们会发现,这个表达式在违反最优化的条件时结果都是无穷,当

SVR模型及Python代码 svm算法python_python_13


SVR模型及Python代码 svm算法python_python_14

的时候只要调节一下

SVR模型及Python代码 svm算法python_svm_09


SVR模型及Python代码 svm算法python_约束条件_10

就可以得到无穷的值,但是只有满足我们上面的g和h满足约束的时候才能够得到

SVR模型及Python代码 svm算法python_SVR模型及Python代码_17

等于f(w)。但是切记有个条件,就是

SVR模型及Python代码 svm算法python_python_18


总结来说就是:

SVR模型及Python代码 svm算法python_svm_19


所以当我们想要求min f(w)的时候,就只要求最小的

SVR模型及Python代码 svm算法python_SVR模型及Python代码_17

就可以了。

即:

SVR模型及Python代码 svm算法python_约束条件_21

——————————————-原理 1(end)———————————————————-

我们上面讲的是为什么可以通过最小化

SVR模型及Python代码 svm算法python_SVR模型及Python代码_17

代替min f(w),但是我们也发现了,解决

SVR模型及Python代码 svm算法python_SVR模型及Python代码_17

的最小化也不是一个简单的问题,因为其中还是有一个不等式约束

SVR模型及Python代码 svm算法python_python_18

,那么怎么解决这个问题呢???

为了防止忘记,我们再回顾一下我们的问题:

SVR模型及Python代码 svm算法python_python_02



SVR模型及Python代码 svm算法python_svm_03

求解min

SVR模型及Python代码 svm算法python_SVR模型及Python代码_27


其实也就是求解

SVR模型及Python代码 svm算法python_python_28

的最小值因为在满足约束条件的情况下

SVR模型及Python代码 svm算法python_svm_29


我们还是继续通过上面原理1中的例子继续推倒,来解释上面求解最小化的问题。

————————————————-原理 2(start)————————————————–

下面主要讲的是如何求解

SVR模型及Python代码 svm算法python_SVR模型及Python代码_30


我们定义

SVR模型及Python代码 svm算法python_svm_31

叫做

SVR模型及Python代码 svm算法python_python_32

(原始问题),解决这个问题的办法就是将之变为对偶问题,什么是对偶问题呢?

SVR模型及Python代码 svm算法python_SVR模型及Python代码_33


就是所谓的对偶问题我们称之为

SVR模型及Python代码 svm算法python_SVR模型及Python代码_34

,我们可以看出对偶问题就是原始问题的min和max进行了调换,但是注意下标哦,两个问题的变量也跟着变化了。

原问题

SVR模型及Python代码 svm算法python_python_32

和对偶问题

SVR模型及Python代码 svm算法python_SVR模型及Python代码_34

有什么关联呢?

SVR模型及Python代码 svm算法python_SVR模型及Python代码_37


因为一般更换顺序的结果是Max Min(X) <= MinMax(X)

为什么要转换呢?

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。而且有在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。换言之,之所以从minmax的原始问题,转化为maxmin的对偶问题,一者因为是的近似解,二者,转化为对偶问题后,更容易求解。

什么时候可以转换呢?

这个转换条件只有在满足KKT条件时才能够成立,前面我引用了一个连接介绍了一下大概的KKT原理,我这里先简单的介绍一下后面会专门集中精力讲一下这个。

首先要明白两点:

· 什么是凸优化:

SVR模型及Python代码 svm算法python_SVR模型及Python代码_38

为一个凸集,f:

SVR模型及Python代码 svm算法python_约束条件_39

为一个凸函数。凸优化就是找出一个点

SVR模型及Python代码 svm算法python_python_40

,使得每一个

SVR模型及Python代码 svm算法python_约束条件_41

满足

SVR模型及Python代码 svm算法python_约束条件_42


· KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。

而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件(由于是借图范围标号不太一样):

SVR模型及Python代码 svm算法python_svm_43


即对上面的问题对应于:

SVR模型及Python代码 svm算法python_svm_44


这部分后面专门讲吧。。。。有点复杂,牵扯到了非线性规划的知识。

————————————————-原理 2(end)————————————————–

SVR模型及Python代码 svm算法python_python_02


我们回到SVM里来,将问题由原始问题转为对偶问题求解:

(1)首先固定

SVR模型及Python代码 svm算法python_约束条件_46

,此时

SVR模型及Python代码 svm算法python_python_02

的最小值只与w和b有关,按照正常的求解最小值方式,对w和b分别求导并令导数为0:

SVR模型及Python代码 svm算法python_约束条件_48

(对w求导为二范数求导)

将结果带入到L中,得到:

SVR模型及Python代码 svm算法python_python_49


推倒这个是个非常复杂的过程,具体过程如下:

SVR模型及Python代码 svm算法python_svm_50


由此可见,现在剩下的唯一一个变量就是

SVR模型及Python代码 svm算法python_svm_51


(2)求极大值的过程,经过上面的推倒我们已经得出:

SVR模型及Python代码 svm算法python_svm_52


注意约束条件。至于怎么求

SVR模型及Python代码 svm算法python_SVR模型及Python代码_53

要用到SMO算法,我会在后面结合Python一起讲

(3)求w 和 b,其中由

SVR模型及Python代码 svm算法python_最小化_54

得到w,在根据

SVR模型及Python代码 svm算法python_约束条件_55


得到b,这是由于考虑到超平面的支持向量点到超平面的距离(也就是那个最小距离)相同,回到原始问题的约束条件上可以看出当y为-1时(wx+b)取最大值得到最小距离,y为+1时wx+b取最小值时为最小距离,也就得到上面等式。正规的说法是 : 离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。

这里来说说这样做的好处:

将w带入

SVR模型及Python代码 svm算法python_svm_56

(这其实就是整个问题的出发点,超平面)得到

SVR模型及Python代码 svm算法python_最小化_57


现在有了

SVR模型及Python代码 svm算法python_SVR模型及Python代码_58

我们就根本不用求出w就可以了,直接就用新数据和原始数据中的所有样本做内积就可以了。为什么这样比计算w再用新数据和w、b线性运算更快呢?

因为由KKT条件中

SVR模型及Python代码 svm算法python_svm_59


(其中

SVR模型及Python代码 svm算法python_最小化_60

就是约束条件)

得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数

SVR模型及Python代码 svm算法python_python_61

是大于零的,其余点的

SVR模型及Python代码 svm算法python_python_61

都等于零。这些函数间隔最小的点就叫做支持向量参考下面图中虚线上的点

SVR模型及Python代码 svm算法python_最小化_63


正因为非支持向量的系数

SVR模型及Python代码 svm算法python_最小化_64

都等于零,而且支持向量是少数的,所以运算比较快,而且还可以用核函数来解决问题。

3、总结一下:

我们这篇主要讲了在如何解决带有不等式限制的极值最优化问题,那就是通过将原始问题转为对偶问题进行处理。但是这中间却遇到了一个问题就是原始问题和对偶问题的转化问题,这也就引出了KKT条件。在满足了KKT条件之后可以解决对偶问题了。而且KKT条件还引出了关于支持向量的概念,非支持向量的系数

SVR模型及Python代码 svm算法python_python_65

都为0。求解w、b的偏导数,再利用SMO求

SVR模型及Python代码 svm算法python_python_65

。反推得到b,就可以利用核函数解决了。(1)到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,下面我们将引入核函数,进而推广到非线性分类问题。

(2)还有KKT的推倒过程没有说明

(3)用来求

SVR模型及Python代码 svm算法python_svm_67

的SMO还没有介绍。