综述

SVM

支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。总得来说,SVM就是通过训练得到一个超平面 ,将样本分类,保证被分类的样本中离超平面近的一些点距离超平面距离(几何间隔)最大,这些离超平面近的点叫作支持向量(之所以叫支持向量而不叫支持样本是因为每个样本均认为是一个向量,每个特征是向量的一个元素)。

LibSvm

LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套实现支持向量机的库。这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。这套库可以从http://www.csie.ntu.edu.tw/~cjlin/免费获得,目前已经发展到3.21版。下载.zip格式的版本,解压后可以看到,主要有5个文件夹和一些c++源码文件。为了方便将源码与原理对应,这里用得都是早期的2.6版本。

LibSvm框架

将libsvm-2.6.zip下载下来后,解压后内容如下: 

其中: 
java文件夹:::是应用于java平台的实现SVM的源文件,/libsvm/:一些java库,Makefile:编译文件,svm_predict.java:测试文件,svm_toy.java:实现可视化工具的源文件,svm_train.java:训练的源码文件;

python文件夹:::是用来参数优选的程序文件,cross_validation.py:交叉验证,easy.py: 总的调用程序,从参数优选,到文件训练预测均调用。svm.py:调用SVM主体文件, svm_test.py:测试svm模型的文件;

svm-toy文件夹:::实现训练数据和分类界面可视化的工具的源码,其编译后的程序在windows文件夹下:svmtoy.exe;

windows文件夹:包含libSVM四个exe程序包,svmpredict.exe:svm-predict.c编译的可执行程序,实现SVM的预测。svmscale.exe:svm-scale.c编译的可执行程序,实现对数据的归一化缩放。svmtrain.exe:svm-train.c编译的可执行程序,调用SVM的数据训练接口。

当前文件夹::: 
heart_scale:::LibSvm自带的一个样本文件,可以用来测试和训练。 
Makefile:::linux环境下,目录下几个.c,.h文件的编译规则文件。 
Makefile.win:windows环境下,目录下几个.c,.h文件的编译规则文件。 
svm.cpp/svm.h:::svm算法的具体实现文件。 
svm-predict.c:::svm模型的测试文件,调用svm.c文件中的测试接口。 
svm-scale.c:::实现对样本数据的归一经缩放。缩放的规则如这个公式: 
 
其中:Y是缩放后数据,y是缩放前数据;upper、lower是指定的数据缩放的上下界;max、min为数据缩放的最大最小值。

LibSvm初步使用

自带小例子

将上图中当前目录下heart_scale文件拷到”windows”目录下,“shift”+“右击目录‘windows’”选择“在此处打开命令窗口”,在打开的命令窗口中输入以下 命令: 

svmtrain heart_scale train.model 

其中,”svmtrain“调用svmtrain.exe,heart_scale存放训练样本的文件,train.model保存最后训练出来的模型。

输出结果如下: 
 
解释: 
#iter:为迭代次数 
nu:为nu-SVC, one-class SVM, and nu-SVR三种类型SVM指定的核函数的参数,默认为0.5。!!! 
obj:为SVM文件转换为二次规划求解得到的最小值!!! 
rho:为判决函数的偏置项b 
nSV:为标准支持向量个数(0

train-model文件

svm_type c_svc    //所选择的svm类型,默认为c_svc
kernel_type rbf   //训练采用的核函数类型,此处为RBF核
gamma 0.0769231   //RBF核的参数γ
nr_class 2        //类别数,此处为两分类问题
total_sv 132      //支持向量总个数
rho 0.424462      //判决函数的偏置项b
label 1 -1        //原始文件中的类别标识
nr_sv 64 68       //每个类的支持向量机的个数
SV                //以下为各个类的权系数及相应的支持向量
1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1
0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5
………..
-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1
-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

LibSvm使用规范

训练与测试的输入数据格式

如下是heart_scale的截图: 

说明: 
Label 1:value 2:value ….

Label:如果是分类,就是类别的标识,如上图的+1/-1,可以随意定,如+15/10。 
如果是回归,这是目标值,就要实事求是了。 
Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开,如上图中,如果0.708333,1,1,-0.320755就是第一个样本的第A1,A2,A3,A4特征的话,那么0.583333,-1,0.333333,-0.603774就是第二个样本的第A1,A2,A3,A4特征。

需要注意的是,如果特征值为0,则该特征值就不写在文件中,但是序号为其保留,这样特征冒号前面的(姑且称做序号)就不连续。如下图中是heart_scale文件的某一行,特征11序号保留但值为0,不显示在文件中 

svmscale的用法

svmscale是用来对原始样本进行缩放的,范围可以自己定,一般是[0,1]或[-1,1]。

缩放的目的主要是 
1)防止某个特征过大或过小,从而在训练中起的作用不平衡; 
2)为了计算速度。因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。

用法:svmscale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename

其中,[]中都是可选项: 
-l:设定数据下限;lower:设定的数据下限值,缺省为-1 
-u:设定数据上限;upper:设定的数据上限值,缺省为 1 
-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值; 
-s: save_filename:表示将缩放的规则保存为文件save_filename; 
-r:restore_filename:表示将按照已经存在的规则文件restore_filename进行缩放; 
filename:待缩放的数据文件,文件格式要满足libsvm格式(前面小节解释的格式)。

针对上述的heart_scale文件,将其数据缩放到10~20之间,并生成test_range的规则文件,执行命令如下: 
svmscale -l 10 -u 20 -s test_range heart_scale > new_heart_scale

效果如下,缩放后结果文件 

规则文件如下图: 
 
生成这样的规则文件后,以后用-r test_range来生成缩放新的样本文件。

svmtrain的用法

svmtrain主要实现对训练数据集的训练,并可以获得SVM模型。

用法: svmtrain [options] training_set_file [model_file]

options:为操作参数,可选项,每个选项的涵义如下所示:

-s~设置svm类型:0 – C-SVC/1 – v-SVC/2 – one-class-SVM/3 –ε-SVR/4 – n - SVR
-t~设置核函数类型,默认值为2:0 --线性核:u'*v/1 --多项式核:(g*u'*v+coef0)degree/2 -- RBF核:exp(-γ*||u-v||2)/3 -- sigmoid核:tanh(γ*u'*v+coef0)
-d~degree:设置多项式核中degree的值,默认为3
-g~γ:设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;
-r~coef 0:设置核函数中的coef 0,默认值为0;
-c~cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
-n~v:设置v-SVC、one-class-SVM与n - SVR中参数n,默认值0.5;
-p~ε:设置v-SVR的损失函数中的e,默认值为0.1;
-m~cachesize:设置cache内存大小,以MB为单位,默认值为40;
-e~ε:设置终止准则中的可容忍偏差,默认值为0.001;
-h~shrinking:是否使用启发式,可选值为0或1,默认值为1;
-b~概率估计:是否计算SVC或SVR的概率估计,可选值0或1,默认0;
-wi~weight:对各类样本的惩罚系数C加权,默认值为1;
-v~n:n折交叉验证模式;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

training_set_file:输入的训练的样本文件,例如前面的heart_scale。

model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。默认情况下,只需要给函数提供一个样本文件名就可以了,但为了能保存结果,还是要提供一个结果文件名。

svmpredict用法

svmpredict是根据训练获得的模型,对数据集合进行预测。

用法:svmpredict [options] test_file model_file output_file

options:操作参数,可选项,每个选项的涵义如下所示:

-b~probability_estimates——是否需要进行概率估计预测,可选值为0或者1,默认值为0。
  • 1
  • 2

test_file:是要进行预测的样本数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;

model_file:是由svmtrain产生的模型文件;

output_file:是svmpredict的输出文件,表示预测的结果值;

感谢::: 
http://blog.csdn.net/zy_zhengyang/article/details/45009431 
http://blog.csdn.net/chl033/article/details/4645544 
http://6xudonghai.blog.163.com/blog/static/33640629200941484035544/ 
http://ntu.csie.org/~piaip/svm/svm_tutorial.html

算法流程

如下图所示,是2.6版本C-SVC型svm算法实现流程,核函数采用常用的RBF函数。 
 

函数解析

算法原理归纳

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanxueCC/article/details/54694682
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanxueCC/article/details/54646478

LibSvm使用说明和LibSvm源码解析相关推荐

  1. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  2. Redis源码解析——前言

    今天开启Redis源码的阅读之旅.对于一些没有接触过开源代码分析的同学来说,可能这是一件很麻烦的事.但是我总觉得做一件事,不管有多大多难,我们首先要在战略上蔑视它,但是要在战术上重视它.除了一些高大上 ...

  3. GeoServer源码解析栅格数据Image Mosaic JDBC插件原理(一)GDAL生产影像切片

    1. 作者声明 GeoServer源码解析栅格数据Image Mosaic JDBC插件原理共分三篇幅 (一)GDAL生产影像切片 (二)GeoTools Image Mosaic JDBC插件源码解 ...

  4. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  5. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

  6. 谷歌BERT预训练源码解析(一):训练数据生成

    目录 预训练源码结构简介 输入输出 源码解析 参数 主函数 创建训练实例 下一句预测&实例生成 随机遮蔽 输出 结果一览 预训练源码结构简介 关于BERT,简单来说,它是一个基于Transfo ...

  7. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  8. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  9. libev源码解析——定时器监视器和组织形式

    我们先看下定时器监视器的数据结构.(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based o ...

  10. libev源码解析——定时器原理

    本文将回答<libev源码解析--I/O模型>中抛出的两个问题.(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们 ...

最新文章

  1. SpringBoot+Mybatis配置Druid多数据源
  2. Visual Assist x 无法自动补全Snippet提示的解决方法
  3. UVA10870递推关系(矩阵乘法)
  4. 二十三、Python队列实现多线程(下篇)
  5. 【记录】CentOS 安装 gitlab社区版
  6. 数据类型的提升(promotion)
  7. Git (10)-- 打标签(git tag)
  8. EasyRecovery如何恢复虚拟建模软件的数据文件
  9. HTTP缓存-http强制缓存与协商缓存
  10. 基于linux 的 PCI PCIe 总线分析总结
  11. 调查 ESXi/ESX 上的虚拟机文件锁定 (10051)
  12. 外研在线:如何用云技术优化教育服务
  13. 微信小程序实验二 ——— 弹球游戏
  14. win10系统更新后底部状态栏经常无响应
  15. 《2022中国数据智能产业图谱2.0版》重磅发布
  16. matlab 画幂律 视频,画出——幂律图
  17. 【VINS-Mono】Estimator::initialStructure
  18. Elasticsearch 查询时 判断不为null或不为空字符串
  19. JavaScript 中json的遍历
  20. C语言求1000以内的素数

热门文章

  1. 线性代数知识荟萃(5)——矩阵相似
  2. 国产达梦数据库的结合Enterprise Library的应用开发
  3. DreamWeaver CS3中的SPRY的自定义验证
  4. iNeedle系统之国舜项目
  5. 关于浏览器兼容的问题
  6. DEDECMS首页调用单页文档内容并带过滤HTML的方法
  7. 【原】==与isEqual的比较
  8. 特征工程一:特征缩放、选择
  9. 视达配色教程1 色彩是什么
  10. [软件工程基础]2017.10.30 第三次 Scrum 会议