• SVM的简单介绍


       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的视频只是简单的说明了,更详细的还需要自己多看书,多看论文,多写代码





  • 相关阅读:
    致命错误: mysql/mysql.h:没有那个文件或目录 解决办法
    [转载]解决/usr/bin/ld: cannot find lxxx 问题
    mysql5.5.25a安装:Installation of system tables failed解决办法
    ubuntu源码编译安装mysql5.5.25a
    ubuntu 11.10 安装配置NFS
    nrpe简单插件编写
    我也学erlang(五)——简单的列表处理
    C语言中自加与自减效率的思考
    DBI connect() failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
    std::ostream_iterator用法
  • 原文地址:https://www.cnblogs.com/shouhuxianjian/p/4529216.html
Copyright © 2020-2023  润新知