SVM原理的个人理解及代码

本文详细介绍了支持向量机(SVM)的基本概念,包括支持向量、线性可分与不可分数据的处理,以及SMO优化算法的应用。通过对SVM的深入探讨,阐述了如何在线性可分和不可分情况下建立分类模型,并讨论了参数C和核函数σ的选择策略。此外,还解释了拉格朗日对偶问题在SVM中的作用,以及如何通过约束条件更新α和b以优化模型。
摘要由CSDN通过智能技术生成

1 SVM定义

支持向量机(support vector machines)= 支持向量(support vector) + 算法(machine)

用支持向量来寻找超平面,分割我们的数据。

1.1 Support Vector?

支持向量就是说位于最大间隔“线”上的“点”

2 预备知识

2.1 如何定义一个平面

一个平面可以由平面内的一个点P0和一个垂直于平面的向量构成。如图,我们根据w向量以及P0点确定了一个平面
%E5%9B%BE%E7%89%87.png
在这个平面上,由于垂直关系,有如下性质:

%E5%9B%BE%E7%89%87.png
我们将w向量乘进去,把常数项定义为b,得到该平面的表达式:

%E5%9B%BE%E7%89%87.png
w作为法向量,x和w都是相同维度的列向量,x是平面上的点,而b代表的就是超平面到原点的距离
到这里我们只是表示了一个平面,接下来谈一谈如何求得两个平面的距离(点到平面距离的问题)

2.2 两个平行平面的距离

如图,两个平行平面及其向量表示如下,固定原点,可以根据w向量得到x2向量(wx2+b2=0平面)和x1向量(wx1+b1=0平面),平面距离表示为为|x2-x1|=|tw|

%E5%9B%BE%E7%89%87.png

将x2用x1、tw表示,然后将表示后的x2带入该平面的式子中去,再根据x1在其平面的性质(wx1+b1=0),我们可以消去x1,x2,得到t和b,w的关系

而我们两平面的距离|tw|记为D,就可以表示为红框中的式子。
%E5%9B%BE%E7%89%87.png

3 SVM线性可分数据(hard-margin linear SVM)

首先谈谈最简单的,用SVM去分类线性可分数据。

线性可分数据就是低维度的、直观的就可以看出来的数据,用一条直线就可以把数据划开。

我们将寻找+1、-1两类样本间隔最大的平面。

于是,对于+1样本的数据,有wx(+1)+b(+1)=0;对于-1样本的数据,有wx(-1)+b(-1)=0,(这里的括号是角标,表示类型)

为了分割这两个平面(或这两类数据),我们找到两个平面中间的一个平面,中间的这个平面就可以用来预测我们的新数据了。
%E5%9B%BE%E7%89%87.png

可以知道,我们的两个超平面,其实是由其各自的支持向量所确定的,是可调整的。如对于+1样本点,那些处于簇边界的点极其容易成为支持向量,我们选择那些合适的点作为支持向量,+1样本的超平面就确定出来了。所以,我们调整两个样本的支持向量,一定可以得到b(+1)-b(-1)=2,于是我们中间的超平面取b=b(+1)-b(-1)-1约等于1的样子。

注意:图中其实是将b(+1)、b(-1)都用b表示了:
%E5%9B%BE%E7%89%87.png

所以到此为止,我们就是根据两平面的最大间隔来找中间划分超平面,由于一定可以得到b(+1)-b(-1)=2,此时的D就可以表示为:
%E5%9B%BE%E7%89%87.png

3.1优化目标

我们的问题就变成了寻找两超平面间的最大锤子间距,在两个样本正确区分的前提下
%E5%9B%BE%E7%89%87.png

这是一个条件极值问题,专业的,我们将问题表示如下:
%E5%9B%BE%E7%89%87.png

这个约束条件其实是两类样本的约束条件合在一起写的,如下:
%E5%9B%BE%E7%89%87.png

3.2 问题求解

首先,这个问题是一个凸函数的条件极值问题,高数课本上学过,在处理条件极值问题的时候,我们可以利用拉格朗日乘子,将约束条件放到凸函数后面,这样就把条件极值问题转化为了一般的极值问题,方便我们的计算(关于拉格朗日乘子为什么可以把条件极值问题转化为了一般的极值问题,这里可以看李航的统计或者西瓜书附录,不必深究,大概是刚好是切点还是怎么的,这里会这么化就行了)

于是我们的问题就写成了:
%E5%9B%BE%E7%89%87.png
注意:这里的拉格朗日形式是有规定的条件的,写成这种规定格式的函数,要求:算子要大于0,约束条件写过去要小于0,算子和约束条件相乘为0,这三个就是后面要说的kkt条件

我们的原问题表示为:
%E5%9B%BE%E7%89%87.png
关于这个min,max的顺序,以及为什么写max,高数书上写的有

可以看到,我们要先确定拉格朗日乘子再去算关于wb的,我们如果max算子,算子那一坨求出来永远是负的,最后去min这个L,就变成了算子取正无穷,算子那一坨是负无穷,整个L就是负无穷了,这样搞毫无意义,而且求解算法复杂大也巨tm大。

于是我们采用对偶方法,即交换min和max的顺序,为什么这样做可以呢?个人觉得可以按鞍点的意思来理解,建议百度下鞍点的图,顺便贴上一条知乎大神的理解:

用拉格朗日对偶并没有改变最优解,而是改变了算法复杂度:

在原问题下,求解算法的复杂度与样本维度(等于权值w的维度)有关;

而在对偶问题下,求解算法的复杂度与样本数量(等于拉格朗日算子a的数量)有关。

于是,原问题min max,对偶问题就转换为了max min
%E5%9B%BE%E7%89%87.png

满足kkt条件下的拉格朗日式子,根据其kkt条件,我们对w、b求偏导,在极小值点有偏导为0:
%E5%9B%BE%E7%89%87.png
继续,我们利用kkt条件得出的偏导等式拿到原式中做替换,得到了最终的式子(即求关于alpha的max的式子,wb被消去):

%E5%9B%BE%E7%89%87.png

%E5%9B%BE%E7%89%87.png
可以看到这里又“产生”了新的约束条件,其实这两个条件都是我们kkt条件里面的,我们把原来的条件极值问题写成拉格朗日形式就要满足拉格朗日算子大于0(这是第一个条件),我们后面在求偏导的时候,做替换,又需要满足第二个条件,所以最终我们得到了书上的式子。

这里我们的w和b可以这样求,分类决策函数y就可以sign函数响应为:
%E5%9B%BE%E7%89%87.png
总结下:以上推导优化问题的好处在于

1、原问题是求解min wb,w的维度和x是一致的,现在改为了求解max alpha,其维度和样本数目是一致的

2、优化问题的样本计算为x的点积形式,方面引入核函数,用于高维数据分类。

4 SVM线性不可分数据(软间隔、松弛变量的应用)

之前的数据都是用一个超平面可以完美的将两种类别的数据分开,即切开后左黑右白,左右没有任何杂质,然而我们实际的数据往往都不是泾渭分明的,间隔中很多数据是线性不可分的,即便我们找到了这样一个超平面,也很难说这个超平面就是适用的,因为很大程度上这个超平面是过拟合的情况下得来的。

为了缓解这个问题,我们可以允许一些支持向量样本出错,使得判定更为松弛,这样的好处就在于减少了我们的过拟合的情况。

我们引入松弛间隔 ξ(越小越好)使得判定更为松弛,作为惩罚,我们引入惩罚因子C,原来的min 1/2 (w^2)后面多多了一个惩罚模块,这个模块就是用C对松弛“代价” ξ的和的惩罚。我们最终就是要使得式子最小min,并且错误分类的个数(cost&penalty)也尽量小,C自然而然就成为了协调者,也自然而然成为了我们实际问题中需要考虑、尝试的参数。
%E5%9B%BE%E7%89%87.png

4.1 拉格朗日对偶问题形式

%E5%9B%BE%E7%89%87.png
其中alpha和u都是拉格朗日算子,都需要大于等于0.。
接着我们求解对偶形式下的maxmin问题,同样的,首先求偏导wbξ,然后带入原式

%E5%9B%BE%E7%89%87.png

同样的,根据kkt条件,原问题最后就写为了:
%E5%9B%BE%E7%89%87.png
因为我们的c-alpha-u=0,alpha和u都大于0,所以这里就可以整合为0<alpha<C,这里的u可以由alpha确定,故u也用alpha代替了

同样的,我们的输出:
%E5%9B%BE%E7%89%87.png

5 SMO优化算法在SVM中的应用(序列最小最优化算法)

smo算法就是说:如果所有的样本点都满足最优化问题的kkt条件,那么最优化问题就求解得到了。其核心是从alpha=0这种特殊情况开始,他在最初假设了所有的alpha都为0,此时的alpha是不满足最优化问题的,然后不断的调整alpha,使得alpha满足最优化问题。

5.1 最优化问题回顾

可以看到,当我们的alpha全为0时,我们的约束条件是满足的,但是我们的优化目标不是min。
%E5%9B%BE%E7%89%87.png

5.2 两个变量的二次规划求解方法

首先看看alpha和点位置的关系,根据kkt条件,可以看到alpha=0时,我们的样本“必须”被正确分类;而alpha在0和C之间时,这个点正好是支持向量;alpha为C时,我们的样本“必须”被错误分类,这里说“必须”,是说alpha所处的范围如果不满足上述样本推论,则说明这个alpha违反了我们的kkt条件
%E5%9B%BE%E7%89%87.png
于是,我们就可以用这个来不断的调整alpha,通过计算判别错误来选择错误的alpha,另外一个alpha可以简单的随机选择(只要和第一个不同即可)。

5.3 alpha更新约束框

我们的两个alpha在更新时要满足约束条件来更新,以得到最优值:
%E5%9B%BE%E7%89%87.png
由于alpha*y=0,我们其实是把两个alpha拿出来,其他的记为一个常数,放在右边

假设我们的两个y都为+,则根据kkt,我们的两个alpha也为+,我们把ai和aj当作x和y坐标的话,可以画出约束框。

根据等式,我们可以计算出端点的值,然后这两个alpha(点x,y)就只能在这条线上滑动。

图中红圈圈出的就是y都为+的特殊情况:
%E5%9B%BE%E7%89%87.png

我们对两个y的4种组合(++,–,±,-+)都画出其约束线段,就可以得到我们的约束框。

y不同时:
%E5%9B%BE%E7%89%87.png
y相同时:

%E5%9B%BE%E7%89%87.png
我们的最优值就有了满足条件,L<alpha2<H

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值