前面介绍了LIBSVM和LIBLINEAR的优化算法,下面简单总结一下不同算法的应用场景吧:

  • 所有线性问题都是用LIBLINEAR,而不要使用LIBSVM。
  • LIBSVM中的不同算法,如C-SVM和nu-SVM在模型和求解上并没有本质的区别,只是做了一个参数的变换,所以选择自己习惯的就好。
  • LIBLINEAR的优化算法主要分为两大类,即求解原问题(primal problem)和对偶问题(dual problem)。求解原问题使用的是TRON的优化算法,对偶问题使用的是Coordinate Descent优化算法。总的来说,两个算法的优化效率都较高,但还是有各自更加擅长的场景。对于样本量不大,但是维度特别高的场景,如文本分类,更适合对偶问题求解,因为由于样本量小,计算出来的Kernel Matrix也不大,后面的优化也比较方便。而如果求解原问题,则求导的过程中要频繁对高维的特征矩阵进行计算,如果特征比较稀疏的话,那么就会多做很多无意义的计算,影响优化的效率。相反,当样本数非常多,而特征维度不高时,如果采用求解对偶问题,则由于Kernel Matrix过大,求解并不方便。反倒是求解原问题更加容易。

多分类问题

LIBSVM和LIBLINEAR都支持多分类(Multi-class classification)问题。所谓多分类问题,就是说每一个样本的类别标签可以超过2个,但是最终预测的结果只能是一个类别。比如经典的手写数字识别问题,输入是一幅图像,最后输出的是0-9这十个数字中的某一个。

LIBSVM与LIBLINEAR但实现方式却完全不同。LIBSVM采取的one vs one的策略,也就是所有的分类两两之间都要训练一个分类器。这样一来,如果存在k个class,理论上就需要训练 k(k?1)/2个分类器。实际上,libsvm在这一步也进行了一定的优化,利用已有分类的关系,减少分类器的个数。尽管如此,LIBSVM在多分类问题上还是要多次训练分类器。但是,考虑到前面说的LIBSVM的优化方法,随着样本数量的增加,训练的复杂度会非线性的增加。而通过1VS1的策略,可以保证每一个子分类问题的样本量不至于太多,其实反倒是方便了整个模型的训练。

而LIBLINEAR则采取了另一种训练策略,即one vs all。每一个class对应一个分类器,副样本就是其他类别的所有样本。由于LIBLINEAR能够和需要处理的训练规模比LIBSVM大得多,因此这种方式要比one vs one更加高效。此外,LIBLINEAR还实现了基于Crammer and Singer方法的SVM多分类算法,在一个统一的目标函数中学习每一个class对应的分类器。

输出文件

一般来说,我们使用LIBLINEAR或者LIBSVM,可以直接调用系统的训练与预测函数,不需要直接去接触训练得到的模型文件。但有时候我们也可能需要在自己的平台实现预测的算法,这时候就不可避免的要对模型文件进行解析。

由于LIBLINEAR与LIBSVM的训练模型不同,因此他们对应的模型文件格式也不同。LIBLINEAR训练结果的格式相对简单,例如:

 1 solver_type L2R_L2LOSS_SVC_DUAL
 2 nr_class 3
 3 label 0 1 2
 4 nr_feature 5
 5 bias -1
 6 w
 7 -0.4021097293855418 0.1002472498884907 -0.1619908595357437
 8 0.008699468444669581 0.2310109611908343 -0.2295723940247394
 9 -0.6814324057724231 0.4263611607497726 -0.4190714505083906
10 -0.1505088594898125 0.2709227166451816 -0.1929294695905781
11 2.14656708009991 -0.007495770268046003 -0.1880325536062815

上面的solver_type表示求解算法,w以下表示求解得到的模型权重。其中每一列对应一个class的分类器,而每一行对应特征的一个维度。其中nr_class表示求解的个数,nr_feature表示特征的维度,bias表示模型的bias,可以人工设置权重。这里容易产生误解的是label这个字段,表示的是每一个用户训练文件中label对应w的列数。比如在上面的模型中,用户指定编号为0的分类器对应w的第一列。但是上面的对应关系并不是一定存在的,比如在二分类场景中,用将整样本标为1,负样本标为0,但在模型训练中,LIBLINEAR会按照自己的编号系统进行训练,因而有可能出现负样本在前,正样本在后的情形。这时候,就必须要根据label 1 0将LIBLIENAR内部的编号体系与真实的用户标签进行对应。当然,后来LIBLINEAR和LIBSVM做了一些优化,在二分类时,如果正负样本标签分别是-1+1,那么可以始终保证正样本出现在w的第一列。但是这个机制也不是完全靠谱,比如说在LIBLINEAR的Spark实现代码中,就没有实现这个特性,曾经把我整的很惨。因此在这里还是需要十分注意。

LIBSVM的训练结果格式就更复杂一些,例如:

 1 kernel_type rbf
 2 gamma 0.0769231
 3 nr_class 3
 4 total_sv 140
 5 rho -1.04496 0.315784 1.03037
 6 label 1 0 -1
 7 nr_sv 2 2 1
 8 SV
 9 0 1 1:0.583333 2:-1 3:0.333333 4:-0.603774 5:1 6:-1 7:1 8:0.358779 9:-1 10:-0.483871 12:-1 13:1
10 0 0.6416468628860974 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
11 0 1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1
12 0.2685466895842373 0 1:0.583333 2:1 3:1 4:-0.509434 5:-0.52968 6:-1 7:1 8:-0.114504 9:1 10:-0.16129 12:0.333333 13:1
13 0 1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1

上面参数的意义都比较直接,需要注意的是SV后面就是训练出的模型参数,以支持向量的方式进行存储。nr_sv给出了每一个支持向量所对应的模型,比如“2 2 1”就表示前两行是标签为1类的支持向量,其后面两行是标签为0类的支持向量,最后一行是标签为-1类的支持向量。而具体每一行支持向量,在上面的模型中,由于存在三类,所以每一个支持向量有可能都会存在于两个分类器中,所以前两列的数分别对应了对剩下两个分类作为支持向量时候的α值,后面才是真正的支持向量。

LIBSVM和LIBLINEAR的优化相关推荐

  1. LIBSVM与LIBLINEAR详解

    LIBSVM与LIBLINEAR(一)   在过去的十几年里,支持向量机(Support Vector Machines)应该算得上是机器学习领域影响力最大的算法了.而在SVM算法的各种实现工具中,由 ...

  2. Libsvm和Liblinear的使用经验谈

    Libsvm和Liblinear都是国立台湾大学的Chih-Jen Lin博士开发的,Libsvm主要是用来进行非线性svm 分类器的生成,提出有一段时间了,而Liblinear则是去年才创建的,主要 ...

  3. LIBSVM与LIBLINEAR

    原文链接: http://blog.chinaunix.net/uid-20761674-id-4840097.html 在过去的十几年里,支持向量机(Support Vector Machines) ...

  4. LIBSVM与LIBLINEAR(二)

    原文地址 模型与优化 LIBSVM和LIBLINEAR都提供了多种不同的模型供使用者选择,不同的模型有各自适用的场景.下面分别介绍LIBSVM和LIBLINEAR所提供的各种模型. LIBSVM 下面 ...

  5. libsvm和liblinear的使用总结

    0.安装方法 unix系统下的安装方法:到官网下载源包(目前最新版本为libsvm-3.20.liblinear-1.96),解压后,打开终端进入makefile所在的目录,键入make即可. 以下为 ...

  6. 系统学习机器学习之SVM(三)--Liblinear,LibSVM使用整理,总结

    1.Libsvm与Liblinear区别,简单源码剖析. http://blog.csdn.net/zhzhl202/article/details/7438160 http://blog.csdn. ...

  7. liblinear libsvm

    LIBSVM与LIBLINEAR 对于多分类问题以及核函数的选取,以下经验规则可以借鉴: 如果如果特征数远远大于样本数的情况下,使用线性核就可以了. 如果特征数和样本数都很大,例如文档分类,一般使用线 ...

  8. Libliner 中的-s 参数选择:primal 和dual

    Libliner 中的-s 参数选择:primal 和dual LIBLINEAR的优化算法主要分为两大类,即求解原问题(primal problem)和对偶问题(dual problem).求解原问 ...

  9. LibLinear(SVM包)使用说明之(一)README

    LibLinear(SVM包)使用说明之(一)README LibLinear(SVM包)使用说明之(一)README zouxy09@qq.com http://blog.csdn.net/zoux ...

最新文章

  1. iOS SDWebImage加载webp
  2. FD.io/VPP — VNF 应用场景
  3. 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
  4. golang字符串处理
  5. springboot使用TemplateEngine修改邮箱后发送验证码示例
  6. 电钻有刷好还是无刷好_高中物理好的来看看,永磁同步直流电机是怎样实现无刷驱动的?...
  7. 【C语言】创建一个函数,判断某一正整数是否为水仙花数,并调用这个函数找出1000以内所有水仙花数...
  8. sqlerver 字符串转整型_字符串转换成整型并求和
  9. 接计算机专业怎样备考,专接本考试计算机专业复习指南.pdf
  10. 文件服务器+快照恢复,云服务器快照恢复
  11. python中continue用法案例_记录今天学习python中for与while循环针对break和continue的用法...
  12. 致敬!这些老外的开源技术养活了一票国产软件
  13. 悟道魔兽世界,《榜样魔兽》横空出世
  14. 群体智能优化算法之猫群算法(Cat Swarm Optimization)
  15. per_cpu机制的详解
  16. dos 批处理 for知识学习
  17. python泰坦尼克号案例分析_利用python对泰坦尼克号数据集进行分析
  18. 腾讯云和阿里云,百度云,华为云服务器哪个的性能比较稳定,没有出现经常崩溃现象呢?
  19. 表单验证-----验证图片格式
  20. node child_process模块学习笔记

热门文章

  1. Linux 驱动USB键盘驱动入门demo
  2. 【已解决】Ubuntu 输入法设置 中文简体繁体 快捷键
  3. 怎样合并空闲空间到C盘(系统盘)来扩大C盘的容量?
  4. Docker(二十一)--Docker k8s--Kubernetes存储--Volumes配置管理--持久卷--动态静态分配
  5. 如何用 JS 实现 3D 赛车效果
  6. TP FN FP TN
  7. eb8000软件怎样上传_EB8000软件使用介绍.ppt
  8. #读书笔记# 《人类简史》Chapter2
  9. 数据挖掘项目笔记——使用joblib中的Parallel并行运行程序
  10. weboffice使用记录