对偶的概念
https://blog.csdn.net/qq_34531825/article/details/52872819?locationNum=7&fps=1
支持向量机 概述
支持向量机(Support Vector Machines, SVM):是一种监督学习算法。
- 支持向量(Support Vector)就是离分隔超平面最近的那些点。
- 机(Machine)就是表示一种算法,而不是表示机器。
支持向量机 场景
- 要给左右两边的点进行分类
- 明显发现:选择D会比B、C分隔的效果要好很多。
支持向量机 原理
SVM 工作原理
对于上述的苹果和香蕉,我们想象为2种水果类型的炸弹。(保证距离最近的炸弹,距离它们最远)
- 寻找最大分类间距
- 转而通过拉格朗日函数求优化的问题
- 数据可以通过画一条直线就可以将它们完全分开,这组数据叫
线性可分(linearly separable)
数据,而这条分隔直线称为分隔超平面(separating hyperplane)
。 - 如果数据集上升到1024维呢?那么需要1023维来分隔数据集,也就说需要N-1维的对象来分隔,这个对象叫做
超平面(hyperlane)
,也就是分类的决策边界。
寻找最大间隔
为什么寻找最大间隔
摘录地址:http://slideplayer.com/slide/8610144 (第12条信息)
Support Vector Machines: Slide 12 Copyright © 2001, 2003, Andrew W. Moore Why Maximum Margin?
1.Intuitively this feels safest.
2.If we’ve made a small error in the location of the boundary (it’s been jolted in its perpendicular direction) this gives us least chance of causing a misclassification.
3.CV is easy since the model is immune to removal of any non-support-vector datapoints.
4.There’s some theory that this is a good thing.
5.Empirically it works very very well.
* * *
1. 直觉上是最安全的
2. 如果我们在边界的位置发生了一个小错误(它在垂直方向上被颠倒),这给我们最小的可能导致错误分类。
3. CV(cross validation 交叉验证)很容易,因为该模型对任何非支持向量数据点的去除是免疫的。
4. 有一些理论表明这是一件好东西。
5. 从经验角度上说它的效果非常非常好。
怎么寻找最大间隔
点到超平面的距离
- 分隔超平面
函数间距
: \(y(x)=w^Tx+b\) - 分类的结果: \(f(x)=sign(w^Tx+b)\) (sign表示>0为1,<0为-1,=0为0)
- 点到超平面的
几何间距
: \(d(x)=(w^Tx+b)/||w||\) (||w||表示w矩阵的二范数=> \(\sqrt{w^T*w}\), 点到超平面的距离也是类似的)
- 我们知道几乎所有的数据都不那么干净, 通过引入松弛变量来
允许数据点可以处于分隔面错误的一侧
。 - 约束条件: \(C>=a>=0\) 并且 \(\sum_{i=1}^{m} a_i·label_i=0\)
- 总的来说:
- 表示
松弛变量
- 常量C是
惩罚因子
, 表示离群点的权重(用于控制“最大化间隔”和“保证大部分点的函数间隔小于1.0” )- \(label*(w^Tx+b) > 1\) and alpha = 0 (在边界外,就是非支持向量)
- \(label*(w^Tx+b) = 1\) and 0< alpha < C (在分割超平面上,就支持向量)
- \(label*(w^Tx+b) < 1\) and alpha = C (在分割超平面内,是误差点 -> C表示它该受到的惩罚因子程度)
- 参考地址:https://www.zhihu.com/question/48351234/answer/110486455
- C值越大,表示离群点影响越大,就越容易过度拟合;反之有可能欠拟合。
- 我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。
- 例如:正类有10000个样本,而负类只给了100个(C越大表示100个负样本的影响越大,就会出现过度拟合,所以C决定了负样本对模型拟合程度的影响!,C就是一个非常关键的优化点!)
- 表示
- 这一结论十分直接,SVM中的主要工作就是要求解 alpha.
SMO 高效优化算法
- SVM有很多种实现,最流行的一种实现是:
序列最小优化(Sequential Minimal Optimization, SMO)算法
。 - 下面还会介绍一种称为
核函数(kernel)
的方式将SVM扩展到更多数据集上。 - 注意:
SVM几何含义比较直观,但其算法实现较复杂,牵扯大量数学公式的推导。
序列最小优化(Sequential Minimal Optimization, SMO)
- 创建作者:John Platt
- 创建时间:1996年
- SMO用途:用于训练 SVM
- SMO目标:求出一系列 alpha 和 b,一旦求出 alpha,就很容易计算出权重向量 w 并得到分隔超平面。
- SMO思想:是将大优化问题分解为多个小优化问题来求解的。
- SMO原理:每次循环选择两个 alpha 进行优化处理,一旦找出一对合适的 alpha,那么就增大一个同时减少一个。
- 这里指的合适必须要符合一定的条件
- 这两个 alpha 必须要在间隔边界之外
- 这两个 alpha 还没有进行过区间化处理或者不在边界上。
- 之所以要同时改变2个 alpha;原因是我们有一个约束条件: \(\sum_{i=1}^{m} a_i·label_i=0\);如果只是修改一个 alpha,很可能导致约束条件失效。
- 这里指的合适必须要符合一定的条件
SMO 伪代码大致如下:
创建一个 alpha 向量并将其初始化为0向量
当迭代次数小于最大迭代次数时(外循环)
对数据集中的每个数据向量(内循环):
如果该数据向量可以被优化
随机选择另外一个数据向量
同时优化这两个向量
如果两个向量都不能被优化,退出内循环
如果所有向量都没被优化,增加迭代数目,继续下一次循环
SVM 开发流程
收集数据:可以使用任意方法。
准备数据:需要数值型数据。
分析数据:有助于可视化分隔超平面。
训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优。
测试算法:十分简单的计算过程就可以实现。
使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器,对多类问题应用SVM需要对代码做一些修改。
SVM 算法特点
优点:泛化(由具体的、个别的扩大为一般的,就是说:模型训练完后的新样本)错误率低,计算开销不大,结果易理解。
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适合于处理二分类问题。
使用数据类型:数值型和标称型数据。
课本案例(无核函数)
项目概述
对小规模数据点进行分类
开发流程
收集数据
文本文件格式:
3.542485 1.977398 -1
3.018896 2.556416 -1 7.551510 -1.580030 1 2.114999 -0.004466 -1 8.127113 1.274372 1
准备数据