ng的MI-003中12 ——SVM

一、svm目标函数的由来

视频先将LR的损失函数:

在上图中,先将y等于0 和y等于1的情况集合到一起成为一个损失函数,然后分别讨论当y等于1的时候损失函数的结果图(上图左)和y等于0的时候的损失函数的结果图(上图右),这里先采用的是单一样本情况,而且图中的cost_1(z)是说明以前的曲线图现在用两条直线逼近图来代替,这里可以看出当z等于1的时候cost_1(z)等于0 ,而大于1也等于0,这就比之前的要容易计算,而且更简单,虽然有误差,但是这是为了后面的svm的损失函数的,svm就是使得支持向量之间的距离最大,所以会考虑靠近两个极端的情况,所以这里z的1的情况下除了几个模糊点其他的还能很好的区分,(至于为什么选择z=1的时候作为转折点不知道,,但是觉得也许是需要个靠近0但是又是曲线曲率最大的地方吧,瞎猜的;自问自答:应该不是的,而是当z等于1时就假设刚好训练得到的标签和真实标签相同,当训练的超过1,那么就是分类正确,当小于1就是分类错误并且有损失函数存在)

上图中的上面那个式子就是LR的损失函数并加上了正则项,使得参数尽可能的接近0.而下面就是依据之前画的逼近线的损失函数代替,并对整个损失函数进行缩放,因为当一个损失函数形式固定,缩放多少,对于求的的值是不变的,并不在采用lamuda来限制第二项正则项,而是采用C来限制第一项,其实这里就是一个参数提取C 的形式等于1/lamuda,但是不代表真的是等于,这里的参数替换也是一个缩放,只不过没开始的直接将1/m剔除来的明显。

所以在得到SVM的损失函数之后,就是如上图中的公式一样,只是这里具有了2分类的效果,当theta‘*x大于等于0的时候,得到的就是标签为1的结果,其他情况就得到0.(这里要记得theta’*x的cost函数的结果就是之前的逼近线,采用了新的cost函数计算方法的)。

在第二集中:说明对于SVM来说,不在满足只将0作为分界点:

以往是当z=theta‘*x大于0的时候判做y=1,而这里是更加的扩大到大于等于1,如图之前画的逼近线,这是为了当cost分类到大于等于1之后就为0,让上面的总的目标函数第一项为0,相反则逐渐目标函数变大,这里的z以1为分界点,得和逼近线和上面的目标函数一起考虑,这样才不会去想为什么z在大于-1 小于1之间那段怎么不见了的问题。

这个图就是上面说的,当分类正确,那么就是C*0,而且这里的C取一个很大的值,使得当分类错误就有较重的惩罚。

二、svm的几何原理,以线性可分情况作为例子

对于上面两个图来说,第一个图就是为了解释svm的原理,就是通过查找他们不同类的支持向量,然后找到中间的那根黑线,因为对于我们来说 黑线才是最理想的分界线(线性可分的时候),对于下图来说,当一个额外的点跑到另一类去了,而且此时的C很大,那么得到的分类面就是酒红色的分类线,但是如果适当调小C那么惩罚不是那么重,所以还能忽略那个异常点。

穿插数学定义:

这里uTv的几何结果就是v在u上de投影大小乘以u的2范数。

这里就是运用了上面的数学原理,当目标函数第一项因为分类正确为0的时候,讨论后面一项,即权值(参数),这里可以看出thetaT*x就是将x投影到theta的线上然后乘以theta的2-范数。 具体如下:

然后因为样本不断地变换,而参数是固定的,所以这其中p是不断变换的,也就是上图中的右下方的等式。

上图中左边这个图中绿线为分界线,而他的法线就是参数向量,这里theta0 = 0,就说明参数向量可以从远点出发,其实这条绿线是不会被svm接受的,因为当假设选择了这样的分界线,对于下面的x点 (负类)来说,他在参数向量上的投影显得很小,依据目标函数下的约束条件,参数势必要很大,而目标函数却是要参数尽可能地小,所以产生矛盾,对于右边的来说任何一个点到参数向量上的投影最后综合是最大的,这也就可以在满足约束条件的时候使得参数向量的2-范数尽可能地小,那么就业满足目标函数,而这就是上图右边的部分,那么目标函数和约束条件就是为了找到那个所有点的综合投影能够达到最大的参数向量,找到这个然后就能找到参数向量的法线,即分类面,而这时候样本离分类面的距离也是最大的,这也就是svm的另一个名字的由来,边缘最大化分类器。

%%%%%%%%%%%%%%上面的都是对于线性可分情况,下面是如何生成非线性分类器,即采用核方法%%%%%%%%%%%%

三、采用核方法,使得svm能够应对非线性的情况

上图就是当样本是非线性的时候:这时候一般会想到多项式,足够多的项数的多项可以你和任何的函数,这里化成图中下面手写的部分,那么其中f1,f2,f3 f4这样的函数可以当作神经网络中激活函数考虑,而前面的依然是参数,那么是否有其他的选择作为f1,f2,这样的函数选择呢。

上图中就是如何定义f1,f2这样的函数的解释,(为什么有三个点,暂且不说,这三个点是人工选择的),首先定义三个点,然后这是在特征坐标中,x1,x2是特征,即当只有很少的特征的时候该如何分类,(其实在lecun的一个ppt介绍中也说了,当特征足够多的时候是可分的,当特征相比较样本很少的时候,分类是变得很困难,)这里采用的是样本与三个定义的点之间的相似程度,这里的相似函数就是高斯函数,所以也叫高斯相似,这个相似函数的名称称之为核函数,所以又叫高斯核。

当样本和标记点相互靠的足够近那么得到的核函数(暂时还是高斯核)结果就是1,当互相原理那么得到的就是0.(好像kl也是啊 考虑靠近和远离情况)

对于高斯核来说,方差sigma 平方是一个可以作为改变的参数:

不同的sigma对应不同的图像:当方差比较大时,那么样本离标记的距离所导致的f函数的值下降的就会缓慢很多,比如第三个,当方差比较小时,那么稍微距离远点f函数的值就会下降的很快

通过核函数,这里是高斯核,那么他们的判断标准就如下:

对于酒红点来说,他靠近1,而且假设参数theta如图所示,那么按照核函数得到的结果f1=1,f2=0,f3=0;得到最后结果0.5大于0,所以判为标签1,另一个点同样的方法因为小于0 ,所以是标签0类,三个landmark中的暗红色包围的就是标签为1的区域,落在这个区域的都被判为1,其余的为0.

假设有m个选取的固定点,其实固定点也是样本中的一些点,这里先假设将所有的样本点都作为固定点,那么对于一点来说,它与这些固定点的相似函数的值就可以作为这个样本的特征,如上图右下角所示就是其中样本所计算的特征值。

通过计算出f之后可以将这个f作为原来样本特征代替并放入之前得到的svm的目标函数中,目标函数中哦你跟第二项如果特征是m维,那么就不是n 或者说n=m,下面手写部分只是为了说明没有将theta0考虑进去而已。

××上面部分都是先设立参数和特征多项式,然后通过核函数得到结果并将结果放入目标函数中。在训练目标函数的时候可以来重新定义参数,(有一些小迷糊),当维度即样本很多的时候,对于任何svm的软件包来说都是比较费时的,而且svm的核技巧并不适用于LR等算法,但是核函数的原理倒是可以扩展到其他算法

然后ng不建议自己写svm的代码而是直接用已经写好的代码包,但是有些参数还是需要自己调的

就是目标函数中的参数,它过大就会造成过拟合,太小就会造成欠拟合,而方差过大就会造成目标函数下降过于缓慢,也会是欠拟合,而过小就会造成过拟合(下降太快)。

虽然有好几个核函数,但是这里只是简单的介绍下而已

四、如何使用svm代码包

现在推荐的代码包liblinear,libsvm等,

在代码包中需要自己定义C的大小和使用什么核函数,如果是线性核那么就是没有核,就是将svm回归到线性分类器的情形,下面的是举个例子的高斯核这时候需要定义他的方差

如果要使用高斯核的话必须遵循下面的注意事项:

当使用的是很常见的高斯核时,要记得在放入svm之前需要进行特征缩放,将所有的特征都缩放到相同的范围内,这里是所谓的特征缩放就是比如上面如果不使用这个操作的话那么第一个k级别的,第二个1级别的,明显第一个固定点会超大的影响,所以必须对所有的样本先进行尺度缩放。

对于其他核函数,不是所有的核函数都能满足,他们必须满足“mercer原理”,这里有几种较为常见的除了线性核和高斯核之外的核函数,多项式核函数,

多项式:他有两个参数一个是多少次方,一个是里面的常数项是多少,但是多项式核函数通常表现不好

还有其他的更内行的核:字符串核(常用于文本之间),chi-平方核,直方图交叉核

对于多类别分类来说如图下:

使用的是1-vs-all的方法,即每次都是类似单类支持向量机一样,提取一类,然后其他的作为另一类,以此类推来得到所有的类别分类(那么一个样本被分到好几个类的情况怎么避免?)

当特征和样本数量不同的时候,会采用不同的方法,上图是简单的说明了几种情况。

基本上ng的svm部分就这么over了,ng的视频只是简单的说明了,更详细的还需要自己多看书,多看论文,多写代码

SVM的简单介绍的更多相关文章

  1. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  2. 基于Python使用SVM识别简单的字符验证码的完整代码开源分享

    关键字:Python,SVM,字符验证码,机器学习,验证码识别 1   概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...

  3. Mahout学习之Mahout简单介绍、安装、配置、入门程序測试

    一.Mahout简单介绍 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的 ...

  4. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  5. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  8. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  9. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

随机推荐

  1. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  2. POM、STS、IOC、DI、AOP

    POM:全称:poject object model 说明:项目对象模型.maven用来管理项目的依赖.编译.文档等信息 STS: 全称:spring tool suite 说明:spring 基于e ...

  3. python之if循环

    if 条件: if语句块else: 语句块 money = int(input("请输入你兜里的钱:")) if money > 500: print("吃肉&qu ...

  4. 从零开始学习html(一) Html介绍

    我是初学者,这个是我学习的过程,当做笔记记录下来,如有错误希望高手指正. 原地址 一.代码初体验,制作我的第一个网页 <!DOCTYPE HTML> <html> <he ...

  5. vue.js及项目实战[笔记]— 02 vue.js基础

    一. 基础 1. 注册全局组件 应用场景:多出使用的公共性能组件,就可以注册成全局组件,减少冗余代码 全局APIVue.component('组件名','组件对象') 2.附加功能:过滤器&监 ...

  6. Java数据解析---SAX

    一.Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档. Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回 ...

  7. NoHttp封装--05 文件下载

    xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...

  8. 【详细】【转】C#中理解委托和事件

    文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具 ...

  9. python第九十六天 ---Django(1)

    django 模块 一  安装: pip3 install django 或 python -m pip install django 二  添加环境变量 相关命令: #cmd 下 django-ad ...

  10. 实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

    记录一下,方便以后复制粘贴 // 方法一: Object.prototype.clone = function() { var o = this.constructor === Array ? [] ...