查看原文
其他

Support Vector Machine

Y叔 biobabble 2020-02-05

在还没有coursera的时候, Andrew Ng有个openclass的网站,当时我就学了他的课程。当时写了个包叫mlass,本意是ml + class,后来发现这包叫ml + ass,我真的不是故意的。好多年了,都没再去动过,这包应该是不能装了。

支持向量机(Support Vector Machines, SVM)最初由Vladimir Vapnik于1997年提出,SVM最简单的形式就是找出一下区分界限(descision boundary),也称之为超平面(hyperplane),使得离它最近的点(称之为support vectors)与之间隔最大。

这和logistic regression有些相似,区别在于logistic regression要求所有的点尽可能地远离中间那条线,而SVM是要求最接近中间线的点尽可能地远离中间线。也就是说SVM的主要目标是区分那些最难区分的点。

SVM对于hyperplane的定义,在形式上和logistic regression一样,logistic
regression的decision boundary由

确定,SVM则用

表示,其中b相当于logistic regression中的,从形式上看,两者并无区别,当然如前面所说,两者的目标不一样,logistic regression着眼于全局,SVM着眼于support vectors。有监督算法都有label变量y,logistic regression取值是{0,1},而SVM为了计算距离方便,取值为{-1,1}

那么SVM的问题就变成为,确定参数w和b,以满足:


对于上图中最简单的例子,中间线可以由Ax+By+c=0表示,图上一个

的点到中间线的距离为

对于更高维的空间,点到hyperplane上的距离也是一样计算,定义为:

要距离最大,也就是求||w||的最小值。 那么问题就相当于在给定条件g(x):

下,求f(x): 的最大值。

这是一个限定条件下的优化问题,可以通过Lagrange multiplier解决。
这里,拉格朗日公式为:

通过对拉格朗日公式的分析,问题变为: 给定

的最大值。

对于alpha值,通常训练算法还通过C参数进行限制

,这个参数相当于logistic regression里的lambda参数,对outlier数据点的penalty。

通过Sequential Minimal Optimization(SMO)算法,可以快速地给出解。
对于无法进行线性区分的数据,需要进行transformation,把数据映射到另一个空间里,使之可以线性区分,这就是kernel function所干的事情。
参考了《machine learning in action》和ml-class的材料后,我在mlass包里实现了简化版本的SMO算法。

require(mlass) data(ex6data2) model <- svmTrain(X,y, C=1, kernelFunction="gaussianKernel") plot(model, X,y, type="nonlinear")


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存