最近在看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, ¶m);
svm保存模型:
svm_save_model(strResulttmp.c_str(), model)
svm释放模型与指针:
svm_free_and_destroy_model(&model); svm_destroy_param(¶m); 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使用