前提——了解基本二分类问题、有高数和线性代数的基本知识。
0.支持向量机的思想
就一点——最大化分类间隔
在二分类中,我们的目标仅仅分开被标记的不同的两个类别,但是可以分开的线有无数条,如下图1所示,分开两类数据可能有无数条线,其中给出了三条,但这三条那一条更好呢?很显然是绿色的(因为它与正负样本保持足够的距离,距离越大意味着正确分类的概率越大)
图1
解决SVM的难点只有一个那就是解决二次规划问题,但是幸运的是可以不怎么费劲的找到一些解决二次规划的库函数之类的下面简单的介绍一下二次规划问题。
二次规划
二次规划的一般形式如下所示:
min{\(\frac{1}{2}u^TQu+p^Tu\)};
s.t. \(a^{T}_{m}u<=c_m\) (m=1,2,...,M)
如果满足上述形式那么我们可以使用二次规划的库函数求解,至于如何求解二次规划问题(想知道可以看看参考2)不做过多叙述,下来再来简单的介绍库函数的常用形式
u=QP(Q,p,A,c);
其中 Q、p对应基本形式中的Q和p,A是 \(a^{T}_{m}\)组成的矩阵,c是\(c_{m}\)组成的矩阵
1.线性可分支持向量机
所谓线性可分简言之就是使用直线(二维空间)、或者平面(三维)或者超平面(高维空间)可以将正负样本分开(以下统一称为超平面)。
假设我使用的超平面公式是 w*x+b=0,那么SVM的目标是什么?就是寻找使得距离超平面最近的点和超平面的距离最大(就说你看着这句话晕不晕),那就更简单的解释,如图2所示,绿色箭头的距离显然比黑色箭头距离更远而绿色的线显然分类正确的概率比黑色线更大,找到这种距离最大的线,就是SVM的目标。
(为了方便这里将正样本标记为1,负样本标记为-1),根据点到平面的距离公式可知某个点xi 到超平面距离的公式为:d = |w*xi+b|/||w||(等价为:yi(w*xi+b)/||w||) ,有人给d起了一个好听的名字叫做“几何间隔”,那么假设距离最近的点为(x,y) ,那么可以将SVM表述为:max{y(w*x+b)/||w|| },但是仅仅这样是不够的,因为我们还要保证正确的分类,又因为我们暂时只考虑线性可分,所以正确分类可以形式化的表述为yi*(w*xi+b)/||w||>=d 。
可以将SVM表示为下面这个约束最优化问题:
\(\max\frac{y(w*x+b)}{||w||}\)
s.t. \(\frac{y_i(w*x_i+b)}{||w||}\) >=d (i=1,2,...N)
为了进一步化简公式,设r=y(w*x+b), (r也有一个好听的名字叫做“函数间隔”),所以可以将上述公式化简为:
\(\max\frac{r}{||w||}\)
s.t. yi*(w*xi+b)>=r (i=1,2,...N)
由于2w*x+2b=0 同样是所求超平面的方程,故将2w和2b带入同样可以求得超平面,所以r的值并不影响SVM求解,那么令r=1;于是得到:
\(\max\frac{1}{||w||}\)
s.t. yi*(w*xi+b)>=1 (i=1,2,...N)
(||w|| 叫做向量w的长度)||w||=\(\sqrt{w^{T}w}\),所以最大化1/||w|| 相当于最小化||w||,为了避免根式我们求\(min\frac{1}{2}w^{T}w\)故可化简为:
\(\min\frac{1}{2}w^{T}w\)
s.t. yi*(w*xi+b)>=1 (i=1,2,...N)
上边的公式是不是很熟悉?对二次规划,接下来只需要将约束条件改写成小于等于的形式,然后调用函数就可以解决问题了,需要注意的是二次规划中的u对应w和b。
下边是matlab主要代码:
data = load('ex2data1.txt');
X = data(:,[1,2]);
Y = dat