非常久之前就学了SVM,总认为不就是找到中间那条线嘛,但有些地方模棱两可,真正编程的时候又是一团浆糊。參数任意试验,毫无章法。既然又又一次学到了这一章节,那就要把之前没有搞懂的地方都整明确,嗯~

下面使用到的图片来自上海交大杨旸老师的课件。网址例如以下:http://bcmi.sjtu.edu.cn/~yangyang/ml/

支持向量机就是一种分类方法。仅仅是起的这个名字,看起来非常复杂而已。

中间一条线:分类用的,须要求出系数W , b

支持向量:线性超平面上的点,能够理解为两边的线上的点

要求:中间那条线到两边的线的距离相等。

支持向量(能够想象成那两条线上每条线上的点)的个数<= m +1,m为特征 x 的维数。

目的:找的中间那条线的參数 w 和 b 。

线性SVM

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个图我看了非常久。一直没有搞懂 y 在哪里,依据公式明明就直接求出全部的 x 了啊。难道 y = a ?y = a - b ?

事实上 y 在这里不是坐标轴啦。是分类0,1,2,...,1,-1之类的,坐标轴上全都是 x1,x2,x3,....这种啦

搞清楚这个概念,接下来就非常好理解了:

两条线之间的距离就直接拿 wx1 + b = a 和  wx2 + b = -a 相减就好啦(x1是上边直线上的点。x2是下边直线上的点),至于为神马这样 2r 就刚好是垂直距离,非常easy,两个点坐标相减就是两点之间的向量,膜就是距离。找两个连线与分类直线垂直的点就OK拉。真正用公式推导是这种:

w(x1-x2)=2a

||w|| ||x1-x2|| cos<w, x1-x2> = 2a

||x1-x2|| cos<w, x1-x2> = 2a/||w||

公式左边就是距离啦。

证明的第一问也好理解了,这里的在线上指的是 x1 和 x2 都在 wx + b =0 这条线上,相减刚好就是<w, x1- x2> = 0

解释一下:

理想情况下,全部正样本(y=1)都在 wx + b = a 这条线的上边。全部负样本(y=-1)都在 wx + b = -a 这条线的下边,可是两个公式太麻烦啦。那就把 y 当作正负号乘到前边好啦。刚好把上下两条直线公式改编合成这样: (wx + b)y = a ,这种点是在线上的,可是我们要求正负样本在两側就好啦,所以改 = 为 >=

max 那句就是说只满足下边的公式还不够,我们须要的是两条线中间的距离最大

总之:就是对于随意的点 j 求使得两条线的距离最大的 w 和 b

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

总是带着 a 不太方便。所以我们把等式两边都除以 a ,就有了新的 w 和 b,无所谓啦,反正都是符号。所以就没改啦。

因为a都变成1了。所以最大化 2a / || w || 倒过来就成了 || w || / 2,也就能够简化为求 w . w = || w || 的最小值了~

非线性SVM

一切看起来进展非常顺利,然而!真实的数据非常有可能出现一些不太友好的点哦。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

于是,我们就须要容忍这些错误~

c:tradeoff parameter 事实上就是一个系数

#mistake:错误数。对于每个错误的点都为1,正确点都取0,最后加到一起(公式为了让总错误最小)

c和#mistake都是变量,能够合在一起成为一个的。但不便于理解

#mistake是算出来的,系数C是依据交叉验证得到的——(交叉验证。。不大懂,之后再说咯)

上边这个公式有个缺点:对于不在分类线外側的全都定义为错的(也就是非黑即白,0/1 loss)。没有考虑偏离大小的问题

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

公式把#mistake改成这样,就相当于对于每个错误的样本都算出其相应的偏离量。这样放在公式里就是全部偏离量加起来最小。

偏离量是算出来的,系数C是依据交叉验证得到的——(交叉验证。。不大懂,之后再说咯)

规范化损失变量

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

直接套公式吧。

hinge loss 我想多解释一下。由于这个样本在它应在的范围(如 >=1 )。那么它事实上是没有损失的,也就是全为0就好,所以也许这个损失函数蛮符合SVM的特点~

多分类问题

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

方法一:

如上图所看到的——每次把一个类别拿出来,其它类别合成一个大类。当作二分类问题来做。

反复n次就OK

缺点:分类的那条线会偏向训练数据量比較小的那一类

方法二:同一时候求

解释一下公式:

左边是分类在 j 的一个点 xj 乘以它自己的系数,须要满足 w(yj) . xj + b(yj) > = 1

參考方法一,假设这个点用在其它的分类公式中的时候,须要满足 w(y‘) . xj + b(y’) < = 1

所以两个公式放在一起就是: w(yj) . xj + b(yj) > = 1 > = w(y') . xj + b(y')

至于非要加上的那个1~~我也不知道为神马,莫非是为了和之前的公式看起来差点儿相同?0.0

加上松弛变量和损失变量就变成了这样:

约束优化(Constrained Optimized)

剧透下:下面主要介绍了一种用于解上边那个有关SVM的优化问题方法~(没学过最优化伤不起。得补啊)

首先举个有关求最小值的样例

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

上图样例说明,b 取不同的值的时候我们得到的最小值是不一样的

第一个图没有约束,第二个图约束没有起到作用,第三个图约束起作用啦

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

上图说的是拉格朗日对偶:

首先给定初始问题,求满足<= 和 = 那两个条件(这是概括讲的,全部的约束条件都能够转换为这两种形式)。而且 f(w) 取最小值的时候 w 的值

当中 Alpha 和 Beta 是拉格朗日乘数(就是起了个名)

Lemma(引理):

这时候把这些式子加起来。最大也就是 f(w) 了。由于 g h要么小于等于0,要么等于0,而且要求 Alpha(i) > 0。  所以他们总的和  L 不会比 f(w)  再大了~

o/w是otherwise的意思,此时 max L 取值为无穷的解释例如以下:

假设有一个样本不符合限制条件g-i(w) = 0,即存在一个g-i(w) > 0,那么max L(w, alpha, beta) —>无穷。

由于Alpha-i为随意參数。Alpha-i > 0, g-i(w) > 0,当Alpha-i 趋向于无穷的时候。max Alpha-i  g-i(w)也趋向于无穷,所以此时的 max L 趋向于无穷~

事实上大括号后边第一行,我们另一个条件也能够合进来。这个条件就是满足 min(w)  f(w)。也就是让 L 的最大值 f(w) 最小然后求 w 嘛,就在前边加个min,就是最后一个式子啦

这就是又写了一遍引理,第二个是它的对偶问题,弱对偶和强对偶能够看下图理解下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

就是先求最大再求最小。和先求最小再求最大能不能对上,有没有交点的问题。没有就是弱对偶,有就是强对偶

依据上图我们就能够看出来,事实上找到最优值就是找鞍点(最大or最小,看起来像马鞍的形状,所以那个点就叫鞍点)的过程。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

求鞍点。就是求各种一阶导为0,第三个式子是由于之前说了 g 代表 <= 0 那一堆公式,那么取得鞍点的时候,它必须取极值点 = 0,最后两个公式是之前就规定好的~

这五个式子就是KKT条件,假设 w , Alpha , Beta 满足KKT条件,那么它们就是那个引理和它对偶问题的一个解

讲了这么一堆。最终把解法讲好了。然后就要用到我们的SVM上了

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

经过上边一堆推导,我们最终把 w 和 b 去掉(用x y Alpha 表示)了。仅仅剩下 Alpha 是未知的了~。

于是这就转变为了二次规划问题(这样就非常好解么?木有学过最优化啊。不知道这是神马啊)

到眼下,你仅仅须要知道 w 被那个求和 替代了,SVM有个核是 x'x 就好

依据KKT条件,有一部分 Alpha 不为0,看图,支持向量就是 Alpha 不为 0 的点

依据我们已知的能够算出来的 w 。依据分类的那条线 wx + b = 0,就能够求出 b, 然后我们就能够測试新数据 z 啦

最优的 w 能够看作是一部分点的一个线性组合,这个稀疏表达能够看作是KNN分类器结构中的数据压缩(没懂,重要么?)

为了计算 Alpha ,我们仅仅须要知道核(kernel,即x'x)就好啦

測试的时候使用下边的式子(sign表示取符号,可能这个式子在模拟二分类问题,所以仅仅要符号即可了):

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

下边解释一下核(kernel)的作用

就是把 x 多加一个维度(or 没有添加维度 or 降维),使得原本非线性的问题成为线性的。

在之前的问题中。我们提到过。我们仅仅须要提供x'x就能够了,所以这里把 x'x 替换一下。就是带进公式之前先行处理一下,也就是加了那个核运算,那么我们可能会得到更好的结果哦

下边这是几个核的样例:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

关于选神马核比較好,编程的时候大胆试吧。。。

我本以为公式已经全了呢额。直到我看到了下边的修改,又对Alpha 加了个最大值C的约束,其它没变~

SMO算法

首先我们来了解一下神马是坐标上升(Coordinate Ascent)

一个无约束优化问题例如以下:

能够使用坐标上升算法来解

这个和梯度下降非常像, 梯度下降是选下降最快的方向。可是坐标上升每次仅仅改变一个维度(变量),而其它维度(变量)不变,例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

可是当我们遇到了SVM这样的有约束的问题,它的不同之处在于有一个等式(即第三个等式:求和 Alpha . y =0)。因此我们须要定义两个变量。Alpha(i)和Alpha(j)同一时候变,可是Alpha(i)能够用Alpha(j)表示出来,事实上还是能够理解为一个变量哦~~

这时候坐标上升就转换为了SMO算法啦!

下边是解SVM那个式子的SMO算法的核心思想:

后边的课件是证明SMO收敛,数学问题就就不讲了哈。主要就是满足KKT条件吧~~

编程的话,libsvm不错,好像前边的博文有讲到使用方法哦~

假设博文中有不论什么问题,欢迎随时与我联系修正~在此感谢李凡师兄。邵志文同学,朱能军同学对本文存疑的解答^.^

机器学习---支持向量机(SVM)的更多相关文章

  1. 机器学习——支持向量机SVM

    前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...

  2. 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...

  3. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  4. coursera机器学习-支持向量机SVM

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  5. 机器学习-支持向量机SVM

    简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...

  6. 机器学习——支持向量机(SVM)

    支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...

  7. 机器学习支持向量机SVM笔记

    SVM简述: SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机.SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后 ...

  8. 机器学习——支持向量机(SVM)之核函数(kernel)

    对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...

  9. 机器学习——支持向量机(SVM)之Platt SMO算法

    Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...

  10. 机器学习:Python中如何使用支持向量机(SVM)算法

    (简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...

随机推荐

  1. Discuz常见小问题-_如何修改网站LOGO

    1 界面-风格管理,点击编辑 2 默认的LOGO图片叫做logo.png,存放在X:\PHPNow\htdocs\Discuz\upload\static\image\common文件夹下面,其中X是 ...

  2. 【iOS地图开发】巧妙打造中英文全球地图

    地图开发的同学们经常遇到这样的问题,国内版地图开发,用高德或者百度就行了.但是,国外的地图怎么办?这里告诉大家,如果利用iOS地图,打造中英文的,国内国外都能用的,全球地图. 制作全英文地图的展示并不 ...

  3. javascript编程思想

    javascript编程开发修炼之道   提要文摘附注: 本文的核心内容是围绕javascript前端开发的编程技术要素,来深入地探讨编写高质量的javascript代码的方法.技巧.规范和最佳实践, ...

  4. LintCode: Single Number II

    一篇解析比较详细的文章:http://www.acmerblog.com/leetcode-single-number-ii-5394.html C++ 解法(1) 求出每个比特位的数目,然后%3,如 ...

  5. PAT 1069 1070 1071 1072

    pat 1069 The Black Hole of Numbers 水题,代码如下: #include<cstdio> #include<cstdlib> #include& ...

  6. 【转】一些linux基础命令

    学习Linux,其实很多基础命令很重要. 不论多么复杂的shell或者命令组合,都是一个一个的拼接组合命令拼接而成: 大号一个基本功,遇到需要的场景,信手拈来,随意组合拼接,是非常重要的. 恰好看到一 ...

  7. stingray 页面布局与设计

    前言 前面我们已经了解了系统中的HTML组件,现在我们就可以开始用这些组件来设计页面了,他们就像是一块块小积木,我们要盖起高楼大厦. 两种页面容器组件 我们将关联性较强的多个HTML组件放到一个容器组 ...

  8. dir for RequestHandler and request

    两个对象的dir # RequestHandler ['GET', 'GETPOST', 'POST', 'SUPPORTED_METHODS', '_ARG_DEFAULT', '_INVALID_ ...

  9. Maven的坐标与资源库

    在Maven世界中,每个工程都有它唯一的 组织名.模块名.版本 ,这三个就是maven项目的坐标,一个maven工程可以打包成jar.war.pom等形式,但是它们都是拥有上述三个坐标的.我们在项目过 ...

  10. Linux Shell 下载网站指定文件

    Shell脚本,用来从网站下载指定文件名的文件.先判断本地这个文件是否存在,如果存在则忽略,不存在则从远程服务器上下载,下载成功后本地的批次号累加1,然后使用新的批次号继续下载新文件. #!/bin/ ...