机器学习技法--学习笔记04--Soft SVM

背景 html

以前所讨论的SVM都是很是严格的hard版本,必需要求每一个点都被正确的区分开。可是,实际状况时不多出现这种状况的,由于噪声数据时没法避免的。因此,须要在hard SVM上添加容错机制,使得能够容忍少许噪声数据。 git

 

"软"化问题 web

软化SVM的思路有点相似正规化,在目标函数添加错误累加项,而后加一个系数,控制对错误的容忍度,而且在约束中添加错误容忍度的约束,形式以下: app

 

如今问题就变成了(d+1+N)个变量和2N个约束。ξ用来描述错误的容忍度。C是常量,用来控制容忍度。C越大,因为min的做用,ξ错误就会变小,也就是对错误的容忍度变小,约束变苛刻,边界变窄;反之,容忍度越大,约束变宽松,边界变宽。 函数

 

遇到老熟人 学习

如今,将上面软化后的SVM问题进行对偶转化和简化,获得的结果和以前hard版本十分相似,好像遇到了老熟人。 spa

区别部分用红色高亮了,你会发现只多了N个约束。 设计

 

α的妙用 htm

α仍然可使用QP方法计算获得,b的求解也是经过complementary slackness,可是在求解b的过程,能够将向量分为三类,颇有参考意义,可用于数据分析。 blog

首先看看complementary slackness条件,

当时,向量在边界上或远离边界;

当时,,向量在边界上,称之为free支持向量;

当时,向量在边界上()或者破坏约束()。

 

具体能够参考下图,

 

SVM实战

以前4篇学习笔记,公式理论推导了一大串,感受有点飘,那么接下来就实战SVM,这样才踏实。使用的libsvm,可是在R中调用,须要'e1071'扩展(install.package('e1071'))。试验数据见这里。直接来代码:

library(e1071)

load('data/train.RData')

train$digit <- sapply(old_train_digit, function(digit) ifelse(digit == '0','0','non-0') )

train$digit <- factor(train$digit)

 

m_svm <- svm(digit~., data = train, scale = FALSE, kernel = 'radial', cost = 1, gamma = 100)

summary(m_svm)

attributes(m_svm)

上面使用了RBF kernel,取C = 1。获得的结果中,有个属性是coefs,以前对这个属性很不了解,可是查看帮助,原文"The corresponding coefficients times the training labels",发现原来就是下面的值,

因此,若是使用线性kernel(也就是不用kernel),能够根据w的公式(以下)很方便的计算出w,

若是想实践QP,推荐使用R扩展包kernlab中的ipop函数。

 

最后,要感谢台湾大学林轩田老师设计出这么好的课程和做业,加深了我对SVM的理解,但愿后面能够灵活的应用到实际工做中!

相关文章
相关标签/搜索