LibSVM-2.8程序代码注释.doc

上传人:灯火****19 文档编号:134977384 上传时间:2020-06-10 格式:DOC 页数:31 大小:827KB
返回 下载 相关 举报
LibSVM-2.8程序代码注释.doc_第1页
第1页 / 共31页
LibSVM-2.8程序代码注释.doc_第2页
第2页 / 共31页
LibSVM-2.8程序代码注释.doc_第3页
第3页 / 共31页
LibSVM-2.8程序代码注释.doc_第4页
第4页 / 共31页
LibSVM-2.8程序代码注释.doc_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《LibSVM-2.8程序代码注释.doc》由会员分享,可在线阅读,更多相关《LibSVM-2.8程序代码注释.doc(31页珍藏版)》请在金锄头文库上搜索。

1、数据挖掘平台文档ConfidentialLibSVM-2.8程序代码注释刘国平()2005-08-06我不经心地,服下你调好的毒 我知道今后我将万劫不复 但是你的红唇仍让我屈服 四月的樱花火红满天 我和你的梦,却要一以何处去缱绻? 虽然人间的情爱万万千千 世上已有太多崩毁的誓言 七个黑夜,七个白天 我为你写下的歌,彩绘的纸笺 却只能随着晚风 飘在大海的岸边 我仍愿服下你精心为我调好的毒 从你那深情的吻 吞下我与你在人间 最后的流光万千辗转朱颜 第一章 LibSVM结构一、文件结构整个LibSVM由两个文件组成,svm.h, svm.cpp。其中svm.h中定义了使用LibSVM所需要的数据结构

2、和函数。数据结构:struct svm_node :数据节点,每个节点只是单个样本矢量中的一个特征。struct svm_problem :数据集,存放所有样本矢量的数据结构。struct svm_parameter : SVM参数。其实应该还有一个数据结构存放在头文件中:struct svm_model : 训练好的训练模型。二、类结构图其中有两组关键的类:1、 QMatrix类: 包括QMatrix, Kernel, SVC_Q, SVR_Q, ONE_CLASS_Q;2、 Solver类: 包括Solver, Solver_NU;(矢量图,可以调整放大倍数)第二章: 头文件SVM.h本文

3、件只是定义了若干个结构体,和若干接口函数。严格的来说,它们并不是接口函数,因为实际上整个代码里面,可以直接访问的函数还有其他。但事实上,如果仅仅是应用一下这份代码的话,只要知道这几个函数就可以了。2.1 struct svm_nodestruct svm_nodeint index;double value;struct svm_node用来存储单一向量中的单个特征,例如:向量 x1= 0.002, 0.345, 4, 5.677;那么用struct svm_node来存储时就使用一个包含5个svm_node的数组来存储此4维向量,内存映象如下:123410.0020.34540005.677

4、空其中如果value为0.00,该特征将不会被存储,其中(特征3)被跳过:124510.0020.34540005.677空0.00不保留的好处在于,做点乘的时候,可以加快计算速度,对于稀疏矩阵,更能充分体现这种数据结构的优势。但做归一化时,操作就比较麻烦了。(类型转换不再说明)2.2 struct svm_problemstruct svm_problemint l;double *y;struct svm_node *x;struct svm_problem存储本次参加运算的所有样本(数据集),及其所属类别。在某些数据挖掘实现中,常用DataSet来实现。int l;记录样本总数doubl

5、e *y;指向样本所属类别或者回归值的数组。在多类问题中,因为使用了one-agianst-one方法,可能原始样本中yi的内容是1.0,2.0,3.0,,也就是属于类别1,2,3,但但参与多类计算时,参加分类的两类所对应的yi内容是+1,和1。Struct svm_node *x;指向一个存储内容为指针的数组;如下图,最右边的四个长条格同上表,存储三维数据。(黑边框的是最主要的部分)Y3Y2Y1Y0L=4Y*X*这样的数据结构有一个直接的好处,可以用xij来访问其中的某一元素(如果value为0.00的也全部保留的话)。私下认为其中有一个败笔,就是把svm_node* x_space放到结构

6、外面去了。2.3 enumsenum C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR ;/* svm_type */enum LINEAR, POLY, RBF, SIGMOID ;/* kernel_type */支持向量机类型以及若干文献:C-SVC :C.J.C. Burges. A tutorial on support vector machines for pattern recognition. Data Mining and Knowledge Discovery, 2(2):955-974, 1998.NU_SVC :(待补充)2.

7、4 struct svm_parameterstruct svm_parameterint svm_type;/SVM类型,见前enumint kernel_type;/核函数double 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;/* f

8、or 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 *

9、/;部分参数解释,(附核函数)1、2、3、4、double degree;/就是2式中的ddouble gamma; /就是2,3,4式中的gammadouble coef0;/就是2,4式中的rdouble cache_size;/* in MB */ 制定训练所需要的内存,默认是40M,LibSVM2.5中是4M,所以自己做开发选LibSVM2.5还是不错的!double eps;见参考文献1中式3.13double C;/没什么好说的,惩罚因子,越大训练的模型越那个,当然耗的时间越多int nr_weight;/权重的数目,目前在实例代码中只有两个值,一个是默认0,另外一个是svm_bi

10、nary_svc_probability函数中使用数值2。int *weight_label;/权重,元素个数由nr_weight决定double nu;没什么好说的,看代码中的注释,toodouble p;没什么好说的,看代码中的注释,threeint shrinking;指明训练过程是否使用缩减int probability;指明训练过程是否需要预报概率。/ 2.5 struct struct svm_modelstruct svm_modelsvm_parameter param;/ parameterint nr_class;/ number of classes, = 2 in re

11、gression/one class svmint l;/ total #SVsvm_node *SV;/ SVs (SVl)double *sv_coef;/ coefficients for SVs in decision functions (sv_coefn-1l)double *rho;/ constants in decision functions (rhon*(n-1)/2)double *probA; / pariwise probability informationdouble *probB;/ for classification onlyint *label;/ la

12、bel of each class (labeln)int *nSV;/ number of SVs for each class (nSVn)/ nSV0 + nSV1 + . + nSVn-1 = l/ XXXint free_sv;/ 1 if svm_model is created by svm_load_model/ 0 if svm_model is created by svm_train;结构体svm_model用于保存训练后的训练模型,当然原来的训练参数也必须保留。本来这个结构体应该是在svm.cpp中,为统一起见,一起描述。svm_parameter param;训练参数

13、,这里使用的是svm_param的实例,而不是指针。这样训练完成后,原来参数被完全保留,再去预报时,就不用担心下次训练会把参数冲掉int nr_class;类别数int l;支持向量数svm_node *SV;保存支持向量的指针,至于支持向量的内容,如果是从文件中读取,内容会额外保留;如果是直接训练得来,则保留在原来的训练集中。如果训练完成后需要预报,原来的训练集内存不可以释放。double *sv_coef;相当于判别函数中的alphadouble *rho;相当于判别函数中的bdouble *probA;pariwise probability informationdouble *pro

14、bB;int *label;label of each class (labeln)int *nSV;number of SVs for each class (nSVn)int free_sv;1 if svm_model is created by svm_load_model; 0 if svm_model is created by svm_train2.6 接口函数/以下接口函数设计得非常合理,最后一节详细说明/最主要的驱动函数,训练数据struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param);/用SVM做交叉验证void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号