zoukankan      html  css  js  c++  java
  • 机器学习_支持向量机

    面试官问的最多的便是SVM

     

    注意:上述图中三条线中间的视线为决策边界

     

    注意:决策方程为决策边界

    注意:上述通俗解释中的线指的是决策边界

     

     

    ,通过约束条件推出符合上述的不等式

    拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush-Kuhn-Tucker)条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件。前提是:只有当目标函数为凸函数时,使用这两种方法才保证求得的是最优解。

     

    注:为什么机器学习将极大值转换成极小值?梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值),这样得到的结果收敛速度最快。

    直接求阿尔法的值:不难发现上述公式是一个二次规划问题,可是该问题的规模正比于训练样本个数,会在实际任务中造成很大的开销,所以使用更高效的SMO算法。

    SMO的基本思路是先固定αi之外的所有参数,然后求αi上的极值。由于存在约束,若固定αi之外的其他参数,则αi可由其他变量导出。于是,SMO每次选择两个变量αi和αj,并固定其他参数。这样,在参数初始化后,SMO不断执行如下两个步骤直至收敛:

    • 选取一对需要更新的变量αi和αj
    • 固定αi和αj以外的参数,求解式获得更新后的αi和αj

    第一个变量的选择:SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点,目标函数会在迭代后增幅越大。

    第二个变量的选择:SMO算法称选择第二个变量为内层循环,应该使目标函数值增长最快。

    因此SMO采用了一个启发式:使选取的两变量所对应样本之间的间隔最大。一种直观的解释是,这样的两个样本有很大的差别,与两个相似的变量进行更新相比,对它们进行更新会带个目标函数更大的变化。

    SMO算法高效恰由于固定其他参数后,优化两个参数的过程非常高效。

    其中正例X1(3,3),X2(4,3),负例X3(1,1),Y1和Y2的值则是1,Y3的值是-1。

     注意内积求法,举例:(3,3)与(4,3)的内积为3*4+3*3=21

    可见决策边界是由阿尔法不等于0的样本点构成。注:w的维度与数据的维度是相同的

    x1和x3位于边界,x2位于非边界;

    svm的含义(面试必问)

    所有非边界上的样本阿尔法都为0,边界上的样本阿尔法都不为0。边界上的点则称为支持向量(阿尔法不等于0),非边界上的点则称为非支持向量(阿尔法等于0),支持向量会对结果产生决定性影响,非支持向量则不会对结果产生影响。“机”指得是决策边界。

    注:C为一个控制参数,就是所谓的惩罚因子。

    松弛系数 C,用于控制 "最大化间隔" 和"保证大部分点的函数间隔小于1.0" 这两个目标的权重。

    注:求极小值公式没变,约束条件中只是阿尔法i的取值范围更加严格了些,别的都没变。

    现在来展现svm的厉害之处:

      核函数的物理意义?映射到高维,使其变得线性可分。什么是高维?如一个一维数据特征x,转换为(x,x^2, x^3),就成为了一个三维特征,且线性无关。一个一维特征线性不可分的特征,在高维,就可能线性可分了。

    但是核变换这里有个问题,原始的低维假设10维,可以映射到多少维度呢?理论可以映射到无限高维度,但是要注意可行性,是否可以计算和怎么计算?

    在svm之中,虽然是要映射到9维空间中求内积,实际根本没有去将数据映射到9维空间中,只是做了个假设,假设映射到了高维空间,实际上要的是结果,还是只在低维空间中去做,只不过把低微空间内积值映射到高维空间的内积值。这一点很重要。支持向量机虽然有核变换,理论是低维映射到高维,实际上根本就没去映射,只是做了个假设,在低维空间先求内积再做映射就等于先映射到高维再求内积。

    高斯核函数做的是非常高维接近于无限维度的变换。svm中不加核变换是线性支持向量机,加核变换就是非线性的支持向量机。

    线性不可分的数据做了核变换之后,使最终结果映射到高维上就可分了,这算是SVM中比较核心和厉害的地方

    SVM常用核函数:https://blog.csdn.net/batuwuhanpei/article/details/52354822

    支持向量机学习方法包括构建由简至繁的模型:线性可分支持向量机、线性支持向量机及非线性支持向量机。当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器,即线性可分支持向量机,又称为硬间隔支持向量机;当训练数据近似线性可分时,通过软间隔最大化,也学习一个线性的分类器,即线性支持向量机,又称为软间隔支持向量机;当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。 

    面试容易问的问题:

    SVM损失函数:

    绿色表示的误差平和的损失函数与实际差的太远了,所以不合适。

    LR和SVM的联系与区别

    联系:

    1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
    2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。

    3、都有损失函数。

    区别:

    1、LR是参数模型,SVM更多的是非参数模型,本质不同。其区别就可以参考参数模型和非参模型的区别。
    2、从目标函数来看,区别在于逻辑回归采用的是log损失,SVM采用的是hinge loss(合页损失).这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
    3、SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
    4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
    5、logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。

    6、经典的SVM,直接输出类别,不给出后验概率(可以加一层softmax的得出概率);Logistic回归,会给出属于哪个类别的后验概率。

    7、LR比SVM可解释性更强。

    8、支持向量机求的不是全局最优解,而是有约束条件下的最优解,LR求的是全局最优解。

    9、SVM的1/2|w2|正则化惩罚项给出了几何解释,即:soft magin。SVM是有约束条件的正则,LR是无约束条件的正则。SVM自带了一些正则化功能,所以泛化能力高于逻辑回归,所以支持向量机鲁棒性较好。

    10、SVM在非线性问题上采用核函数上比LR更快更好。

    11、LR对异常值敏感,SVM对异常值不敏感。

    12、在训练集较小时,SVM较适用,而LR需要较多的样本。

    13、LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。

    14、对非线性问题的处理方式不同,LR主要靠特征构造,必须组合交叉特征,特征离散化。SVM也可以这样,还可以通过kernel。

    怎么根据特征数量和样本量来选择SVM和LR模型呢?

      1)如果特征的数量很大,跟样本量差不多,这时候选用LR或者是Linear Kernel的SVM

      2)如果特征的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gassian Kernel

      3)如果特征的数量比较小,而样本数量很多,需要手工添加一些特征变成第一种情况。

      注意:LR和不带核函数的SVM比较类似

    参数模型与非参数模型?

      参数模型:根据预先设计的规则,最大程度地简化学习过程,与此同时也限制可以学习到是什么。这种算法简化成一个已知的函数形式,这称为参数机器学习算法。例如方差损失最小,进行学习,参数模型例子:回归(线性回归、逻辑回归)模型;最好可以看一下或者直接进行一下相关的推导;根据规则,拥有少部分数据就可以;

      非参数模型:不需要事先假设规则,直接挖掘潜在数据中的规则;非参数模型例子:KNN,决策树,挖掘数据潜在的特征,所以比较灵活;

      参数模型缺点:受限制性高

      非参数模型缺点:训练时间长,容易产生过拟合,需要大量数据支撑

    SVM的优缺点

    优点:

    1. 可以解决高维问题:对于线性不可分的情况可以通过核函数,映射到高维特征空间实现线性可分。
    2. SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数在约束条件的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
    3. SVM在中小量样本规模的时候容易得到数据和特征之间的非线性关系,可以避免使用神经网络结构选择和局部极小值问题,可解释性强。
    4. 小集群分类效果好。
    5. 少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
      ①增、删非支持向量样本对模型没有影响;
      ②支持向量样本集具有一定的鲁棒性;
      ③有些成功的应用中,SVM 方法对核的选取不敏感
    6. SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题;

    缺点:

    1. 寻求合适的核函数相对困难。
    2. 经典的SVM,直接输出类别,不给出后验概率(可以加一层softmax的得出概率)
    3. 仅局限于小集群样本,对于观测样本太多时,效率较低。SVM算法对大规模训练样本难以实施 由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。
    4. 用SVM解决多分类问题存在困难
      
      

    svm可以做多分类吗?https://blog.csdn.net/xfchen2/article/details/79621396

      用SVM解决多分类问题存在困难经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

     

    补充:

    一、线性SVM

      一个最优化问题通常有两个最基本的因素:
        (1)目标函数,也就是你希望什么东西的什么指标达到最好;
        (2)优化对象,你期望通过改变哪些因素来使你的目标函数达到最优。
      在线性SVM算法中,目标函数显然就是那个“间隔”,而优化对象则是超平面。
      我们以线性可分的二分类问题为例。

    1. 超平面方程

      在线性可分的二分类问题中,超平面其实就是一条直线。相信直线方程大家都不陌生:y = ax b(公式1)

      现在我们做个小小的改变,让原来的 x 轴变成 x1 轴, y 变成 x2 轴,于是公式(1)中的直线方程会变成下面的样子:

      向量形式可以写成:

      进一步可表示为:

      看到变量 w,x 略显粗壮的身体了吗?他们是黑体,表示变量是个向量,w = [w1,w2]T x = [x1,x2]T。一般我们提到向量的时候,都默认是列向量,所以对 进行了转置。这里向量 w 与直线是相互垂直的(感兴趣的小伙伴可以推导一下),也就是说 w 控制了直线的方向,b就是截距,它控制了直线的位置。

     2. 间隔的计算公式

    3. 约束条件

    4. 线性SVM优化问题基本描述

    5. 最优化问题的求解

    6. 拉格朗日函数

    7. 对偶问题求解

     

    二、SMO算法

    1.什么是SMO算法?

     2. SMO算法流程

    3. 简化版SMO算法

      SMO算法的完整版实现需要大量的代码。这里我们先讨论SMO算法的简化版,主要用来正确理解这个算法的工作流程。然后会对这个简化版的SMO算法进行优化,加快它的运行速度。

     3.1 SMO算法的伪代码

    3.2 构建辅助函数

     3.3 简化版SMO算法

    3.4 支持向量的可视化

     

    n
  • 相关阅读:
    多线程
    python 进程间通信
    python 生产者消费者模型
    多线程锁
    io多路复用(三)
    div 加滚动条的方法
    10矩形覆盖
    11.二进制中1的个数
    12数值的整数次方
    9 变态跳台阶
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9098490.html
Copyright © 2011-2022 走看看