libSVM + VS2013 + C++使用介绍
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhanchao/article/details/53367532 </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div class="htmledit_views" id="content_views">
libSVM是一个非常有名的SVM开源库,最近我在做分类任务,最后需要用到SVM进行分类,可是网上对于libSVM的介绍大多是matlab的,还有就是使用DOS命令调用的,直接使用libSVM的函数进行编程的介绍非常少,我来大体介绍一下我使用的情况吧。
我对于libSVM的了解也不是很清楚,只是单纯的利用他做训练和识别而已。
一、环境搭建
二、特征文件读取
- struct svm_problem
- {
- int n; //记录样本总数
- double *y; //记录样本所属类别
- struct svm_node **x; //存储所有样本的特征,二维数组,一行存一个样本的所有特征
- };
其中svm_node类型的定义如下:
- struct svm_node //用来存储输入空间中的单个特征
- {
- int index; //该特征在特征空间中的维度编号
- double value; //该特征的值
- };
借用网上的一张图进行表示:
以我使用svm举例,我的特征文件如下图所示:
- #include "svm.h"
- #include <vector>
- #include <list>
- #include <iostream>
- #include <Windows.h>
- class ClassificationSVM
- {
- public:
- ClassificationSVM();
- ~ClassificationSVM();
- void train(const std::string& modelFileName);
- void predict(const std::string& featureaFileName, const std::string& modelFileName);
- private:
- void setParam();
- void readTrainData(const std::string& featureFileName);
- private:
- svm_parameter param;
- svm_problem prob;//all the data for train
- std::list<svm_node*> dataList;//list of features of all the samples
- std::list<double> typeList;//list of type of all the samples
- int sampleNum;
- //bool* judgeRight;
- };
其中 setParam函数设置如下所示:
- void ClassificationSVM::setParam()
- {
- param.svm_type = C_SVC;
- param.kernel_type = RBF;
- param.degree = 3;
- param.gamma = 0.5;
- param.coef0 = 0;
- param.nu = 0.5;
- param.cache_size = 40;
- param.C = 500;
- param.eps = 1e-3;
- param.p = 0.1;
- param.shrinking = 1;
- param.nr_weight = 0;
- param.weight = NULL;
- param.weight_label = NULL;
- }
我的读取文件的函数如下所示:
- void ClassificationSVM::readTrainData(const string& featureFileName)
- {
- FILE *fp = fopen(featureFileName.c_str(), "r");
- if (fp == NULL)
- {
- cout << "open feature file error!" << endl;
- return;
- }
- fseek(fp, 0L, SEEK_END);
- long end = ftell(fp);
- fseek(fp, 0L, SEEK_SET);
- long start = ftell(fp);
- //读取文件,直到文件末尾
- while (start != end)
- {
- //FEATUREDIM是自定义变量,表示特征的维度
- svm_node* features = new svm_node[FEATUREDIM + 1];//因为需要结束标记,因此申请空间时特征维度+1
- for (int k = 0; k < FEATUREDIM; k++)
- {
- double value = 0;
- fscanf(fp, "%lf", &value);
- features[k].index = k + 1;//特征标号,从1开始
- features[k].value = value;//特征值
- }
- features[FEATUREDIM].index = -1;//结束标记
- char c;
- fscanf(fp, "\n", &c);
- char name[100];
- fgets(name, 100, fp);
- name[strlen(name) - 1] = '\0';
- //negative sample type is 0
- int type = 0;
- //positive sample type is 1
- if (featureFileName == "PositiveFeatures.txt")
- type = 1;
- dataList.push_back(features);
- typeList.push_back(type);
- sampleNum++;
- start = ftell(fp);
- }
- fclose(fp);
- }
其中dataList和typeList分别存放特征值和该特征样本对应的标号(正或负)。
std::list<double> typeList;//list of type of all the samples
三、svm训练和识别
- void ClassificationSVM::train(const string& modelFileName)
- {
- cout << "reading positivie features..." << endl;
- readTrainData("PositiveFeatures.txt");
- cout << "reading negative features..." << endl;
- readTrainData("NegativeFeatures.txt");
- cout << sampleNum << endl;
- prob.l = sampleNum;//number of training samples
- prob.x = new svm_node *[prob.l];//features of all the training samples
- prob.y = new double[prob.l];//type of all the training samples
- int index = 0;
- while (!dataList.empty())
- {
- prob.x[index] = dataList.front();
- prob.y[index] = typeList.front();
- dataList.pop_front();
- typeList.pop_front();
- index++;
- }
- cout << "start training" << endl;
- svm_model *svmModel = svm_train(&prob, ¶m);
- cout << "save model" << endl;
- svm_save_model(modelFileName.c_str(), svmModel);
- cout << "done!" << endl;
- }
prob是svm_problem类型的对象,就是把之前读取的特征全部放入svm_problem的对象中。
- void ClassificationSVM::predict(const string& featureFileName, const string& modelFileName)
- {
- std::vector<bool> judgeRight;
- svm_model *svmModel = svm_load_model(modelFileName.c_str());
- FILE *fp;
- if ((fp = fopen(featureFileName.c_str(), "rt")) == NULL)
- return;
- fseek(fp, 0L, SEEK_END);
- long end = ftell(fp);
- fseek(fp, 0L, SEEK_SET);
- long start = ftell(fp);
- while (start != end)
- {
- svm_node* input = new svm_node[FEATUREDIM + 1];
- for (int k = 0; k<FEATUREDIM; k++)
- {
- double value = 0;
- fscanf(fp, "%lf", &value);
- input[k].index = k + 1;
- input[k].value = value;
- }
- char c;
- fscanf(fp, "\n", &c);
- char name[100];
- fgets(name, 100, fp);
- name[strlen(name) - 1] = '\0';
- input[FEATUREDIM].index = -1;
- int predictValue = svm_predict(svmModel, input);
- if (featureFileName == "positive_test.txt")
- {
- if (predictValue == 0)
- judgeRight.push_back(false);
- else
- judgeRight.push_back(true);
- }
- else if (featureFileName == "negative_test.txt")
- {
- if (predictValue == 1)
- judgeRight.push_back(false);
- else
- judgeRight.push_back(true);
- }
- start = ftell(fp);
- }
- fclose(fp);
- int correctNum = 0;
- int totalNum = judgeRight.size();
- for (int i = 0; i < totalNum; i++)
- {
- if (judgeRight[i] == true)
- correctNum++;
- }
- double precent = 1.0 * correctNum / totalNum;
- cout << precent << endl;
- }
分类时的代码与之前的代码非常类似,不多做赘述。
libSVM + VS2013 + C++使用介绍相关推荐
- MATLAB libsvm 安装和使用
最近在学习SVM,在matlab上安装和使用Libsvm的过程中遇到了好多问题,在网上查看了许多资料,踩了许多坑. 整理一下供大家分享,希望能节省大家在安装过程中的时间. 一.安装 1.libsvm ...
- LIBSVM在Matlab下的使用和LIBSVM的matlab软件下README全文翻译
1.简介 我们每次用matlab编写SVM模型做预测和分类时,就会需要用到这个工具包,当然现在新版本有matlab自带的工具APP,可以完成支持向量机(SVM),不需要写代码,因此就不需要安装工具包. ...
- libsvm的安装和使用【转载】
最近在学习SVM,在matlab上安装和使用Libsvm的过程中遇到了好多问题,在网上查看了许多资料,踩了许多坑. 整理一下供大家分享,希望能节省大家在安装过程中的时间. 一.安装 1.libsvm ...
- LIBSVM使用说明、简介及感悟
使用LIBSVM需要用到的其他工具:Python(相信搞SVM的或多或少都知道Python吧,安装时注意一点就是记得要添加环境变量!).以下内容是指windows平台的. 配套论文:LIBSVM: A ...
- SVM讲的成体系的,自圆其说较好的一篇,上午没读完,KKT第二部分不等式有疑问没弄懂,复制后继续读完
https://www.jiqizhixin.com/articles/2018-10-17-20 贪心科技原创 2018/10/17 16:26 我i智能来源 学习SVM,这篇文章就够了!(附详细代 ...
- 一文读懂支持向量机SVM(附实现代码、公式)
来源:机器学习算法与Python学习 本文约11000字,建议阅读10+分钟. 本文以简单实例化形式记录学习SVM的过程,力图帮助新手级学习者少走弯路. 支持向量机(SVM),一个神秘而众知的名字,在 ...
- 2014年7月份第2周51Aspx源码发布详情
体育馆综合会员管理系统源码 2014-7-11 [VS2010]功能介绍:本系统适用于羽毛球馆,台球馆,乒乓球馆,棋牌室,篮球馆等综合体育馆,可同时使用.本系统功能非常强大,包含体育馆内餐厅,超 ...
- 2014年6月份第4周51Aspx源码发布详情
通用医院会员管理系统源码 2014-6-23 [VS2010]功能介绍:本系统共包括以下模块:会员开卡管理.会员充值管理.会员消费管理.会员病例管理.客户预约管理.系统信息管理(门诊管理.卡类型管理 ...
- 关于福昕软件公司的控件使用-Foxit PDF SDK ActiveX
这是一款由福昕软件公司开发的控件,控件名字FoxitPDFSDKActiveX520_Std_x64.ocx. 我的开发环境: WIN7 64BIT VS2013 官网介绍: https:// ...
最新文章
- Asterisk安装
- Java基础知识——异常Throwable和Exception
- 在网页中给Flash加上超级链接
- 通才和专家:如何选择
- Python标准库之csv(1)
- 有关于mysql自增型需要返回id_关于mysql自增id,你需要知道的
- 判断上三角矩阵_线性代数15——矩阵空间\对角矩阵\和秩1矩阵
- tmemo 选择消除行_无线耳机新选择
- python2.7.12源码编译
- jQuery、Ajax,DataTable数据如何转换成Json格式
- Js获取移动设备分辨率
- 陈希孺《概率论与数理统计》读书笔记
- NiFi 学习 —自己实现处理器
- 鸟哥的linux私房菜 第五章
- 无人机三维建模(1) 调研
- 这应该是史上最强的物理学科普(雄文)
- 安庆集团-冲刺日志(第六天)
- linux nginx配置81端口用于访问web81
- mac系统升级后git使用不了
- UINO优诺:数字孪生可视化管理GIV,打造统览全局大视野
热门文章
- c++类的嵌套(1)
- sv_labs学习笔记——sv_lab5_上(System Verilog)
- 如何将win10的资源管理器指向“这台电脑”?
- 三维点云学习(3)7- 实现GMM
- 【前端 · 面试 】HTTP 总结(七)—— HTTP 缓存概述
- javascript继承的原理
- 共同努力做好NBear!
- 2021-08-31 转载 Scala Akka 系列文章
- JavaWeb——拦截器HandlerInterceptor
- addEventListener事件监听传递参数