LIBSVM与LIBLINEAR(二)

模型与优化

LIBSVM和LIBLINEAR都提供了多种不一样的模型供使用者选择,不一样的模型有各自适用的场景。下面分别介绍LIBSVM和LIBLINEAR所提供的各类模型。算法

LIBSVM

下面是LIBSVM帮助内容提供的介绍,给出了LIBSVM支持的5种模型。其中模型0和1对应的都是SVM的分类模型,2对应的是one-class分类器,也就是只须要标注一个标签,模型3和4对应的是SVM的回归模型。缓存

LIBSVM包含的各类模型:框架

-s svm_type : set type of SVM (default 0)
    0 -- C-SVC        (multi-class classification)
    1 -- nu-SVC        (multi-class classification)
    2 -- one-class SVM
    3 -- epsilon-SVR    (regression)
    4 -- nu-SVR        (regression)

首先来看最基础的C-SVC模型。SVM能够写成以下的优化目标函数(这里不详细介绍推导算法了):
图片描述
当模型使用linear kernel,也就是ϕ(x)=x时,上面的问题一个标准的二次凸优化问题,能够比较方便的对每个变量进行求导。求解这样的问题是有不少快速的优化方法的,这些方法在LIBLINEAR中都有应用。可是若是是引入kernel的SVM,状况就大不同了。由于不少时候咱们既不能获得核函数的具体形式,又没法获得特征在核空间中新的表达。这个时候,以前用在线性SVM上的的求解思路就彻底不work了。为了解决这个问题,就必须采用标准的SVM求解思路,首先把原问题转化为对偶问题,获得下面的目标函数(具体过程能够参考任何介绍SVM的资料):
图片描述函数

经过对偶变化,上面的目标函数变成了一个关于变量α的二次型。很显然,上面目标函数中最重要的常亮是矩阵Q,既训练样本的Kernel Matrix,知足$$Q_{i.j}=ϕ(x_i)^Tϕ(x_j)$$
先看好的一方面,根据核函数的定义,可以保证Q是一个正定的矩阵。也就是说,上面的目标函数仍是一个凸函数,优化收敛后能保证获得的解是全局最优解, 这也是SVM的重要优点之一。可是问题也随之而来,使用经常使用的核函数,只要任意给出两个向量,老是可以计算出一个非0的距离。这也就意味着矩阵Q将会是一个很是稠密的矩阵,若是训练样本足够多,那么矩阵Q的存储和计算将成为很大的问题,这也是SVM的优化算法中的最大挑战。工具

因为矩阵Q过大,因此想一次性优化整个α是比较困难的。因此经常使用的方法都是先把Q大卸八块,每次选择一部分的Q,而后update与这部分Q相关的α的值。这其中最著名的算法就是1998由John C. Platt提出的SMO算法,而LIBSVM的优化过程也是基于SMO算法进行的。SMO算法的每一步迭代都选择最小的优化单元,也就是固定其余的α,只挑选两个α的值进行优化。之因此不选择一个,是由于有$$y^Tα=0$$
的约束,至少选择两个α的坐标才有可能进行更新。本文主要目的是介绍LIBSVM,因此就不详细讨论SMO的细节了。至于LIBSVM中的具体算法实现,在LIBSVM的官方论文中介绍的很详细,这里总结部分关键问题:学习

  • Working Set,也就是须要优化的α部分的选取优化

  • 迭代中止条件的设置spa

  • α的更新算法,也就是每一步子问题的求解方法code

  • Shrinking,即移除一些已经知足条件的α,加快收敛速度blog

  • Cache,当Q矩阵过大时,须要对矩阵进行缓存。

上面的每一个问题,处理起来都不简单。做为使用者,或许也没有必要深谙里面的全部细节。我以为最须要认识的两个问题是:

  • 1) SVM的目标函数看起来好像是一个标准的优化问题,但实际求解却要复杂得多。为了提升求解的速度,既要作算法上的优化,也须要作工程上的改进。若是只是简简单单按照教科书的方法,甚至直接调用一些优化的工具包来实现的SVM算法,最多也就算个demo。要可以真正写一个高效稳定、能处理大规模数据的SVM工具仍是很是不容易的。因此用LIBSVM仍是比本身实现算法要简单靠谱很多。

  • 2)SVM的求解之因此要优化,就是由于这个问题自己计算和存储比较麻烦。因此虽然作了这么多的优化,整个算法求解的效率仍然较低。因此咱们在使用时还要注意各类程序的细节,提升运行的效率。另外,样本量过大时,有时候为了充分利用数据,也不得不忍痛割爱,放弃kernel的使用。

除了标准的C-SVM,LIBSVM也提供了对其余一些SVM方法的支持。其中ν-SVM与C-SVM的算法与应用场景基本是相同的,惟一的区别是本来的参数C变成了参数ν。C-SVM中参数C调整范围在[0,+∞),而ν-SVM中与之对应的参数ν的调整范围变成了 (0,1]。这样的设置使得ν-SVM更具解释性,有时在参数设置上也能提供必定的方便。但ν-SVM与C-SVM并不存在本质上的差异,经过参数的调节,二者能够达到彻底相同的效果。因此在使用LIBSVM处理分类问题是,选择上面任何一种方法都是OK的,只须要遵循本身的习惯就行了。

One-Class SVM也是LIBSVM所支持的一种分类方法。顾名思义,使用One Class时,只须要提供一类样本,算法会学习一个尽可能小的超球面包裹全部的训练样本。One-Class SVM看起来颇有诱惑力,由于咱们常常会遇到有一类样本而须要学习分类器的状况。但事实上,一方面不少时候咱们获得的正样本在采样过程当中存在很大的误差,致使学习出的One Class分类器不必定考虑到了全部正样本的情形;另外一方面,大部分问题仍是存在不少构造人工负样本的办法。根据个人经验,采用普通的SVM效果一般仍是会好过One-Class SVM,而One-Class SVM在真实场景中的使用也并算不上多。所以在使用这个方法前也须要对问题进行更深刻的研究。

最后,LIBSVM也支持基于SVM的回归模型,即SVR。与分类模型相似,SVR也分为C-SVR和ν-SVR。SVR的目标函数与SVM的分类模型稍有区别。因为回归问题预测值与目标值的误差可大可小,所以SVR使用了两个slack variable用来刻画预测的偏差边界。虽然存在这样的差异,可是二者的基本思路和优化算法与仍是基本一致的。

在LIBSVM的实现中,上面五种模型,即C-SVM,ν-SVM,One-class SVM,C-SVR,ν-SVR,最终均可以转化为一个更通用的优化框架,而后用一样的策略进行求解,这也是LIBSVM所实现的主要功能。在实际使用中,最经常使用到的方法仍是C-SVM,这是最传统的SVM分类模型。

相关文章
相关标签/搜索