机器学习笔记(2)支持向量机
(一)线性可分的情况
支持向量机是一个非常经典的二分类算法。假设有一组数据,这组数据由两种类别组成。要画一条直线将其分开,可以有无数条。那这些直线哪条是最好的呢。
如果把上面的点想象成地雷,士兵要从他们中间开辟一条道路。这条道路当然是越宽越好了(中线离雷区越远越好)。
上面这两张图,明显右边的哪条分界线要好一点。既然要选出离雷区远的边界,那就要计算点到超平面(二维空间下是直线)的距离。
超平面的方程为,w为这个超平面的法向量,
是超平面上的一点。由此可以得出
。要求点X到该超平面的距离,可以先求出X到
的距离,然后在投影到法向量。复习一下向量投影公式
向量a·向量b=| a |*| b |*cosΘ
Θ为两向量夹角
| b |*cosΘ叫做向量b在向量a上的投影
| a |*cosΘ叫做向量a在向量b上的投影
距离公式为:
假设有数据集:(X1,Y1)(X2,Y2)… (Xn,Yn)
Y为样本的类别: 当X为正例时候 Y = +1 当X为负例时候 Y = -1
决策方程:
(其中是对数据做了变换,后面继续说)
如果决策方程大于0,将其分类为正例,反之分类为负例
因此点到超平面的距离可写为
,
(由于 所以将绝对值展开原始依旧成立,这就是几何距离,其中分子又单独称为函数距离
我们的优化目标是找到一个超平面(w,b),使得离这个超平面最近的点能够最远,这里比较难理解,但这是看懂后面内容的基础。
优化目标:
我们可以把w,b同时缩放c倍为cw,cb,这样超平面的方程也不会变的,因此我们可以将函数距离缩放为任意一个值。而且缩放后不会影响几何距离的大小。
因此我们可以通过缩放使函数距离大于等于1
此时目标函数只变为
,约束条件
。
将求最大值问题转化为求最小值问题:
由于带有约束条件,因此可以用拉格朗日乘子法求解。
然后令
容易验证,当某个约束条件不满足时,例如,那么显然有
(只要令
即可)。而当所有约束条件都满足时,则最优值为
,亦即最初要最小化的量。
因此,在要求约束条件得到满足的情况下最小化,实际上等价于直接最小化
(当然,这里也有约束条件,就是
) ,因为如果约束条件没有得到满足,
会等于无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
这里用表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而
又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。而且有
≤
,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。分别对w和b求偏导,分别得到两个条件
继续对ɑ求极大值:
约束条件:
这样,求出了,根据
,即可求出w,然后就可求出b,最终得出分离超平面和分类决策函数。
此时分类函数为,由这个式子可知,只有
不等于0的点对分类函数起作用,这些点称为支持向量。这就是这个算法叫支持向量机的原因。那为什么支持向量的
不等于0,而非支持向量上的点等于0呢?
回忆一下我们上面通过 Lagrange multiplier得到的目标函数:
注意到如果 是支持向量的话,上式中红颜色的部分是等于 0 的(因为支持向量的函数距离等于 1 ),而对于非支持向量来说,函数距离会大于 1 ,因此红颜色部分是大于零的,而又是非负的,为了满足最大化,
必须等于 0 。这也就是这些非Supporting Vector 的点的局限性。
从上图可以看出,无论有多少数据,只要支持向量不变,最终得到的超平面也不会变。
(二)软间隔
有时候数据中有一些噪音点,如果考虑它们咱们的线就不太好了
新的目标函数:
当C趋近于很小时:意味着可以有更大的错误容忍
发现目标函数还是没变,知识约束条件多了一个上界。
(三)现行不可分的情况
在有的情况下是无法找出一个超平面将数据分为两类的,但是我们可以将特征从低纬度通过一定的变换映射到高纬度,这样就能够把他们分开了。
K(x,y)就称为核函数,作用就是将低维空间向量的内积作为核函数的自变量,求出来的值和将向量映射到高维空间后的内积
相等。 这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于
的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。通常人们会从一些常用的核函数中选择。
高斯核
这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果
选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数
,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。
参考博文:https://blog.****.net/v_july_v/article/details/7624837