首页 > 编程 > C++ > 正文

libsvm + VS2010 + C++大部分转载,部分原创

2019-11-11 02:55:22
字体:
来源:转载
供稿:网友

这篇博客使用了libsvm中提供的 svm.h svm.c,然后自己编写了一个SVMclassification类,里面有数据读取,训练,预测三个主要的函数,实现了libsvm函数库的函数接口调用。而不是仅仅使用libsvm包中的提供的svm-train.exe文件,svm-train.exe文件也是编写svm-train.cpp经过编译生成的。

libsvm中提供的3个主要的函数接口:

struct svm_model *svm_train(const struct svm_PRoblem *prob, const struct svm_parameter *param); 训练函数

double svm_predict(const struct svm_model *model, const struct svm_node *x);  预测函数

int svm_save_model(const char *model_file_name, const struct svm_model *model);  模型的保存和载入struct svm_model *svm_load_model(const char *model_file_name);

只要输入数据符合svm.cpp中的格式要求即可。

当然还要选择合适的核函数和参数.

We propose that beginners try the following procedure : 1、Transform data to the format of an SVM package(读入训练数据并保存为合适的格式) 2、Conduct simple scaling on the data(归一化) 3、Consider the RBF kernel (径向基函数) 4、Use cross-validation to nd the best parameter C and gama(交叉验证选取最佳参数)5、 Use the best parameter C and to train the whole training set。 Test(使用最佳参数训练整个数据集)

libSVM是一个非常有名的SVM开源库,最近我在做分类任务,最后需要用到SVM进行分类,可是网上对于libSVM的介绍大多是matlab的,还有就是使用DOS命令调用的,直接使用libSVM的函数进行编程的介绍非常少,我来大体介绍一下我使用的情况吧。

我对于libSVM的了解也不是很清楚,只是单纯的利用他做训练和识别而已。

一、环境搭建

我使用的VS2013 + C++作为开发的,首先下载libSVM最新的版本http://www.csie.ntu.edu.tw/~cjlin/libsvm/,解压后如下图所示:使用VS2013创建一个新的空工程,把上图目录中的svm.cpp和svm.h复制到工程目录下,并通过在工程中右键——Add——Exsiting Item把这两个文件添加到工程中去,如下图所示。好了,到目前为止环境就搭建好了,简单明了~注意:VS2013中使用fopen会出现一个错误,原因是VS2013自身兼容性不好,认为fopen不安全,可以通过 工程右键——Properties——C++——Preprocesser——Preprocesser Definitions中添加_CRT_SECURE_NO_WARNINGS解决该问题。同时VS2013中编译会出现strdup函数编译不过去,同样根据提示,把该函数改为_strdup即可。

二、特征文件读取

我感觉网上对于libsvm有一种误导,就是你的特征文件必须要按照一定的格式来,才能够被读取训练,其实这只是对于使用dos命令行调用libsvm时的规定,因为libsvm自定义的特征文件格式是与其读取相匹配的。如果我们使用自己的读取文件函数,则完全不用拘束于这种格式,只要我们在读取函数之中与我们自己的特征文件格式相匹配即可。在libsvm中,与读取特征文件相关的类型为svm_problem。这个类中有三个元素,如下所示:[cpp] view plain copyprint?在CODE上查看代码片struct svm_problem   {      int n; //记录样本总数      double *y; //记录样本所属类别      struct svm_node **x; //存储所有样本的特征,二维数组,一行存一个样本的所有特征  };  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选