LIBSVM学习(六)代码结构及c-SVC过程

最近看LIBSVM,代码结构不是很明白,上网查到了很多关于代码结构注解的资料,在这里将 我认为比较好的一些资料进行汇总一下,当然,在文章最后有这些资料的链接地址。

libsvm中主要使用到的类(svm.cpp)

在做分类过程中,我们先看文件svm.cpp,该文件中包含了类的继承和组合(实线表示继承关系,虚线表示组合关系)

LIBSVM学习(六)代码结构及c-SVC过程_第1张图片

class Cache:本类主要负责运算所涉及的内存的管理,包括申请、释放等。
class Kernel:本类主要包括核函数的定义、克隆,矩阵Q(这里写图片描述)的计算等。这里关于矩阵Q的解释请看参考资料1。常见的核函数有:

LIBSVM学习(六)代码结构及c-SVC过程_第2张图片
class Solver:An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889–1918,是二次规划问题,使用算法SMO。
class Solver_NU:该类继承Solver类,Solver for nu-svm classification and regression。
class SVC_Q:继承Kernel类,Q matrices for various formulations。
class ONE_CLASS_Q:继承Kernel类,只处理 1 类分类问题(?),故不保留 y[i]。编号只有 1 类。
class SVR_Q:继承Kernel类,本类主要是用于做回归。

svm-train过程(这里只解释分类过程)

svm-train函数原型为:

svm_model *svm_train(const svm_problem *prob, const svm_parameter *param)

根据选择的算法,来组织参加训练的分样本,以及进行训练结果的保存。其中会对样本进行初步的统计。如下为训练过程:

→统计类别总数,同时记录类别的标号,统计每个类的样本数目 
→将属于相同类的样本分组,连续存放,            svm_group_classes
→计算权重C
→训练n(n-1)/2个模型                      
    →初始化nozero数组,便于统计SV
    →//初始化概率数组
    →训练过程中,需要重建子数据集,样本的特征不变,但样本的类别要改为        +1/-1//如果有必要,先调用svm_binary_svc_probability
    →训练子数据集svm_train_one
    →统计一下nozero,如果nozero已经是真,就不变,如果为假,则改为真
→输出模型
→主要是填充svm_model,
→清除内存

svm-predict预测过程

svm-predict函数使用说明:

"Usage: svm-predict [-b 0/1] test_file model_file output_file\n"    
    "-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); for one-class SVM only 0 is supported\n");

预测过程如下:

→参数获取,读取预测数据
→模型加载svm_load_model     
→预测并输出predict-label
   →if (predict_probability && (svm_type==C_SVC || svm_type==NU_SVC)) 调用svm_predict_probability函数
   →else  调用svm_predict函数   
→清除内存svm_free_and_destroy_model

c-svc计算过程

LIBSVM学习(六)代码结构及c-SVC过程_第3张图片
LIBSVM学习(六)代码结构及c-SVC过程_第4张图片

参考资料及简介

  1. http://download.csdn.net/detail/xiahouzuoxin/5778927
    林智仁SVM讲义(英文),SVM理论基础看这个就够了
  2. http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf
    该文档是台湾林智仁提供的LIBSVM使用说明文档。
  3. http://download.csdn.net/detail/lpcarl/8235115
    这是上海交大模式分析与机器智能实验室对LIBSVM的注解,非常全面。上面的一部分资料也是摘自该文章。
  4. http://blog.csdn.net/zy_zhengyang/article/details/45009431
    给出了C-SVC的计算过程,以图解的方式快速直观的看懂c-svc训练过程。
  5. http://www.cppblog.com/guijie/archive/2012/03/26/169034.html
    这是一个中文版的理解型的FAQ,有很多你疑惑的问题可以从这里找到。

你可能感兴趣的:(LIBSVM)