svm的研究一下,越研究越发现深入。下面谈一些我个人一些拙见。

svm计算基础是逻辑回归(logistic regression),其实一切二元分类的鼻祖我觉得都是logistic regress。

公式如下:

那么当我们谋求一个超平面(在二维里面超"线")y = w.T * x + b来实现分类,其实就是g(w.T *x + b),注意这里有点反人类,在前者y是因变量,但是在g(z)中,y变成了自变量,是一个层级关系;后者意义就是我作为一个函数,函数的意义满足某个计算规则的点,扔到里面去,可以用于做分类;从下图可以看到,下面的三条线(超平面),都符合函数w.T + b的模式,但是扔到g(z)里面的结果预期是不一样,相当于将g(1)和g(-1),g(0)(注意这里的-1和1都是极值,为了保证最大间隔的极值,其实y是连续的,可以取任意实数);那么就是可以实现基于sigmoid函数的分类。当然g的取值也是二元的-1,和+1。

那么下面就是重点讨论w.T*x + b这个超平面。在讨论这个公式之前,我们首先确定一下概念,有了上图之后,可以简单的解释一下这个问题,所谓的支持向量机,就是实现查找到实现可分间隔最大化的边缘平面的算法;那么支持向量就是分布在变换平面上面的点,之所以称之为支持向量就是因为他么支撑了边缘平面,那么支持向量后面的那些点都不需要关心了,他们的位置对于分类没有任何帮助,所以就属于非支撑(骨干)的点。到此简单讲解了一下支持向量机的概念。

那么如何来搞掂这个最大化边缘平面呢?我在刚开始接触的时候其实并不是特别理解最大化间距,但是看到上图之后,其实你会发现如果不断的旋转移动这三条线,你会发现为了实现分类,三条线的相对位置其实是在不断变化的,svm的算法的目的就是实现让分类边缘线1)平行,2)间隔最大;那么为什么要最大呢?这样分类倾向性会更加明显一些,一些个似是而非的点可能性将会非常小;极端情况,在逻辑回归的场景下,就是一条线,如果点在这条线上面了,你说怎么分?所以svm通过"宽带"这种分割模式,在很大程度上加强的分类的倾向性。

关于最大化边缘平面距离就是最大化间隔问题,那么间隔,就要提到两种间隔,分别是函数间隔和几何间隔,函数间隔:

点x到超平面的间隔,或者说距离就是w.T *x + b,但是因为分类,所以距离有正负,为了获知分类正确性,前面乘以y,y就是分类,只有-1和1两个值,之所以这样处理,如果分类正确,说明y和f(x)的符号一致,距离必然正值,反之负值,所以通过符号就可以判断来准确性。我们让边缘平面的y值取-1和1,所以在边缘超平面的点一定是=1或者=-1,那么y的取值范围是大于1,小于-1的;通过函数间隔,其实我们目标是求出这些点到超平面的距离的最小值:

这样人为的定义的距离有一个问题,就是如果等比例放大w和b,将会导致距离也变化,但是我们知道等比例改变w和b将会导致距离变化(对应的y值也等比例增加),但是此时超平面并没有变化,但是距离却不再和之前相等;所以此时引入了几何距离:

下面的是推导过程,可以得出几何距离。

处于同样的理由,我们让y*r,这个就是最终的几何距离公式:

这样我们求解最大间隔问题,其实就是求:

约束条件(s.t)为

这样,我们其实设r^值为1,并不影响优化效果,来简化处理公式(为什么改成1可以?):

那么如何求解呢?

这里有一个非常美妙的变化,就是上面的公式可以变型为min函数:

更加精妙的变形在于通过下式将约束和min函数包容起来了:

其实为什么可以把约束和主题函数放在一起?看下面的公式:

ai是大于0的,yi(w.T*xi+b)一定是>=1,因为为了实现L(w,b,a)的最大化,一定是||w||**2/2的后面部分一定是等于0,才能够实现最大化,所谓约束,拉格朗日对偶的公式里面已经成为了一种前置假设。这个是我之前的理解,但是这里其实牵涉到凸优化的问题,并不是简单的极值。比如下面的变形,其实使用的凸优化的知识:

然后进行max和min位置交换:

这种等价交换是有条件的(正常情况下d*<=p*),这种转换使得计算变得简单,但是,为什么变得简单了,为什么先min后max就会简化运算?不懂。

数学最优化模型是下图所示,f(x)是要求最小化的函数,hj是等式约束,gk是不等式约束。

有了有了优化模型的描述,我们再来看看min-max等价交换的KKT条件:

求对偶问题三个步骤:

1)对w和b求对偶:

带入到上面L(w,b,a)公式中,可得:

最后经过推到:

这里注意,早期全部都是i但是到了推倒的最后几步出现了i,j的分割:

这里的其实是一个两层循环,外层循环是i,里层循环是j;这个两层循环的累加完成了矩阵间的乘法运算。

第二步,根据上一步推导出来的公式进行求a值;

有了a之后,根据偏导数求出的公式可以解出w,然后通过下面的公式可以求出b,从公式上面来看应该是f(x)的最大值和最小值的均值,但是为什么是这个求b值呢?

 

第三步,即最后一步,通过SMO算法求解a;但是到这里我懵逼了,在第二步的时候,不是已经把a值给求出来了吗,怎么又求了一遍?

核函数

其实数据大多数场景都是线性不可分的,就是无法采用一条直线进行分类,需要曲线,曲线就是多项式,计算比较复杂,这个时候,如果是升维,那么很多时候可以简化问题,这个时候,核函数就出现了。

在讲核函数之前,我们先看一个前置知识:向量内积。

通过上面公式,可以很清晰的看到转置被处理成了内积,OK,核函数的本质其实就是把低维数据映射高维数据,怎么映射?

简单讲就是将原来x->φ(x),那么核函数的高明之处在于他的计算并不是在映射到高维之后,再计算,如果那样的话,求解可能会有"维度灾难"。比如:

这是一个五维空间,计算量比较大了,但是核函数不是对于分解之后在计算,而是找到了一种等价的形式:

来对其进行计算,这样的话,你会发现计算简单很多。而且核函数的形式和咱么上面提到公式中内积的形式是一致的(注意,核函数可并不是为了svm的内积而生的,而是有气自己数学应用场景的)。所以,你可以指定一些核函数来进行提升维度处理,同时还避免了高维的海量特征的计算。

常用的核函数包括:

1. 多项式;上面举例(<x1,x2> + 1)**2就是一个多项式核函数的例子;

2. 高斯核函数,这个可能是应用最广泛的一种和函数了。

3. 线性核函数,这个主要就是用于兼容,当不需要提高维度,但是为了计算的统一性,采用这个核函数可以保证计算逻辑的一致性。

 

关于松弛变量

svm中对于离群点有专门的处理,所谓离群点是指下图中的蓝色部分。所谓离群点是指貌似对方,但是其实是自己人那些点,但是因为位置比较尴尬,所以svm设置了一个松弛变量,就是允许在一定范围内的离群点,这样可以这样讲,其实允许在"宽带"之间有一些点,这些点将会基于到宽带两边的距离来进行划分。避免宽带间点无法被处理。

我们继续拿函数距离来做表达(为什么这里又采用了函数距离,而不是集合距离),此时距离赢不再是1,而是减去一个变量。

ξi不可以任意大的,于是添加了一个C作为限制

于是我们有了新的L(w,b,a):

后面处理的流程和上面很类似,首先是求导获取极值取值:

带入到拉格朗日的公式中,可以求得:

结果函数和之前是一样的,但是增加了一项约束:ai<=C(因为C-ai-ri=0,所以C必然大于等于ai)

最后是SMO算法,其实smo算法才是向量机的核心,他解决了如何求解a的关键,但是讲真,我看的资料并没有把smo算法讲明白。下一轮再研究吧。

 

参考

https://blog.csdn.net/v_JULY_v/article/details/7624837

关于svm的更多相关文章

  1. EasyPR--开发详解(6)SVM开发详解

    在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...

  2. 8.SVM用于多分类

    从前面SVM学习中可以看出来,SVM是一种典型的两类分类器.而现实中要解决的问题,往往是多类的问题.如何由两类分类器得到多类分类器,就是一个值得研究的问题. 以文本分类为例,现成的方法有很多,其中一劳 ...

  3. 5.SVM核函数

    核函数(Kernels) 定义 1.1 (核或正定核) 设是中的一个子集,称定义在上的函数是核函数,如果存在一个从到Hilbert空间的映射 使得对任意的,都成立.其中表示Hilbert空间中的内积. ...

  4. 4. SVM分类器求解(2)

    最优间隔分类器(optimal margin classifier) 重新回到SVM的优化问题: 我们将约束条件改写为: 从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数,也 ...

  5. 2. SVM线性分类器

    在一个线性分类器中,可以看到SVM形成的思路,并接触很多SVM的核心概念.用一个二维空间里仅有两类样本的分类问题来举个小例子.如图所示 和是要区分的两个类别,在二维平面中它们的样本如上图所示.中间的直 ...

  6. 1. SVM简介

    从这一部分开始,将陆续介绍SVM的相关知识,主要是整理以前学习的一些笔记内容,梳理思路,形成一套SVM的学习体系. 支持向量机(Support Vector Machine)是Cortes和Vapni ...

  7. SVM分类与回归

    SVM(支撑向量机模型)是二(多)分类问题中经常使用的方法,思想比较简单,但是具体实现与求解细节对工程人员来说比较复杂,如需了解SVM的入门知识和中级进阶可点此下载.本文从应用的角度出发,使用Libs ...

  8. 【十大经典数据挖掘算法】SVM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...

  9. 卷积神经网络提取特征并用于SVM

    模式识别课程的一次作业.其目标是对UCI的手写数字数据集进行识别,样本数量大约是1600个.图片大小为16x16.要求必须使用SVM作为二分类的分类器. 本文重点是如何使用卷积神经网络(CNN)来提取 ...

  10. 机器学习实战笔记(Python实现)-05-支持向量机(SVM)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

随机推荐

  1. 五、LCD屏填充纯色

    废话不说,直接上代码: lcd.c #include "lcd.h" static int PEN_COLOR = LCD_RED; /* 定义画笔(前景)颜色 */ static ...

  2. C#窗体的浮动及隐藏

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. mod_fcgid: HTTP request length 136136 (so far) exceeds MaxRequestLen (131072)

    原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下: 查看官方说明有这么一句:Default: FcgidMaxRe ...

  4. 【转】在python3.5安装tkinter

    链接:https://www.zhihu.com/question/42162071/answer/95441732 安装tkinter tkinter是由tcl和tk两个部分组成的,所以下载tkin ...

  5. Android全局可调试(ro.debuggable = 1)的一种另类改法

    网上流传比较多的,是重打包boot.img.读aosp的init进程源码,发现通过patch init进程也可以实现相同目的. 首先看一下init进程对ro只读属性的检查: /* property_s ...

  6. Git版本退回和修改

    首先我们来看看我们的第一个版本: 我的git文件如下: 那我们来修改一下这个文件 然后提交 那我们来查看一下提交的记录:使用git log 当我们使用 git log --pretty=oneline ...

  7. com.sun.org.apache.xerces.internal.impl.dv.util.Base64出现的问题

    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 出现的问题是这个在eclipse中无法使用,解决方法如下: (1)进入ec ...

  8. PTA——统计区间内质数

    PTA 7-33 统计素数并求和 #include<stdio.h> #include<math.h> int prime(int p); int main() { int m ...

  9. java中实现Comparable接口实现自定义排序

    class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg ...

  10. 一天掌握python爬虫

    一天掌握python爬虫日记: (小爬虫,NO 我们是大蜘蛛 ) 数据抓取: requests:requests 的底层实现其实就是 urllib开源地址:https://github.com/ken ...