zoukankan      html  css  js  c++  java
  • 【IUML】支持向量机SVM

    从1995年Vapnik等人提出一种机器学习的新方法支持向量机(SVM)之后,支持向量机成为继人工神经网络之后又一研究热点,国内外研究都很多。支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(Generalizatin Ability)。

    SVM一种新的非常有发展前景的分类识别技术。SVM是建立在统计学习理论中结构风险最小化原理基础上,根据有限的样本信息,在模型的复杂性(即对特定训练样本的学习精度)和学习能力(即无错误地识别样本的能力)之间寻求最佳折衷,以期获得最好的推广能力。SVM克服了神经网络和传统分类器的过学习、局部极值点和维数灾难等诸多缺点,具备较强的泛化能力,已成为备受关注的研究热点。

    SVM特点和不足

    SVM特点: 1) 非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;2) 对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;3) 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:  ①增、删非支持向量样本对模型没有影响;  ②支持向量样本集具有一定的鲁棒性;  ③有些成功的应用中,SVM 方法对核的选取不敏感.

    SVM不足:1) SVM算法对大规模训练样本难以实施由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法 2) 用SVM解决多分类问题存在困难.经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

    SVM 的学习和训练算法

    SVM 算法的核心在于最优分类超平面的确定,即通过训练样本确定分类器函数的参数。确定分类超平面,实质上是求解一个二次优化的问题,通过求解对偶问题确定分类器的参数。但是现有的算法在效率和空间上都难以达到令人满意的程度。传统的利用标准二次型优化技术解决对偶问题的方法是训练算法效率低的.

    主要原因:首先,SVM方法需要计算和存储核函数矩阵,当样本点数目较大时,需要很大的内存,因为每次迭代要在内存中保存整个核函数矩阵。其次,SVM  训练算法在二次型寻优过程中要进行大量的矩阵运算,因为计算过程是一个不断迭代的过程。在大多数情况下,寻优算法是占用算法时间的主要部分。SVM方法的训练运算速度是限制它的应用的主要方面,近年来人们针对方法本身的特点提出了许多算法来解决对偶寻优问题。大多数算法的共同思想都是循环迭代,将原问题分解成为若干子问题,按照某种迭代策略,通过反复求解子问题,最终使结果收敛到原问题的最优解。根据子问题的划分和迭代策略的不同,又可以大致分为两类。

    分解算法

    分解算法基于的是这样一个事实,即去掉 Lagrange  乘子等于零的训练样本不会影响原问题的解。对于给定的训练样本集,如果其中的支持向量是已知的,寻优算法就可以排除非支持向量,只需对支持向量计算权值(Lagrange  乘子)即可,因为只有支持向量对最终的结果有影响。实际上支持向量是未知的,因此分解算法的目标就是通过某种迭代方式逐步排除非支持向量。

    具体的作法是,选择一部分样本构成工作样本集进行训练,剔除其中的非支持向量,并用训练结果对剩余样本进行检验,将不符合训练结果(违反 KKT 条件)的样本(或其中的一部分)与本次结果的支持向量合并成为一个新的工作样本集,然后重新训练。如此重复下去直到获得最优结果。当支持向量的数目远远小于训练样本数目时,分解算法能够大大提高运算速度。然而,如果支持向量的数量本身就比较多,随着算法迭代次数的增多,工作样本集会越来越大,算法仍然会十分复杂,并且效率也得不到保证。因此有研究把问题分解成为固定样本数的子问题,工作样本集的大小固定在算法速度可以容忍的限度内,迭代过程只是把剩余样本中部分离分类面最远的样本与工作样本集中的样本进行等量交换,即使支持向量的个数超过工作样本集的大小,也不改变工作样本集的规模,而只是分别对支持向量中的一部分进行优化。

    这种分解的算关键在于选择一种合适的样本换入换出策略。选用一种合适的启发式迭代策略可以大大提高算法的收敛速度。SMO 算法就是把工作样本集的规模减到最小,也即两个。之所以需要两个样本是因为等式线性约束的存在使得同时至少有两个拉格朗日乘子发生变化。由于只有两个变量,而且应用等式约束可以将其中一个用另一个表示出来,所以迭代过程每一步的子问题的最优解可以直接用解析的方法求出来,使得这一步的时间复杂度为 O(1),而不必每次都进入求解最优子问题的过程,从而避开了时间复杂度大的数值求解优化问题的过程。分解算法实质上是一种对局部问题求最优、然后再整体求最优的算法。它通过增加迭代次数来减少每次运算的运算量和运算所用资源。如果能够利用一些应用背景的先验信息,在进行迭代之前先用先验知识排除大量无关紧要的训练点,则可以大大提高算法的效率。

    序列优化的训练算法

    序列优化的训练算法基本思想是研究当出现新的单个样本时,它与原有样本集或其子集,或是原有样本集训练结果的关系,例如,新加入的样本对原有样本集的支持向量集有什么影响,如何迅速地确定它对新的分类器函数的贡献。在的基于连续过松弛变量的方法就是序列优化思想的体现,它应用于回归分析中有较好的效果。我们把入侵检测的先验知识引入 SVM 模型中,并提出一个基于 SMO 的训练算法。

    SMO(Sequential Minimal Optimization)算法是首先由 Platt 中提出来的,后来由 Keerthi 中进行了改进。它实质上是一个工作集只有两个样本的分解算法。在 SMO 中,样本的优化问题可以通过解析方法进行,所以它的实现比较容易。SMO 中有两个基本的模块,解析法求解两个样本的最优化以及在工作集中的样本选择。SMO算法是一个分解算法,而且它把每次工作的样本都减少最少的到 2 个。

    算法分为内外两个循环,内层循环针对违反KKT条件的样本选择另一个样本与它配对优化(指优化它们的Lagrange乘子),选择的依据是尽量使用这样一对样本能取得最大优化步长,对其中一个Lagrange乘子α2来说优化步长为|(E1-E2)/η|,但由于核函数估算耗时较大,算法中只用|E1-E2|来大致估计有可能取得的步长大小。也就是说,选出使得|E1-E2|最大的样本。由于步长估计比较粗略,选择出来的一对样本有时不能一步到位,更有可能不能做出进一步调整。这时算法遍历所有非边界样本(也就是Lagrange乘子不在边 0 或C上的样本),继续寻找能与α2配对优化的α1,如果这样的样本在非边界样本中找不到,再遍历所有样本。这两次遍历都是从随机位置开始的,以避免算法总是在一开始遍历就向固定的方向产生偏差。在极端退化的情形,找不到与α2配对能做出进一步调整的α1,这时放弃第一个样本。外层循环遍历非边界样本或所有样本,优先选择遍历非边界样本,因为非边界样本更有可能需要调整,而边界样本常常不能得到进一步调整而留在边界上。循环遍历非边界样本并选出它们当中违反 KKT 条件的样本进行调整,直到非边界样本全部满足 KKT 条件为止。当某一次遍历发现没有非边界样本得到调整时,就遍历所有样本,以检验是否整个集合也都满足 KKT 条件。如果在整个集合的检验中又有样本被进一步优化,就有必要再遍历非边界样本。这样,外层循环不停地在“遍历所有样本”和“遍历非边界样本”之间切换,直到整个训练集都满足 KKT 条件为止。

    SMO 算法和一般的块算法和固定工作样本集算法一样,都是把一个大的优化问题分解为很多小问题来处理。块算法在每一步中将新加入样本中违反 KKT条件的样本与原有的支持向量一起组成小问题的样本集进行优化,优化完毕后只保留其中的支持向量,再加进来新的样本进入下一步。固定工作样本集法是每一步只收集新加入样本中的最坏的样本,并将原来保留的支持向量集中较好的替换出去,以保持样本集大小不变。SMO 算法把每一步的优化问题缩减到最小,可以看作是固定工作样本集算法的一种极端的情况,即任何时候工作样本集中都只有两个样本,并且在每一步迭代的时候都用两个新的拉格朗日乘子替换原有的全部乘子。

    ======================================================
    转载请注明出处http://blog.csdn.net/utimes/article/details/9258555
    ======================================================
  • 相关阅读:
    complicated用法
    Vue安装并创建一个简单项目
    使用PyCharm创建Django项目及基本配置
    [hackerrank]John and GCD list
    在Web应用程序中执行计划任务(多线程)
    随笔,想了个同步的方案。
    文摘.
    csdn sql 搜索相关帖子。
    Url Rewriting,二级域名,重定向
    杂言
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3177740.html
Copyright © 2011-2022 走看看