记录LIbSVM使用的关键。不是教程,教程可以参考:https://blog.csdn.net/shayne000/article/details/88756447
从LIbSVM的训练模型函数说起:
svm_model* svmModel = svm_train(&prob, ¶m);
这是一个模型训练函数,训练成功之后会产生一个SVM模型。
所以前期工作就是对实现连个参数:&prob, ¶m
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, ¶m) != NULL)
{
std::cout << svm_check_parameter(&prob, ¶m) << 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);