学习SVM(五)理解线性SVM的松弛因子
学习SVM(一) SVM模型训练与分类的OpenCV实现 学习SVM(二) 如何理解支持向量机的最大分类间隔
学习SVM(三)理解SVM中的对偶问题 学习SVM(四) 理解SVM中的支持向量(Support Vector) 学习SVM(五)理解线性SVM的松弛因子
先说一个事引出这个博客的内容,我最近投的一篇论文被拒稿,用到的方法使SVM(很惭愧,还在用20年前的算法,当然这并不是重点),审稿意见里面有一段话是这样说的(说的很中肯):“该方法本身的特点来看就很难达到100%正确率”,当然这并不是说SVM无法做到100%,我理解的很难达到的原因就是在于SVM算法本身的松弛因子的引入。
为什么要引入松弛因子
从前面四个内容来看,SVM理论可以完美的找到正负样本间的最大的分类间隔,这意味着不仅仅可以实现对训练数据的分类,还保证了决策平面是最理想的。那么SVM为什么还要引入松弛因子呢?我们可以看下面这个例子:
实线的决策平面分开了所有的正负样本,但是造成的结果是最大分类间隔非常小,而虚线虽然没有完全区分开所有的正负样本,但是保证了分类间隔更大,这个例子可以说明,不一定实线完全分类的决策平面就是最好的。 同时,还有一种情况,如果左上角的圆再向右侧移动的话,那么样本的数据本身就是线性不可分的。
新的目标函数
很显然,由于松弛因子是一个正数,那么新的约束条件一定没有原来的条件“严格”,也就是松弛了。 同时,目标函数同样发生变化:
这个目标函数的变化是通过间隔松弛向量的范数定义的泛化误差界推导的出来,但是这不是SVM的重点,重点在于改变的目标函数对决策平面的影响。 除了一阶软间隔分类器,SVM的目标函数还有二阶软间隔分类器的形式:
而无论是上述哪种情况,实际上都是为目标函数引入一个损失,而上面的参数C被称之为惩罚因子。
可以拿一个很直观的例子说明惩罚因子C的影响,C越大意味着对训练数据而言能得到很好的分类结果,但是同时最大分类间隔就会变小,毕竟我们做模型不是为了在训练数据上有个多么优异的结果。相反的,如果C比较小,那么间隔就会变大,模型也就有了相对而言更好的泛化能力。
最后新的目标函数(采用一阶范式):
这里的约束条件是2n个。
软分类间隔问题的求解
在前面我们就已经知道,有了目标函数之后,后面的工作就是引入拉格朗日乘子,对偶问题转化后求导,解出拉格朗日乘子后反带回去求w和b,这个讨论对于引得目标函数来说是一样的,而且推导的过程在前面四部分中解释的已经非常清楚,对于新的问题,只是加了两个参数:
1.目标函数本身多出来的一个松弛因子。
2.拉格朗日乘子法为新的约束条件引入的参数。
需要注意的是,参数C是一个已知量,是人为设定的!
拉格朗日函数:
其中,a和u是拉格朗日乘子,对偶后就变成了:
解决min问题,求偏导:
将三式带入到L中求得:
带入到上面的对偶问题中:
再次转化问题:
此时的约束条件为:
这个约束条件中的后三个是可以转化的,因为u是一个大于等于0的数(拉格朗日性质决定的),同时由于C-a=u,即C-a>=0。同时由于a>=0,后三个条件最后就变成:
那么最后整理得到的对偶问题就是:
这个结果和学习SVM(三)理解SVM中的对偶问题最后的结果很像,只是多出了些约束。
- android多线程下载2
- android多线程下载1
- ASP获取微信小程序的OpenID服务器端代码
- 手把手教你用python抢票回家过年 !(附代码)
- 技术总结:自动扩张WPF树型表格列宽
- 部署Microsoft .NET Framework 3.0[翻译]
- 性能优化总结(六):预加载、聚合SQL应用实例
- 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
- 编辑-发布-开发分离:git作为NoSQL数据库
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Elasticsearch从入门到放弃:瞎说Mapping
- PostgreSQL 为什么接受大量连接到数据库需要连接池
- 一站式的开源持续测试平台---MeterSphere
- 《RabbitMQ》如何保证消息的可靠性
- Ruby 和 Java 的基础语法比较
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
- 聊聊面试-int和Integer的区别
- 记一次Linux修改MySQL配置不生效的问题
- VBA解析复合文档03——解析扇区链表
- C++核心准则E.17:不要试图在所有函数中捕捉所有异常
- 《图解算法》第1章 算法简介
- 自动化篇 | 这些自动化场景,批处理脚本完全可以取代 Python!
- 《RabbitMQ》如何保证消息不被重复消费
- 算法篇:树之翻转树
- 每日一题 | 约瑟夫问题