最近完成的一个项目用到了SVM,之前也一直有听说支持向量机,知道它是机器学习中一种非常厉害的算法。利用将近一个星期的时间学习了一下支持向量机,把原理推了一遍,感觉支持向量机确实挺厉害的,尤其是核函数变换可以把一个低维不可分问题转化为高维可分的问题。
需要解决的问题
支持向量机是一种监督学习的方法,主要用来进行分类和回归分析,当我们对一些数据进行分类的时候,可能会考虑以下问题:
- 怎么选择决策边界?什么样的决策边界最好?
- 目标函数如何求解?
- 对于线性不可分的问题该用何种方法来解决。
解决问题流程
- 选取决策边界(选取出最好的决策边界)
- 列目标函数
- 优化目标函数
- 求解优化目标(利用拉格朗日乘子法)
- 软间隔问题的解决(解决离群点)
- 核函数变换
决策边界的选择
Step1
当我们拿到一些简单的线性可分的数据的时候,如下图,将两类数据分类的决策边界有n条直线(图中显示了三条),那么哪一个决策边界才是最好的呢。
直觉告诉我:中间的那一条边界是最好的,而实际也的确如此:
举个简单的栗子:
两侧的数据就好比是两边是河,我们肯定希望可以走的地方越宽越好,这样掉入河里的几率就降低了。
所以我们选择的决策边界是:选出来离河岸最远的(河岸就是边界上的点,要Large Margin),第二个肯定比第一个效果好。
好了,知道要选择什么样的边界之后,接下来就是要求解边界了。
我们希望找到离决策边界最近的点,这样就找到了决策边界。
所以,假设决策边界是一个阴影平面,求点到平面的距离转换成点到点的距离,然后再垂直方向上的投影。大概的模型如下图:
x为一个点,面的方程可以用线性方程来描述:
其中w为法向量,决定了超平面的方向,b为位移量,决定了超平面与原点的距离。(学过高数几何那一部分的应该都看的懂)
接下来就是算一下x到平面的距离。假设平面上有两点x’,x’’,那么则有:
W^Tx'+b=0WTx′+b=0
W^Tx''+b=0WTx′′+b=0
即W^T(x''-x')+b=0WT(x′′−x′)+b=0
直接求垂线的距离比较难,但是我们可以通过求xx’两点的长度,再求其在垂直方向的投影来得到垂线的距离。
通过计算可以得到以下式子:
Step 2
接下来我们引入数据来将上面的式子完整化具体化
假设现在有数据集(x1,y1),(x2,y2)……(xn,yn)(x为数据,y为标签)。
在这里我们认为当X为正例时Y=1,负例是Y=-1。
这里的±1仅仅是一个标号,代表正负样本,并不是具体的数值,主要是因为这里是二分类,而且方便下面的简化。和Logistics Regression(Logistics Regression中用0和1来区分正负例)一样