libSVM中的readme中文版:http://blog.csdn.net/carson2005/article/details/6539192

LibSVM的package中的Readme文件中介绍了怎样具体的使用LibSvm,可以在Dos下以命令形式进行调用,也可以用程序包中提供的GUI程序Svm-toy进行图形化的操作。svm-toy提供了store和load操作,可以很方便的手动生成数据,然后store到磁盘中。load可用来从文件中直接调用数据,包括自己手动生成的,更重要的是可用导入数据库中的数据。

以上两个方法在具体的研究开发中不够灵活,若希望自己修改部分代码,或者把软件包中的程序集成到自己的工程中,可以采用下面的方法。

LIBSVM软件包是台湾大学林智仁(Chih-Jen Lin)博士等用C++实现的LIBSVM库,可以说是使用最方便的SVM训练工具[71]。可以解决分类问题(包括C-SVC、n-SVC)、回归问题(包括e-SVR、n-SVR)以及分布估计(one-class-SVM )等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。

但是,在Windows环境下,此软件包只提供DOS工具集(主要包括:训练工具svmtrain.exe,预测工具svmpredict.exe,缩放数据工具svmscale.exe和二维演示工具svmtoy.exe),LIBSVM2.83版本中的训练工具和预测工具的界面如下图3.2-3.3示:

图3.2 LIBSVM2.83训练工具界面

图3.3 LIBSVM2.83预测工具界面

使用这两个工具,就可以用来分类了,具体步骤如下:

(1) 把样本数据按固定格式Ⅰ保存成文本文件A;

(2) 利用训练工具,输入训练参数进行训练,并把训练出的支持向量机模型保存成文本文件B;

(3) 在预测工具中,导入训练好的支持向量机模型B,输入以固定格式Ⅱ保存的预测数据文本文件C,最终得到预测结果文件D。

具体使用细则和相关参数,可查阅林智仁博士的个人主页。

很明显,该软件包只是一个工具集,很难与既有的程序融合,但该工具包是开源的。因此,笔者通过研究该工具包中的源程序,了解了训练和预测两模块的内部运行机制,成功把LIBSVM2.83嵌入到笔者的VC++6.0程序,希望该移植方法给后人的研究带来方便。

通过上面的介绍可知LIBSVM分类的具体步骤,在源程序里面,主要由以下2个函数来实现:

(1) struct svm_model *svm_train(const struct svm_problem *prob,  const struct svm_parameter *param);

该函数用来做训练,参数prob,是svm_problem类型数据,具体结构定义如下:

struct svm_problem    //存储本次参加运算的所有样本(数据集),及其所属类别。

{

int n;                            //记录样本总数

double *y;                   //指向样本所属类别的数组

struct svm_node **x;   //指向一个存储内容为指针的数组

};

其中  svm_node  的结构体定义如下:

struct svm_node                 //用来存储输入空间中的单个特征

{

int index;               //输入空间序号,假设输入空间数为m

double value;        //该输入空间的值

};

如训练数据:

第1行:1 0.247782888 0.628596856 -0.386512633
第2行:1 1.044859413 0.262394802 0.415541039
第3行:1 0.046156436 -0.065052675 -0.075235815
第4行:1 0.098691635 0.006311825 -0.18457295
第5行:1 0.122520315 0.064763687 -0.024003425

............
第N行:1 -0.04467688 -0.057998721 -0.201066975
第N行:2 4.826528746 5.162318271 5.509461776
第N行:2 4.487279504 4.641476549 5.22672087
第N行:2 4.469918164 5.500489693 4.690020813
第N行:2 5.0203612 5.318683113 5.20988211

第一行数据:

样本所属类别 输入空间的值 输入空间的值 输入空间的值
prob.y[0] prob.x[0][0] prob.x[0][1] prob.x[0][2]
1 0.247782888 0.628596856 -0.386512633

所以,prob也可以说是问题的指针,它指向样本数据的类别和输入向量,在内存中的具体结构图如下:

图3.4 LIBSVM训练时,样本数据在内存中的存放结构

只需在内存中申请n*(m+1)*sizeof(struct svm_node)大小的空间,并在里面填入每个样本的每个输入空间的值,即可在程序中完成prob参数的设置。

参数param,是svm_parameter数据结构,具体结构定义如下:

struct svm_parameter          // 训练参数

{

int svm_type;        //SVM类型,

int kernel_type;            //核函数类型

int degree;                   /* for poly */

double gamma;            /* for poly/rbf/sigmoid */

double coef0;              /* for poly/sigmoid */

/* these are for training only */

double cache_size;      /* in MB 制定训练所需要的内存*/

double eps;                  /* stopping criteria */

double C;                    /* for C_SVC, EPSILON_SVR and NU_SVR ,惩罚因子*/

int nr_weight;             /* for C_SVC 权重的数目*/

int *weight_label;       /* for C_SVC 权重,元素个数由nr_weight 决定*/

double* weight;           /* for C_SVC */

double nu;                   /* for NU_SVC, ONE_CLASS, and NU_SVR */

double p;                     /* for EPSILON_SVR */

int shrinking;        /* use the shrinking heuristics 指明训练过程是否使用压缩*/

int probability;         /* do probability estimates 指明是否要做概率估计*/

}

其中,SVM类型和核函数类型如下:

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };    /* svm_type */

enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };               /* kernel_type */

只需申请一个svm_parameter结构体,并按实际需要设定SVM类型、核函数和各种参数的值即可完成参数param的设置。

设定完这两个参数,就可以直接在程序中调用训练函数进行训练了,该其函数返回一个struct svm_model *SVM模型的指针,可以使用svm_save_model(const char *model_file_name, const struct svm_model *model)函数,把这个模型保存在磁盘中。至此,训练函数的移植已经完成。

(2) double svm_predict(const struct svm_model *model, const struct svm_node *x);

参数model,是一个SVM模型的指针,可以使用函数struct svm_model *svm_load_model(const char *model_file_name),导入训练时保存好的SVM模型,此函数返回一个SVM模型的指针,可以直接赋值给变量model。

参数x,是const struct svm_node结构体的指针,本意是一个输入空间的指针,但实际上,该函数执行的时候,是从参数x处计算输入空间,直到遇到单个样本数据结束标记-1才结束,也就是说,该函数运算了单个样本中的所有输入空间数据。因此,在调用此函数时,必须先把预测样本的数据按图3.4中的固定格式写入内存中。另外,该函数只能预测一个样本的值,本文需要对图像中的所有像数点预测,就要使用for循环反复调用。

该函数返回一个double类型,指明被预测数据属于哪个类。

面对两分类问题的时候,通常使用+1代表正样本,即类1;-1代表负样本,即类2。最后根据返回的double值就可以知道预测数据的类别了。

上面函数的解释表明LIBSVM做分类的具体内部实现过程。那么,就可以不用DOS工具,直接通过调用LIBSVM函数来实现分类,也就可以直接让LIBSVM嵌入到原有程序中。

下面是LIBSVM2.83移植到本文程序中做两分类的步骤:

(1) 拷贝svm.h和svm.cpp文件到源工程目录下,并添加到工程中;

(2) 用既定格式保存样本点信息到内存中,并设置好训练参数;

(3) 调用训练函数,训练得到支持向量器并以文件形式保存到磁盘;

(4) 导入训练好的支持向量器文件,调用预测函数对血细胞图像中的每一个点进行预测,并根据其返回结果进行分类。

c++调用Libsvm相关推荐

  1. libsvm java 实例_LibSVM Java API调用示例程序

    [实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...

  2. matlab调用weka,weka学习(7)-Weka以及Matlab,LibSVM接口

    Weka是个口碑很好的machine learning工具,可怜我这土鳖以前都没用过. Weka还是很intuitive的,直接给你GUI,随便你选算法,直接帮你做cross validation,还 ...

  3. libsvm库简介及使用

    libsvm是基于支持向量机(support vector machine, SVM)实现的开源库,由台湾大学林智仁(Chih-Jen Lin)教授等开发,它主要用于分类(支持二分类和多分类)和回归. ...

  4. libSVM 参数选择

    [预测标签,准确率,决策值]=svmpredict(测试标签,测试数据,训练的模型);  原文参考:http://blog.csdn.net/carson2005/article/details/65 ...

  5. libSVM应用举例

    前面提到,很多人看到 libSVM这么多的参数,估计要犯晕了.没关系,我之前把相关的libSVM参数已经讲解了一遍,这里,再给出libSVM的用法.如果你不想花时间去仔细研究libSVM,完全可以参照 ...

  6. 开源SVM库libSVM介绍

    一.libSVM简介 libSVM是台湾大学林智仁教授等研究人员开发的一个用于支持向量机分类,回归分析及分布估计的c/c++开源库.另外,它也可以用于解决多类分类问题. libSVM最新的版本是201 ...

  7. libsvm使用心得

    Libsvm使用心得 首先下载Libsvm.Python和Gnuplot: l         libsvm的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下 ...

  8. libsvm与python的使用

    由于课程和课题的原因,这两天试用了一下国立台湾大学Chih-Chung Chang和Chih-Jen Lin编写的libsvm函数库,发现的确是一款写得很不错的软件,而且上手也比较容易,用了一个晚上的 ...

  9. libsvm使用方法总结

    1.所需要软件下载: (1)libsvm(http://www.csie.ntu.edu.tw/~cjlin/libsvm/) (2)python (3)gnuplot 画图软件(ftp://ftp. ...

最新文章

  1. 二十一、redis持久化之RDB
  2. pyqt5如何循环遍历控件名_如何用 PyQt5 快速构建一个简单的 GUI 应用
  3. 对中级 Linux 用户有用的 20 个命令
  4. 设计模式之—访问者模式VisitorPattern
  5. mapbox 修改初始位置_《绝地求生》实用的键位改键推荐 | 哪些不合理的初始键位需要更改?...
  6. linux通用内核,重新编译内核 - Linux通用系统优化大全_Linux教程_Linux公社-Linux系统门户网站...
  7. JavaScript高级程序设计(第四版) 第二章 HTML中的javascript
  8. Mac OS 下创建txt文本文件
  9. 技术分享|Javascript高级教程学习指南
  10. vivado使用入门
  11. 华为OceanStor Pacific斩获IO500榜单第二,数据存储的时与势
  12. JS实现快递单打印功能
  13. 如何调用Sphinx 和api接口
  14. java上传文件夹文件
  15. 陶哲轩是如何安排时间的
  16. Vue.use 写多个_老师说“你女儿跟多个男生早恋”,爸爸的回应改变了女儿的一生|早恋|马伊琍|晓敏|老师|告白...
  17. UI自动化辅助工具Inspect
  18. usage.txt-1
  19. (转)Android单元测试
  20. 如何配置nginx,实现在手机上查看页面?

热门文章

  1. Vuejs:组件 slot 内容分发
  2. 本地Android源代码库下载源码
  3. [LeedCode]921. 使括号有效的最少添加
  4. linux之分区的水深(标准分区方式)
  5. Protocol Buffer技术详解(C++实例)
  6. 记GMIC 2014
  7. C语言经典算法100例-031-判断星期几
  8. (一)prometheus与grafana介绍与安装
  9. 从全栈式解决方案到情感化,揭秘问众智能切入车载语音市场的最佳姿势...
  10. 开源http协议库curl和wget的区别和使用