学了好多遍,每次常学常新。这次继续学习,目标有两个:1. 找到直觉性的认识,有直观理解。2. 在R语言中用SVM做实验,学习相关的包
推荐一个很好的博客:http://blog.pluskid.org/?page_id=683
一系列文章,讲的很详细,公式和示意图也很好,作者很用心。
还有Stanford Maching Learning课程的讲义。
直觉性的认识:
SVM原本是为线性可分的情况而出现的,目标是寻找最大margin的super plane.
何谓margin?单个data的margin好说,点到平面的距离。何谓一堆data的margin?使得最坏情况最好,即,最小的margin最大化。
因此,经过筛选,非support vector就不重要了。只要关注少量的support vector即可。
如何扩展至非线性可分的情况?kernel methods。直观上看,就是把低维data映射到高维,然后再找线性可分的super plane。刚好,在SVM计算过程,所有和原始数据点xi有关的运算都是内积,原本的"先映射再内积"可简化为"直接找映射后内积的形式", 即kernel method/trick. 常用的kernel包括多项式,高斯。(理论方面学习不够,kernel II这篇文章还没仔细学习。)
kernel methods不仅局限于SVM,在其他方法中也有重要应用。
但有时候,support vector中如果存在outlier,还是对结果有很大的影响。例子:1. 原来线性可分,加了outlier仍然可分,但是margin减小了,模型的稳定性变差了。2. 原来线性可分,加了outlier线性不可分,只能用其他办法找super plane,但是和原先想要的plane差别很多了。预先排除outlier?很多时候不可行啊。
加入slack vars。松弛变量,消除或减小outlier的影响。
SVM推导过程,用到了duality方法。属于最优化方法的一种,实质上是带约束的问题。
Convex Optimization 凸优化问题。优良性质:极小值是全局唯一的,即 极小值就是最小值。
lagragian multiplier可以把带约束的优化问题转成无约束的优化问题。
然后再经过duality的方法,把primal problem转成dual problem.
方法的优点在于:无论 primal problem 是什么形式,dual problem 总是一个 convex optimization 的问题——它的极值是唯一的(如果存在的话),并且有现成的软件包可以对凸优化问题进行求解
当然,存在这weak duality和strong duality的区别。对于前者,只能找到最优解的下界。对于后者,可以找到精确的最优解。
(一个优化问题,通过求出它的 dual problem ,在只有 weak duality 成立的情况下,我们至少可以得到原始问题的一个下界。而如果 strong duality 成立,则可以直接求解 dual problem 来解决原始问题)
什么时候strong duality会成立?一种情况是,如果原始问题是 Convex 的并且满足 Slater 条件的话,那么 strong duality 成立。在SVM中,原始问题是convex的,slater条件等同于“存在super plane可以完成线性分割的目的”。
任何满足 strong duality (不一定要求是通过 Slater 条件得到,也不一定要求是凸优化问题)的问题都满足 KKT 条件,换句话说,这是 strong duality 的一个必要条件。不过,当原始问题是凸优化问题的时候(当然还要求一应函数是可微的,否则 KKT 条件的最后一个式子就没有意义了),KKT 就可以升级为充要条件。换句话说,如果 primal problem 是一个凸优化问题,且存在 x~ 和 (λ~,ν~) 满足 KKT 条件,那么它们分别是 primal problem 和 dual problem 的极值点并且 strong duality 成立。
没有解决的问题:
1. 找kernel function的方法是什么?没有golden rules,总得有个经验方法吧?现在有些研究可以帮忙找kernel function,有空可以看看。
2. SVM怎么做regression?原理是什么?
【实验报告 - R语言中SVM方法的应用】
实验包:e1701
参考资料:
- 帮助文档,
- http://blog.sina.com.cn/s/blog_609b61610101bgey.html
包e1071提供了对libsvm的接口。库libsvm包括了常用的核,如线性,多项式,RBF,sigmoid等。多分类通过一对一的投票机制(one-against-one voting scheme)而实现。predict()是训练函数,plot()可视化数据,支持向量,决策边界(如果提供的话)。参数调整tune()。write.svm()可以把R训练得到的结果写为标准的libSVM格式供其他环境下的libSVM使用
实验成功。主要参考帮助文档。
实验包: klaR
包klaR对库SVMlight进行了简单的包装,提供了函数svmlight()以分类,可视化。Svmlight()支持C-SVM进行分类,ε-SVM进行回归。以一对所有(one-against-all)进行多类分类。SVMlight支持高斯核,多项式,线性和sigmoid核。Svmlight()的参数形式为字符串形式。函数predict()返回每个case的标签。
没有调试成功,不知道其参数形式具体怎么使用。