机器学习技法--学习笔记04--Soft SVM
背景
之前所讨论的SVM都是非常严格的hard版本,必须要求每个点都被正确的区分开。但是,实际情况时很少出现这种情况的,因为噪声数据时无法避免的。所以,需要在hard SVM上添加容错机制,使得可以容忍少量噪声数据。
"软"化问题
软化SVM的思路有点类似正规化,在目标函数添加错误累加项,然后加一个系数,控制对错误的容忍度,并且在约束中添加错误容忍度的约束,形式如下:

现在问题就变成了(d+1+N)个变量和2N个约束。ξ用来描述错误的容忍度。C是常量,用来控制容忍度。C越大,由于min的作用,ξ错误就会变小,也就是对错误的容忍度变小,约束变苛刻,边界变窄;反之,容忍度越大,约束变宽松,边界变宽。
遇到老熟人
现在,将上面软化后的SVM问题进行对偶转化和简化,得到的结果和之前hard版本十分类似,好像遇到了老熟人。

区别部分用红色高亮了,你会发现只多了N个约束。
α的妙用
α仍然可以使用QP方法计算得到,b的求解也是通过complementary slackness,但是在求解b的过程,可以将向量分为三类,很有参考意义,可用于数据分析。
首先看看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的理解,希望后面可以灵活的应用到实际工作中!
机器学习技法--学习笔记04--Soft SVM的更多相关文章
- 机器学习基石--学习笔记01--linear hard SVM
背景 支持向量机(SVM)背后的数学知识比较复杂,之前尝试过在网上搜索一些资料自学,但是效果不佳.所以,在我的数据挖掘工具箱中,一直不会使用SVM这个利器.最近,台大林轩田老师在Coursera上的机 ...
- Coursera台大机器学习技法课程笔记01-linear hard SVM
极其淡腾的一学期终于过去了,暑假打算学下台大的这门机器学习技法. 第一课是对SVM的介绍,虽然之前也学过,但听了一次感觉还是很有收获的.这位博主总结了个大概,具体细节还是 要听课:http://www ...
- 机器学习技法--学习笔记03--Kernel技巧
背景 上一讲从对偶问题的角度描述了SVM问题,但是始终需要计算原始数据feature转换后的数据.这一讲,通过一个kernel(核函数)技巧,可以省去feature转换计算,但是仍然可以利用featu ...
- 机器学习基石--学习笔记02--Hard Dual SVM
背景 上一篇文章总结了linear hard SVM,解法很直观,直接从SVM的定义出发,经过等价变换,转成QP问题求解.这一讲,从另一个角度描述hard SVM的解法,不那么直观,但是可以避免fea ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- TensorFlow机器学习框架-学习笔记-001
# TensorFlow机器学习框架-学习笔记-001 ### 测试TensorFlow环境是否安装完成-----------------------------```import tensorflo ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- Python scikit-learn机器学习工具包学习笔记
feature_selection模块 Univariate feature selection:单变量的特征选择 单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标 ...
随机推荐
- C++中new和malloc的区别
原文:http://blog.163.com/ji_wei8888/blog/static/4868044620117361747282/ 1.new 是c++中的操作符,malloc是c 中的一个函 ...
- php Memcache/Memcached操作手册
php Memcache/Memcached使用教程 Memcache和Memcached 其实是一个东西,只是php中要是用的扩展不一样, 2009年左右有人丰富memcache的用法和性能,编写了 ...
- Linux tar打包命令
Linux tar打包命令: 范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar [root@linux ~]# tar -cvf /tmp/etc.tar /etc < ...
- c# 验证码类
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; us ...
- C编程风格的人机交互 -- CSHELL (提供源码下载)
记得上大学时,做C语言的程序都是用sdb来调试的:再后来有了gdb,同sdb差不多,不过就好用了很多.但终究还是有点遗憾.比如,程序里设计了几个函数,如果想测试下它们,就不得不再编写个测试函数,用各种 ...
- Android中EditText样式修改 聚焦光标、背景
在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...
- SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题
这是上周遇到的一个案例:对已有的硬件进行升级而引发的问题,期间还触发了一个比较严重的BUG,可谓多灾多难:不过值得庆幸的是,在一连串连锁问题出现的时候,并没有出现人工操作失误(这往往是在处理故障中风险 ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- 使用SQL对数据进行整理
网上下的全国 省市区 数据比较乱(http://qq704855854.blog.163.com/blog/static/19111835520142319275411/).导入后,进行整理. SQL ...
- JAVA面试精选【Java基础第一部分】
这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对于那些正打算找工作JAVA软件开发工作的童 ...