机器学习——支持向量机(SVM)
机器学习——支持向量机(SVM)
支持向量机(Support Vector Machine)广泛地应用于分类问题,回归问题和异常检测问题。支持向量机一个很好的性质是其与凸优化问题相对应,局部最优解就是全局最优解。
本来打算大致写一下思想的。结果发现了已经有大神写的超级棒了。链接如下,看懂后来做笔记,http://blog.csdn.net/v_july_v/article/details/7624837
线性可分模型
如上图所示,两组数据中间存在一条直线,使得两组数据分别在线的两侧。这就是最简单的线性可分模型。其中,这条直线在高维空间叫做分离超平面。
分离超平面的位置只由两组数据分离侧边界上的点决定,即,位于两组数据边界点所在平面构成的二面角的平分面上。(这个形容可能不太贴切)。
这个分离超平面用以下方程表示:
已知点到超平面的距离为\(\frac{|f(x)|}{||w||}\)。
为了使分离效果更好,我们的目标是让数据边界点距离分离超平面。即
等价于
通过调整\(w:=|f(x_0)|w\),上式可以简化为
ps.相应边界线变为\(w^Tx+b=1和w^Tx+b=-1\)
进一步地,
对偶问题
这个问题是凸优化里典型的QP(二次型)问题, 因为约束条件是仿射的,所以满足Slater条件,对偶问题的解和原问题的解一致。所以可以使用求对偶问题的方法求解原问题的最优解。
设拉格朗日函数为:
设拉格朗日对偶函数为
为了求解上式,需要对\(L\)求偏导,消去\(w,b\),
那么,带入\(g(x,\lambda)\),求得
对偶问题变成:
线性不可分模型
SVM只能处理线性可分模型,对于线性不可分模型,可以在高维空间建立线性可分模型。如下图所示,
那么,怎么扩展到高维空间呢?方法很简单,就是将原来的低维变量变成高维的多项式。例如\(X_1,X_2\)构成的二维变量变成\(X_1,X_2,X_1^2,X_2^2,X_1X_2\)构成的五维空间。
但是,随着变量的增加,高维空间的维数会爆炸性的增长,超出我们的处理范围。等价的,我们可以使用核函数来代替。
具体做法是将\(\left\langle {x_i,x_j} \right\rangle\)换成对应的核函数\(K(x_i,x_j)\)。核函数的意义在于在把低维空间的特征扩展到高维空间时,是先在低维空间进行操作,然后把结果展示在高维空间,这样大大降低了计算得复杂度。
常用的核函数
- 多项式核\(K(x_1,x_2)=(\left\langle {x_i,x_j} \right\rangle+R)^d\) 上面那个问题对应的是取\(R=1,d=2\)
- 高斯核 \(K(x_1,x_2)=exp(-||x_1-x_2||^2/{2\sigma^2})\) 这个核是将原问题映射到无穷维空间,但是主要成分在\([-3\sigma,3\sigma]\)之间。
- 线性核 \(K(x_1,x_2)=\left\langle {x_i,x_j} \right\rangle\)
异常点的处理——松弛
如上图所示,异常数据的出现导致不能分开两组数据。这时我们需要做的就是减弱少数的异常值带来的影响,在原问题后面加入松弛变量\(\xi _i\)。
将约束条件变为
同时要限制\(\xi _i\)总和的大小。所以原问题变为:
经计算,对偶问题变为:
SMO(Sequential minimal optimization)算法
求解以上对偶问题的算法称为SMO算法。此不不错讨论,有兴趣的请查看JerryLead的笔记
LIBSVM算法包
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
可以去http://www.csie.ntu.edu.tw/~cjlin/下载这个算法包。
由于前人已经对SVM做了大量的优化,包括算法上和计算机方面的优化,所以不建议自己编程。个人认为只要懂得原理,知道怎么修改参数即可。