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 **x;//数据样本    //prob.x = new svm_node[prob.l][] ==>svm_node[index][value] ;  

};

当样本类别事先已经被告知时,可以通过数字来给样本数据进行标识(如果是两类通常以1与-1来表示)。如果不清楚样本类别可以用样本个数编号来设置,这时候分类的准确率也就无法判定了。

数据样本是一个二维数组,其中每个单元格储存的是一个svm_node,y与样本数据的对应关系为:

libSVM分类小例C++

数据节点的结构体

struct svm_node//储存单一向量的单个特征

{

      int index; //索引

      double value; //值

};

如果需要储存向量,就可以使用6个svm_node来保存,内存映像为:

libSVM分类小例C++

SVM模型类型枚举

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };

◆C_SVC: C表示惩罚因子,C越大表示对错误分类的惩罚越大

◆NU_SVC: 和C_SVC相同。

◆ONE_CLASS: 不需要类标号,用于支持向量的密度估计和聚类.

◆EPSILON_SVR:-不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域,即-带。

◆NU_SVR:由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合

适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。

注意:C_SVC与NU_SVC其实采用的模型相同,但是它们的参数C的范围不同C_SVC采用的是0到正无穷,NU_SVC是[0,1]。

核函数类型枚举

enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };

◆LINEAR:线性核函数(linear kernel)

◆POLY:多项式核函数(ploynomial kernel)

◆RBF:径向机核函数(radical basis function)

◆SIGMOID:神经元的非线性作用函数核函数(Sigmoid tanh)

◆PRECOMPUTED:用户自定义核函数

计算模型参数结构体

struct svm_parameter

{

      int svm_type; //支持向量机模型类型

      int kernel_type; //核函数类型

      int kernel_type; //核函数类型

      int degree; /* 使用于POLY模型*/

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

      double coef0; /* for poly/sigmoid */

      /* these are for training only */

      double cache_size; /* 缓存块大小(MB) */

      double eps; /* 终止条件(默认0.001) */

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

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

      int *weight_label; /* for C_SVC */

      double* weight; /* for C_SVC */

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

      double p; /* for EPSILON_SVR */

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

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

};

结构体svm_mod el

用于保存训练后的训练模型,当然原来的训练参数也必须保留。

struct svm_model

{

      struct svm_parameter param; /*训练参数*/

      int nr_class; /*类别数, = 2 in regression/one class svm */

      int l; /*支持向量数*/

      struct svm_node **SV; /*支持向量的指针*/

      double **sv_coef; /*相当于判别函数中的alpha */

      double *rho; /*相当于判别函数中的b */

      double *probA; /* pariwise probability information */

      double *probB; /* for classification only */

      int *label; /* label of each class (label[k]) */

      int *nSV; /* numbe

      r of SVs for each class (nSV[k]) */

      int *nSV; /* number of SVs for each class (nSV[k]) */

      /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */ int free_sv;

      /* 1 if svm_model is created by svm_load_model*/

      /* 0 if svm_model is created by svm_train */

};

2.程序代码实现

这里定义SVMExample类,类主要成员变量为:

struct svm_parameter param; //模型参数

struct svm_problem prob;//

struct svm_model *model; //

struct svm_node *x_space; //

构造函数

构造函数里主要进行参数的初始化,和基本函数的调用

param.svm_type = C_SVC;

param.kernel_type = LINEAR;

param.degree = 3;

param.gamma = 0; // 1/num_features

param.coef0 = 0;

param.nu = 0.5;

param.cache_size = 1;//缓存块大小

param.C = 1;

param.eps = 1e-3;

param.p = 0.1;

param.shrinking = 1;

param.probability = 0;

param.nr_weight = 0;

param.weight_label = NULL;

param.weight = NULL;

cross_validation = 0;

核函数的选取直接影响到分类的结果,如何正确选取核函数就需要使用者对数据的特性有所了解,根据实际情况,这里的核函数选用的是线性的。

 实例分析

成员函数一:初始化样本数据

样本选取是学生的身

高和体重:

样本选取是学生的身高和体重:

男1:身高:190cm,体重:70kg;

男2:身高:180cm,体重:80kg;

女1:身高:161cm,体重:80kg;

女2:身高:161cm,体重:47kg;

这里由于事先已经知道样本有男女类别之分,所以设置男生标签为-1,女生标签为1,相对于程序中的y值(样本类别)。

void SVMExample::initliazeData()
{struct svm_node **_node = Malloc(struct svm_node*, 4);//分配4个空间存放4个人信息x_space = Malloc(svm_node, 3);//男1:身高:190cm,体重:70kg;x_space[0].index = 1;x_space[0].value = 190;x_space[1].index = 2;x_space[1].value = 70;x_space[2].index = -1; //x_space[2].value = NULL_node[0] = x_space;x_space = Malloc(svm_node, 3); //男2:身高:180cm,体重:80kg;x_space[0].index = 1;x_space[0].value = 180;x_space[1].index = 2;x_space[1].value = 80;x_space[2].index = -1;//x_space[2].value = NULL_node[1] = x_space;x_space = Malloc(svm_node, 3); //女1:身高:161cm,体重:80kg;x_space[0].index = 1;x_space[0].value = 161;x_space[1].index = 2;x_space[1].value = 45;x_space[2].index = -1;//x_space[2].value = NULL_node[2] = x_space;x_space = Malloc(svm_node, 3); //女2:身高:161cm,体重:47kg;x_space[0].index = 1;x_space[0].value = 163;x_space[1].index = 2;x_space[1].value = 47;x_space[2].index = -1;//x_space[2].value = NULL_node[3] = x_space;double *y1 = Malloc(double, 4); y1[0] = -1;y1[1] = -1;y1[2] = 1;y1[3] = 1;prob.l = 4;prob.x = _node;prob.y = y1;
}

成员函数二:训练样本数据,得出模型

void SVMExample::analysisData()
{const char *error_msg;error_msg = svm_check_parameter(&prob,&param);if(error_msg){fprintf(stderr, "\nerror:%s\n", error_msg);exit(1);}//如果有必要可以进行交叉性检验/*if(cross_validation){do_cross_validation();}*/model = svm_train(&prob, &param);
}

成员函数三:预测数据

预测数据1:身高180cm,体重85kg;

预测数据2:身高161cm,体重50kg;

void SVMExample::displayResult()
{//进行预报struct svm_node *node1 = Malloc(svm_node, 3);node1[0].index = 1;node1[0].value = 180;node1[1].index = 2;node1[1].value = 85;node1[2].index = -1;double r1 = svm_predict(model, node1);printf("预测值r1:%f\n", r1);free(node1);struct svm_node *node2 = Malloc(svm_node, 3);node2[0].index = 1;node2[0].value = 161;node2[1].index = 2;node2[1].value = 50;node2[2].index = -1;double r2 = svm_predict(model, node2);printf("预测值r2:%f\n", r2);free(node2);
}

预测结果

得出分类结果:预测样本1的输出为-1(男),预测样本2的输出为1(女)。如果有需要的话请联系:ikuler@http://www.doczj.com/doc/517f7fa1f524ccbff121846b.html

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

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

相关文章

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 >> : 右…

数字图像处理-频率域滤波原理

from&#xff1a;https://blog.csdn.net/forrest02/article/details/55510711?locationNum15&fps1 写在前面的话 作者是一名在读的硕士研究僧&#xff0c;方向是图像处理。由于图像处理是一门相对复杂的学科&#xff0c;作者在课堂上学到的东西只是非常浅显的内容&#…

深入浅出的讲解傅里叶变换(真正的通俗易懂)

原文出处&#xff1a; 韩昊 1 2 3 4 5 6 7 8 9 10 作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老…

IIS(1)

转载&#xff1a;http://blog.csdn.net/ce123 IIS音频总线学习&#xff08;一&#xff09;数字音频技术 一、声音的基本概念 声音是通过一定介质传播的连续的波。 图1 声波重要指标&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重复出现的时间间隔频率&#xff1a;…

手机屏幕适配原理及实现

为什么80%的码农都做不了架构师&#xff1f;>>> 手机屏幕是用户与 App 最直接的交互点 不同的分辨率下用户对我们的 App 具有明显的感观差异&#xff0c;主流分辨率的更新迭代却又完全独立于 App 进行。这让我们想要使 App 在绝大多数主流手机上都保持感观、体验的…

【数字图像处理】傅里叶变换在图像处理中的应用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二维傅里叶变换的定义 1.1二维傅里叶变换 二维Fourier变换: 逆变换&#xff1a; 1.2二维离散傅里叶变换 一个图像尺寸为MN的 函数的离散傅里叶变换由以下等式给出&#xff1a; 其中 和。其中变量u和…