您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > LibSVM-2.6+程序代码注释
上海交通大学模式分析与机器智能实验室LibSVM-2.6程序代码注释上海交通大学模式分析与机器智能实验室我不经心地,服下你调好的毒我知道今后我将万劫不复但是你的红唇仍让我屈服四月的樱花火红满天我和你的梦,却要一以何处去缱绻?虽然人间的情爱万万千千世上已有太多崩毁的誓言七个黑夜,七个白天我为你写下的歌,彩绘的纸笺却只能随着晚风飘在大海的岸边我仍愿服下你精心为我调好的毒从你那深情的吻吞下我与你在人间昀后的流光万千辗转朱颜……上海交通大学模式分析与机器智能实验室第一节:SVM.h文件structsvm_node{intindex;doublevalue;};structsvm_node用来存储单一向量中的单个特征,例如:向量x1={0.002,0.345,4,5.677};那么用structsvm_node来存储时就使用一个包含5个svm_node的数组来存储此4维向量,内存映象如下:1234-10.0020.3454.0005.677空其中如果value为0.00,该特征将不会被存储,其中(特征3)被跳过:1245-10.0020.3454.0005.677空0.00不保留的好处在于,做点乘的时候,可以加快计算速度,对于稀疏矩阵,更能充分体现这种数据结构的优势。但做归一化时,操作就比较麻烦了。(类型转换不再说明)structsvm_problem{intl;double*y;structsvm_node**x;};structsvm_problem存储本次参加运算的所有样本(数据集),及其所属类别。在某些数据挖掘实现中,常用DataSet来实现。intl;记录样本总数double*y;指向样本所属类别的数组。在多类问题中,因为使用了one-agianst-one方法,可能原始样本中y[i]的内容是1.0,2.0,3.0,…,但参与多类计算时,参加分类的两类所对应的y[i]内容是+1,和-1。Structsvm_node**x;指向一个存储内容为指针的数组;如下图,昀右边的四个长条格同上表,存储三维数据。(黑边框的是昀主要的部分)Y[3]Y[2]Y[1]Y[0]L=4Y*X**上海交通大学模式分析与机器智能实验室这样的数据结构有一个直接的好处,可以用x[i][j]来访问其中的某一元素(如果value为0.00的也全部保留的话)私下认为其中有一个败笔,就是把svm_node*x_space放到结构外面去了。enum{C_SVC,NU_SVC,ONE_CLASS,EPSILON_SVR,NU_SVR};/*svm_type*/enum{LINEAR,POLY,RBF,SIGMOID};/*kernel_type*/structsvm_parameter{intsvm_type;//SVM类型,见前enumintkernel_type;//核函数doubledegree;/*forpoly*/doublegamma;/*forpoly/rbf/sigmoid*/doublecoef0;/*forpoly/sigmoid*//*thesearefortrainingonly*/doublecache_size;/*inMB*/doubleeps;/*stoppingcriteria*/doubleC;/*forC_SVC,EPSILON_SVRandNU_SVR*/intnr_weight;/*forC_SVC*/int*weight_label;/*forC_SVC*/double*weight;/*forC_SVC*/doublenu;/*forNU_SVC,ONE_CLASS,andNU_SVR*/doublep;/*forEPSILON_SVR*/intshrinking;/*usetheshrinkingheuristics*/intprobability;/*doprobabilityestimates*/};部分参数解释,(附核函数)1、jTijixxxxK=),(2、0,)(),(+=γγdjTijirxxxxK3、0),exp(),(2−−=γγjijixxxxK4、)tanh(),(rxxxxKjTiji+=γdoubledegree;//就是2式中的ddoublegamma;//就是2,3,4式中的gammadoublecoef0;//就是2,4式中的rdoublecache_size;/*inMB*/制定训练所需要的内存,默认是40M,LibSVM2.5中是4M,所以自己做开发选LibSVM2.5还是不错的!doubleeps;见参考文献[1]中式3.13doubleC;//没什么好说的,惩罚因子,越大训练的模型越那个…,当然耗的时间越多上海交通大学模式分析与机器智能实验室intnr_weight;//权重的数目,目前在实例代码中只有两个值,一个是默认0,另外一个是svm_binary_svc_probability函数中使用数值2。int*weight_label;//权重,元素个数由nr_weight决定.doublenu;//没什么好说的,toodoublep;//没什么好说的,threeintshrinking;//指明训练过程是否使用压缩。intprobability;//新增,指明是否要做概率估计structsvm_model{svm_parameterparam;//parameterintnr_class;//numberofclasses,=2inregression/oneclasssvmintl;//total#SVsvm_node**SV;//SVs(SV[l])double**sv_coef;//coefficientsforSVsindecisionfunctions(sv_coef[n-1][l])double*rho;//constantsindecisionfunctions(rho[n*(n-1)/2])double*probA;//pariwiseprobabilityinformationdouble*probB;//forclassificationonlyint*label;//labelofeachclass(label[n])int*nSV;//numberofSVsforeachclass(nSV[n])//nSV[0]+nSV[1]+...+nSV[n-1]=l//XXXintfree_sv;//1ifsvm_modeliscreatedbysvm_load_model//0ifsvm_modeliscreatedbysvm_train};结构体svm_model用于保存训练后的训练模型,当然原来的训练参数也必须保留。svm_parameterparam;//训练参数intnr_class;//类别数intl;//支持向量数svm_node**SV;//保存支持向量的指针,至于支持向量的内容,如果是从文件中读取,内容会额外保留;如果是直接训练得来,则保留在原来的训练集中。如果训练完成后需要预报,原来的训练集内存不可以释放。double**sv_coef;//相当于判别函数中的alphadouble*rho;//相当于判别函数中的bdouble*probA;//pariwiseprobabilityinformationdouble*probB;//均为新增函数int*label;//labelofeachclass(label[n])int*nSV;//numberofSVsforeachclass(nSV[n])intfree_sv;//见svm_node**SV的注释上海交通大学模式分析与机器智能实验室//以下接口函数设计得非常合理,昀后一节详细说明//昀主要的驱动函数,训练数据structsvm_model*svm_train(conststructsvm_problem*prob,conststructsvm_parameter*param);//用SVM做交叉验证voidsvm_cross_validation(conststructsvm_problem*prob,conststructsvm_parameter*param,intnr_fold,double*target);//保存训练好的模型到文件intsvm_save_model(constchar*model_file_name,conststructsvm_model*model);//从文件中把训练好的模型读到内存中structsvm_model*svm_load_model(constchar*model_file_name);//intsvm_get_svm_type(conststructsvm_model*model);//得到数据集的类别数(必须经过训练得到模型后才可以用)intsvm_get_nr_class(conststructsvm_model*model);//得到数据集的类别标号(必须经过训练得到模型后才可以用)voidsvm_get_labels(conststructsvm_model*model,int*label);//LibSvm2.6新增函数doublesvm_get_svr_probability(conststructsvm_model*model);//用训练好的模型预报样本的值,输出结果保留到数组中。(并非接口函数)voidsvm_predict_values(conststructsvm_model*model,conststructsvm_node*x,double*dec_values);//预报某一样本的值doublesvm_predict(conststructsvm_model*model,conststructsvm_node*x);//LibSvm2.6新增函数doublesvm_predict_probability(conststructsvm_model*model,conststructsvm_node*x,double*prob_estimates);//消除训练的模型,释放资源voidsvm_destroy_model(structsvm_model*model);//LibSvm2.6新增函数voidsvm_destroy_param(structsvm_parameter*param);//检查输入的参数,保证后面的训练能正常进行。上海交通大学模式分析与机器智能实验室constchar*svm_check_parameter(conststructsvm_problem*prob,conststructsvm_parameter*param);//LibSvm2.6新增函数intsvm_check_probability_model(conststructsvm_model*model);上海交通大学模式分析与机器智能实验室第二节:SVM.cpp文件.头文件:从整个.cpp文件来看,感觉有些头文件是多余的,不知何故,反正多包含头文件不会犯错。后面的typedef,特别是typedeffloatQfloat,是为了方便控制内存存储的精度。#includemath.h#includestdio.h#includestdlib.h#includectype.h#includefloat.h#includestring.h#includestdarg.h#includesvm.htypedeffloatQfloat;typedefsignedcharschar;//.以下是定义的几个主要的模板,主要是为了比较大小,交换数据和完全复制数据。Min()和Max()在math.h中提供了相应的函数,这里的处理,估计是为了使函数内联,执行速度会相对快一些,而且不同的数据类型,存储方式不同,使用模板会更有针对性,也从另外一方面提高程序性能。#ifndefmintemplatecla
本文标题:LibSVM-2.6+程序代码注释
链接地址:https://www.777doc.com/doc-5856902 .html