1. SVM的最优化问题

2.拉格朗日乘数法,对偶条件KKT条件

3.软件隔支持向量机

4.非线性支持向量机,核函数

5.SMO算法

1. SVM的最优化问题

  支持向量机(Support Vector Machine, SVM)的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。
一般SVM有下面三种:

  硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机

  在SVM中,我需要的是找到一个超平面,定义几何间隔M定义为:

其中

那么我们要做的就是找到最大间隔,又因为

                                       

所以在最大间隔中,即

所以我们的问题就变成

  为什么我们要费这么⼤的劲去重写这个问题?因为原始的最优化问题很难解,作为替代,我们现在有凸⼆次函数最优化问题,虽然它平淡⽆奇,但是⾮常容易解。

2. 凸优化问题的解法

1. 拉格朗日乘数法

我们求最优解问题:

即我们找最小值就是在同一个方向的梯度点符合条件,也就是求出

通常我们称a为拉格朗日乘子。

拉格朗⽇乘数法能总结为以下三步:

  • 1.通过每⼀个带乘⼦的约束条件来构造拉格朗⽇函数
  • 2.给出拉格朗⽇函数的梯度
  • 3.解函L(x, a)=0

所以通过我们列出的条件便可以写出拉格朗日函数

2. 对偶问题

我们在列出拉格朗日函数后,我们发现优化 就是优化我们的拉格朗日函数,约束条件就是,所以我们的目标函数可以表示为

也就是

所以我们先求w和b的最小值,求这个最小值演化为L的偏导数中求w和b:

因此我们发现

同时考虑 那么我们可以写出我们的式子

所以我们的问题演化为一个对偶问题

上式可知我们并不关心单个样本是如何的,我们只关心样本间两两的乘积,这也为后面核方法提供了很大的便利。 
求解出α之后,再求解出w和b即可得到SVM决策模型。

实际上,我在学习其他书本后发现了一个很重要的地方,就是这个$\alpha $实际上是点与点的权重,那么这里面就隐藏着一个很重要的东西,就是:离SVM vector越远的点,他的权重就越小,虽然这句话很直观,而且很朴实,但是实际上这里面蕴藏着很多的调试方法与对SVM的理解。希望大家在使用SVM的时候要记住这一点。

3. KKT条件(Karush-Kuhn-Tucker)

所谓KKT条件,就是如果一个解法满足KKT条件,那么这个解法就是一个最优解法(是不是特别神奇!)那么这个KKT条件必须满足以下四条:

  • 稳定条件 (L函数在w的梯度为0,在b处的梯度也为0)

  • 原可行条件

  • 对偶可行条件

  • 互补松弛条件

  如果αi=0则由式(15)可知该样本点对求解最佳超平面没有任何影响。当αi>0时必有,表明对应的样本点在最大间隔边界上,即对应着支持向量。也由此得出了SVM的一个重要性质:训练完成之后,大部分的训练样本都不需要保留,最终的模型仅与支持向量有关[2]。 从另一个角度,如果SVM的超平面主要与支持向量有关,同时大多数的均为0。

  同时,我们知道了,最终问题我们便是求解,只要我们将求解出来,那么我们的w与b也就求解出来了。这里有两种方法求解,QP法与SMO方法。

3. 软间隔支持向量机

  这里有一个很严重的问题,我们之前讲的问题,就必须要求数据集是可分的,而实际上,数据经常会出现又异常情况出现,通常来说,这些数据异常通常接近分类边界,如下图所示,只有一个数据异常,却破坏了线性可分。

对于这种情况,我们使用软边界,目的不是做到0错误,而是允许少量的错误

参数C让我们控制如何让SVM来处理错误。让我们举例说明如何去改变它的值来 得到不同的超平⾯

4. 非线性支持向量机

  我们知道,有很多情况下,许多数据集都是不可分的,他们的分布是非常复杂,我们可以在直接处理这些数据集之前,对数据集做一些变换,目的是为了将数据集分布改变,一个合适的变化,可以将一个数据集变得非常简单可分,同时满足需求。我们知道,在对偶问题中,

点积实际上可以用其他算法替代,本质上来说,我们是重新定义内积,因为内积只要满足 正定,双线性那三个性质即可,那么我们在求解内积的时候,便可以对数据集实现变换,让其变得可分。一般来说,我们使用的是标准内积。

  通常来说,我们使用不同的核,就是使用不同的内积,包括高斯核,RBF核,多项式核,线性核,他们无非是实现了广度,深度的增加,或者是是对原数据集做线性变换。本质上还是不同的内积,所以非线性支持向量机是非常简单的。

5. SMO算法

通常来说,我们有很多成熟的软件包来实现SVM,但是那样的解法是没有灵魂了。当然了,这个部分我也没有理解的太深刻,所以并不敢写出来,所以我只能分享一个博主写的有关SMO的算法的文章,希望大家能多看看,等我完全搞懂了以后我便会重新写出来。这一篇我认为是写的最为详细的文章了:https://blog.csdn.net/jesmine_gu/article/details/84024702

每月学习数理统计--《统计学习方法—李航》(3): SVM的更多相关文章

  1. Adaboost算法的一个简单实现——基于《统计学习方法(李航)》第八章

    最近阅读了李航的<统计学习方法(第二版)>,对AdaBoost算法进行了学习. 在第八章的8.1.3小节中,举了一个具体的算法计算实例.美中不足的是书上只给出了数值解,这里用代码将它实现一 ...

  2. 统计学习方法:支撑向量机(SVM)

    作者:桂. 时间:2017-05-13  21:52:14 链接:http://www.cnblogs.com/xingshansi/p/6850684.html 前言 主要记录SVM的相关知识,参考 ...

  3. 统计学习方法—SVM推导

    目录 SVM 1. 定义 1.1 函数间隔和几何间隔 1.2 间隔最大化 2. 线性可分SVM 2.1 对偶问题 2.2 序列最小最优算法(SMO) 3. 线性不可分SVM 3.1 松弛变量 3.2 ...

  4. 统计学习方法学习(四)--KNN及kd树的java实现

    K近邻法 1基本概念 K近邻法,是一种基本分类和回归规则.根据已有的训练数据集(含有标签),对于新的实例,根据其最近的k个近邻的类别,通过多数表决的方式进行预测. 2模型相关 2.1 距离的度量方式 ...

  5. 李航《统计学习方法》CH01

    CH01 统计学方法概论 前言 章节目录 统计学习 监督学习 基本概念 问题的形式化 统计学习三要素 模型 策略 算法 模型评估与模型选择 训练误差与测试误差 过拟合与模型选择 正则化与交叉验证 正则 ...

  6. 统计学习方法c++实现之六 支持向量机(SVM)及SMO算法

    前言 支持向量机(SVM)是一种很重要的机器学习分类算法,本身是一种线性分类算法,但是由于加入了核技巧,使得SVM也可以进行非线性数据的分类:SVM本来是一种二分类分类器,但是可以扩展到多分类,本篇不 ...

  7. R学习:《机器学习与数据科学基于R的统计学习方法》中文PDF+代码

    当前,机器学习和数据科学都是很重要和热门的相关学科,需要深入地研究学习才能精通. <机器学习与数据科学基于R的统计学习方法>试图指导读者掌握如何完成涉及机器学习的数据科学项目.为数据科学家 ...

  8. 统计学习方法(李航)朴素贝叶斯python实现

    朴素贝叶斯法 首先训练朴素贝叶斯模型,对应算法4.1(1),分别计算先验概率及条件概率,分别存在字典priorP和condP中(初始化函数中定义).其中,计算一个向量各元素频率的操作反复出现,定义为c ...

  9. 统计学习方法:核函数(Kernel function)

    作者:桂. 时间:2017-04-26  12:17:42 链接:http://www.cnblogs.com/xingshansi/p/6767980.html 前言 之前分析的感知机.主成分分析( ...

随机推荐

  1. Confluence 6 CSS 指南:修改顶部背景

    Confluence 默认页面的顶部是有关站点的菜单连接,在这里定义了 快速连接, 浏览菜单,用户菜单和快速查找输入框.在这个示例中,我们将会尝试修改顶部的菜单部分的背景和一些自定义的图片. 创建一个 ...

  2. JSP概述

    一.JSP页面本质上时一个Servlet,然而,用JSP开发比使用Servlet更容易,主要有两个原因,首先不必编译Servlet,其次JSP页面是一个以.jsp为扩展名的文本文件,可以使用任何编辑器 ...

  3. C#关于线程的问题

    1.通过System.threading.Thread类可以创建新的线程,并在线程堆栈中运行静态和动态的实例,可以通过Thread类的构造方法传递一个无参数,并且不返回的委托, class Progr ...

  4. MySQL----数据库练习

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  5. phpstorm2017.2.1破解

    今天安装phpstorm时看了网上很多破解方法,基本上都是用http://idea.lanyus.com/ 提供的注册码或者直接在license server上粘贴譬如http://idea.lany ...

  6. Jmeter中常用的一些对字符串的处理

    1)截取部分线程组的名称 group = ctx.getThreadGroup(); // 获取当前线程组 str = group.getName(); // 获取线程组的名称 str = str.s ...

  7. AI-解析器-request.data内部如何按照自定义解析格式-解析数据

    QUESTION:post方法中调用request.data方法时,当在Courseview类中添加parser_classes=[ForParser,],就可以将数据解析成parser_classe ...

  8. 插件使用一树形插件---zTree一zTree异步加载

    zTree 可以实现异步加载.异步加载可以让初次加载速度快,带来好的用户体验. 异步加载 官方源码中的demo提示了例子.例子是采用php语言. 在java语言中,zTree如何与Servlet结合呢 ...

  9. 目标检测中的mAP

    一.IOU的概念 交集和并集的比例(所谓的交集和并集,都是预测框和实际框的集合关系).如图: 二.Precision(准确率)和Recall(召回率)的概念 对于二分类问题,可将样例根据其真实类别和预 ...

  10. Echo()、print()、print_r()区别

    echo可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用.echo是php的内部指令,不是函数, ...