欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LibSVM使用记录 C++ Visual studio

程序员文章站 2022-06-17 11:32:16
...

记录LIbSVM使用的关键。不是教程,教程可以参考:https://blog.csdn.net/shayne000/article/details/88756447
从LIbSVM的训练模型函数说起:

svm_model* svmModel = svm_train(&prob, &param);

这是一个模型训练函数,训练成功之后会产生一个SVM模型。
所以前期工作就是对实现连个参数:&prob, &param
prob相当于问题数据空间,param相当于模型求解的算法参数
首先看一下参数选项,具体的解释在说明文档里面有:

struct svm_parameter
{
	int svm_type;
	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 */
	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 */
};

然后看一下问题数据空间

struct svm_problem
{
	int l;//样本数量
	double *y;//样本Y值是一个以为数组
	struct svm_node **x;//样本特征值是一个二维数据,一个svm_node的一维数组代表一个样本
};

接下来看看svm_node的数据结构:

struct svm_node
{
	int index;//样本特征索引
	double value;//样本特征值
};

当index = -1 的时候表示这个样本结束

所以首先填充一维的svm_node数组作为样本,然后将很多个样本放到struct svm_node **x;,同时也要把y复制还有样本数量赋值。

在调用训练函数之前还要先检查一下参数是否有问题

	//检查参数设置是否错误;
	if (svm_check_parameter(&prob, &param) != NULL)
	{
		std::cout << svm_check_parameter(&prob, &param) << std::endl;
	}

如果没有问题就是保存模型,然后加载模型,然后预测啦

//保存模型
svm_save_model(modelFileName.c_str(), svmModel);
//加载模型
svm_model* svmModel = svm_load_model(modelFileName.c_str());

//单样本预测(也有成组的预测)
//建立一个待预测样本
svm_node* input = new svm_node[FEATUREDIM + 1];
....
//预测
int predictValue = svm_predict(svmModel, input);
相关标签: C++