LIBSVM的结构分析

来源:互联网 发布:手机淘宝怎么发布零食 编辑:程序博客网 时间:2024/05/29 15:48

首先,我们调用的是svm-train.c这个文件进行训练,在visual studio下对应加载svm.h,svm.cpp,svm-train.c三个文件。编译为svm-train.exe可执行文件然后在命令行执行训练过程。

关于svm.h,是定义的一个头文件。其中定义的是svm需要的输入参数以及最后输出的模型,和一些函数。以供svm.hsvm-train.c文件中调用。

关于svm-train.c,我们首先找到主函数int main(int argc,char **argv)。这两个输入代表数据集和svm参数。数据集格式可以参照libsvm自带数据集格式,参数格式也一样。

关于读取数据,分为两个部分,第一个部分是读取命令行输入,也就是parse_command_line,把输入的训练集和svm参数分别保存到两个data里面。然后read_problem调用训练集数据,把每行数据都按照svm.h中定义的结构体保存下来。

下面是判断参数里面是否含有交叉验证这一参数。如果有,则进行交叉验证(默认是一折交叉验证)。然后调用svm_goup_classes分类。之后进行训练svm_train。如果不进行交叉验证的话,那么就直接执行svm_train。该函数也在svm.cpp中重写。

关于分类,众所周知,svm有回归和分类,回归也是一种分类。这里把回归和一分类问题归为一类,多分类问题为另一类。下面只描述多分类问题。回归和一分类问题也类似。

Svm_group_classes,该函数实现的目的是把数据集依照类别进行划分。Nr_class就是类别的个数,比如手写识别案例就是nr_class=10,因为十个数字。分好类以后采用one-to-one的训练方式。两个for循环遍历nr_class,每一类都和其他所有类进行一次最优超平面的划分。最后综合投票决定划分。

svm_train_one中以C_SVC为列。s.SolveSVMSMO算法主体。关于算法主体就不在描述。




0 0