c++调用Libsvm

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]
10.2477828880.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) 导入训练好的支持向量器文件,调用预测函数对血细胞图像中的每一个点进行预测,并根据其返回结果进行分类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL -set

转载自:http://blog.csdn.net/LYHVOYAGE/article/details/22989659 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构, 在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位…

【机器学习实战之一】:C++实现K-近邻算法KNN

本文不对KNN算法做过多的理论上的解释,主要是针对问题,进行算法的设计和代码的注解。 KNN算法: 优点:精度高、对异常值不敏感、无数据输入假定。 缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值…

javascript设计模式-继承

javascript继承分为两种:类式继承(原型链、extend函数)、原型式继承(对继承而来的成员的读和写的不对等性、clone函数)。 类式继承-->prototype继承: 1 function Person(name){2 this.name …

GIS基础软件及操作(二)

原文 GIS基础软件及操作(二) 练习二、管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 当 ArcCatalog打开后,点击, 按钮(连接到文件夹). 建立到包含练习数据的…

libSVM分类小例C++

from:http://www.doczj.com/list_31/ 使用libSVM求解分类问题的C小例 1.libSVM简介 训练模型的结构体 struct svm_problem//储存参加计算的所有样本 { int l; //记录样本总数 double *y; //指向样本类别的组数 //prob.y new double[prob.l]; struct svm_node …

qunit 前端脚本测试用例

首先引用qunit 测试框架文件 <link rel"stylesheet" href"qunit-1.22.0.css"> <script src"qunit-1.22.0.js"></script> <div id"qunit"></div> <div id"qunit-fixture"></div>…

非常规文件名删除

生活中我们偶尔会遇到这样一件事&#xff1a;走在路上&#xff0c;突然感觉鞋底有东西&#xff0c;抬脚一看&#xff0c;是个泡泡糖。拿不掉&#xff0c;走路还一粘一粘的。要多难受有多难受&#xff01;同样在linux中也有这么一种文件名。看着不舒服&#xff0c;却删不掉。今天…

Machine Learning(Stanford)| 斯坦福大学机(吴恩达)器学习笔记【汇总】

from&#xff1a;https://blog.csdn.net/m399498400/article/details/52556168 定义本课程常用符号 训练数据&#xff1a;机器用来学习的数据 测试数据&#xff1a;用来考察机器学习效果的数据&#xff0c;相当于考试。 m 训练样本的数量&#xff08;训练集的个数) x 输入的…

模板匹配算法

from&#xff1a;https://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864 模板匹配(Template Matching)算法 模板匹配&#xff08;Template Matching&#xff09;是图像识别中最具代表性的方法之一。它从待识别图像中提取若干特征向量与模板对应的特征向量进行比较…

立体匹配十大概念综述---立体匹配算法介绍

from&#xff1a;https://blog.csdn.net/wintergeng/article/details/51049596 一、概念 立体匹配算法主要是通过建立一个能量代价函数&#xff0c;通过此能量代价函数最小化来估计像素点视差值。立体匹配算法的实质就是一个最优化求解问题&#xff0c;通过建立合理的能量函数…

zjnu1730 PIRAMIDA(字符串,模拟)

Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 E Sample Output 1 0 2 1 1题意&#xff1a;给你一个长度小于等于10^6的字符串&#xff0c;然后每次让它循环铺盖&#xff0c;构成层数为n的塔&#xff0c;让你求得第i层塔中某个字符的个数。 思路&#xff1a;首先要…

ICP算法理解

from&#xff1a;https://blog.csdn.net/linear_luo/article/details/52576082 1 经典ICP ICP的目的很简单&#xff0c;就是求解两堆点云之间的变换关系。怎么做呢&#xff1f;思路很自然&#xff0c;既然不知道R和t(针对刚体运动)&#xff0c;那我们就假设为未知量呗&#xf…

图像处理的灰度化和二值化

from&#xff1a;http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#x…

获取子元素

1、纯css 获取子元素 #test1>div {background-color:red;}#test1 div {font-size:14px;}#test1>div:first-child {color:#ccc;} <div id"test1"><div>性别</div><div>男</div></div> 因1示例中为#test1下的子元素 #test1…

44.Android之Shape设置虚线、圆角和渐变学习

Shape在Android中设定各种形状&#xff0c;今天记录下&#xff0c;由于比较简单直接贴代码。 Shape子属性简单说明一下:   gradient -- 对应颜色渐变。 startcolor、endcolor就不多说了。 android:angle是指从哪个角度开始变.solid -- 填充。stroke -- 描边。corners -- 圆角…

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

from&#xff1a;https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括&#xff1a;深度上的…

django 初试

/*************************************************************************************** django 初试* 说明&#xff1a;* 昨天打搭了dgango的服务器&#xff0c;今天学一下怎么来输出一个hello world出来。* * …

浅析“高斯白噪声”,“泊松噪声”,“椒盐噪声”的区别

from&#xff1a;https://www.jianshu.com/p/67f909f3d0ce 在图像处理的过程中&#xff0c;一般情况下都进行图像增强&#xff0c;图像增强主要包括“空域增强”和“频域增强”&#xff0c; 空域增强包括平滑滤波和锐化滤波。 平滑滤波&#xff0c;就是将图像模糊处理&#x…

Java 开发环境部署

1.下载Java开发环境工具包JDK&#xff0c;下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后&#xff0c;双击jdk应用程序&#xff0c;根据提示完成安装&#xff0c;安装过程中可以自定义安装目录等信息&#xff0c;这里我选择…

枚举enum、NS_ENUM 、NS_OPTIONS

2019独角兽企业重金招聘Python工程师标准>>> enum 了解位移枚举之前&#xff0c;我们先回顾一下C语言位运算符。 1 << : 左移,比如1<<n,表示1往左移n位&#xff0c;即数值大小2的n次方; 例如 : 0b0001 << 1 变为了 0b0010 2 >> : 右…