什么是Hard-Margin SVM?指的是这个向量机只适用于“数据完全可分(seperately)”的情况。

 

(一)什么是支持向量机?

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言

上述三条直线,选择哪一条比较好?直觉上来说,最右面的那条直线最好。因为它的Margin比较胖,对数据点中混杂的噪声容忍度更高,更加robust。所以以后我们在计算w的时候,加上一个限制条件:寻找Margin最胖的w。

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_02

w能将所有的点分开,等价于:对于所有的点,有ynwTxn > 0.

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_03

 

首先需要解决一个问题:如何衡量distance?

为了更好的表达这个问题,我们先明确一下符号的含义:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_04

把w拆成两部分。

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_05

支持向量机 重要性排序 R语言 支持向量机margin_核函数_06

 

现在我们已经知道了distance如何衡量,我们的问题转化成

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_07

这个问题是什么呢?以二维直线为例:对于一堆可以把所有数据点正确分类的直线,选择margin(b,w)最大的直线。

现在来想:这些直线都是可以scaling的,假设我scaling所有的w,使得:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_08

再次转化问题:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_09

现证明最终形式等价于上一个形式:

对于所有n

支持向量机 重要性排序 R语言 支持向量机margin_核函数_10

条件下,寻找最小的|w|。假设找到一组(b,w)。且对于所有的n,有

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_11

(a>1)。必然存在一组(b/a, w/a),满足条件,且具有更小的|w|。存在矛盾,所以必然有a=1.那么问题就等于于:

支持向量机 重要性排序 R语言 支持向量机margin_核函数_12

。证明完毕。

支持向量机 重要性排序 R语言 支持向量机margin_核函数_13

上述形式即为支持向量机

我们可以看出,对于支持向量机,相当于在线性模型上加了一个限制条件,使得VC dimension减小。

具体的有:

支持向量机 重要性排序 R语言 支持向量机margin_核函数_14

这里的ρ代表的就是margin的大小。

支持向量机的好处是:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_15

 

 

(二)如何计算SVM(1)

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_16

对于SVM这种形式呢,我们可以用一个叫做“二次规划”的工具来求解。

“二次规划”是一个工具程序,我们只要把SVM的输入输出改写成符合“二次规划”要求的输入输出,利用现有的工具计算即可。

支持向量机 重要性排序 R语言 支持向量机margin_核函数_17

(三)如何计算SVM(2)

对于non-linear SVM,数据点的维度非常大

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_18

现在的问题是:对于nonlinear SVM,如何实现下述目标?

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_19

这需要非常多的数学知识,下面只讲概况。

1)首先使用Lagrange Multipliers

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_20

SVM问题转化为:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_21

 

2)对偶问题

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_22

支持向量机 重要性排序 R语言 支持向量机margin_核函数_23

其对偶问题只不过是将max与min位置互换。

 

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_24

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_25

补充说明:只有满足KKT condition的情况下,原问题(primal)与对偶问题(dual)的最优解相同。

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_26

(第四个条件:primal-inner optimal,可以通过Lagrange Multipliers那一张PPT解释)

 

继续求解:

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_27

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_28

再根据KKT condition,我们可以利用α的值,表达出optimal (b,w)

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_29

 

PS:

1)根据

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_30

,当αn大于0时,必然有

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_31

,也即:第n个数据点在margin上;

2)同时,在计算w和b的时候,只有大于0的αn起作用。

所以对于αn> 0的数据点(zn, yn)称之为支持向量

这个支持向量不同于之前我们定义的支持向量,因为

支持向量机 重要性排序 R语言 支持向量机margin_核函数_32

两个都为0的情况没有考虑。

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_33

 

问题真的解决了么?没有。两个问题:

1)如果N很大的话,例如N=30000,那么单单存储Q矩阵(N*N)就需要>3G RAM。所以我们需要特殊的、为SVM定制的QP程序;

2)我们并没有实现目标,只是把计算复杂度给隐藏了。

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_34

 

 

(四)真正解决SVM:核函数

举一个例子:

支持向量机 重要性排序 R语言 支持向量机margin_核函数_35

这样的话:

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_36

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_37

 

OK,现在SVM问题解决了!

 

补充一点关于核函数的知识:

1)对于Polynomial 核函数,我们最常用的形式是:如下第三种形式

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_38

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_39

2)最好先从Q=1开始(先从线性模型开始做)

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_40

3)高斯核函数

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_41

支持向量机 重要性排序 R语言 支持向量机margin_核函数_42

因为高斯核函数很难从物理角度解释,所以使用的使用必须慎重的选择参数:

支持向量机 重要性排序 R语言 支持向量机margin_核函数_43

3)三种核函数比较:

支持向量机 重要性排序 R语言 支持向量机margin_二次规划_44

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机 重要性排序 R语言_45

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_46

支持向量机 重要性排序 R语言 支持向量机margin_支持向量机_47