svm的使用

最近在看svm,顺便做一下笔记。

libsvm历史版本:

https://www.csie.ntu.edu.tw/~cjlin/libsvm/oldfiles/

关于libsvm的简介自行百度。

我关注的是使用svm分类,opencv里面保存的模型为什么会保存多组决策函数,而直接使用libsvm找不到保存的决策函数以及每个决策函数对应的支持向量。

 libsvm中采用的是1 v 1分类。
    对于n类样本,选取其中任意2类进行训练,得到训练模型,一共 有n(n-1)/2个二分类模型,对于待预测样本,使用这n(n-1)/2个模型进行分类预测,最后对得到的结果进行统计,得到属于每一类的次数,按类别标签从小到大排列,第一个最大值所对应的类就是该次多分类预测的结果。

svm训练:

model = svm_train(&prob, &param);

svm保存模型:

svm_save_model(strResulttmp.c_str(), model)

svm释放模型与指针:

svm_free_and_destroy_model(&model);
svm_destroy_param(&param);
free(prob.y);
free(prob.x);
free(x_space);

svm加载模型:

m_SVMPredict = svm_load_model(strLoadtmp.c_str());

svm预测分类:

int ret = svm_predict(m_SVMPredict, svm_data);

使用libsvm返回置信度信息:

double *pro_estimate = new double[cls_num];
memset(pro_estimate, 0, cls_num);
int ret = svm_predict_probability(m_SVMPredict, svm_data, pro_estimate);

对于需要返回置信度信息的预测,在训练时略有不同。

svm训练默认参数(来自svm-train.c):

    // default values
    param.svm_type = C_SVC;
    param.kernel_type = RBF;
    param.degree = 3;
    param.gamma = 0;    // 1/num_features
    param.coef0 = 0;
    param.nu = 0.5;
    param.cache_size = 100;
    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;

需要返回置信度的训练时参数要改一个:

param.probability = 1;

一般优化参数会使用grid.py优化参数 -c 和 -g ,即

param.C

param.gamma

关于提取特征后训练可以参考我的这篇博客:LIBSVM使用

原文地址:https://www.cnblogs.com/juluwangshier/p/13098824.html