libSVM分类小例C++.doc_第1页
libSVM分类小例C++.doc_第2页
libSVM分类小例C++.doc_第3页
libSVM分类小例C++.doc_第4页
libSVM分类小例C++.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用libSVM求解分类问题的C+小例1. libSVM简介训练模型的结构体struct svm_problem /储存参加计算的所有样本int l; /记录样本总数double *y; /指向样本类别的组数struct svm_node *x;/数据样本;当样本类别事先已经被告知时,可以通过数字来给样本数据进行标识(如果是两类通常以1与-1来表示)。如果不清楚样本类别可以用样本个数编号来设置,这时候分类的准确率也就无法判定了。数据样本是一个二维数组,其中每个单元格储存的是一个svm_node,y与样本数据的对应关系为:数据节点的结构体struct svm_node /储存单一向量的单个特征int index; /索引double value; /值;如果需要储存向量X=(1, 121, 12321, 121, 1),就可以使用6个svm_node来保存,内存映像为:index12345-1value1121123211211NULL注意:向量是以索引值为-1的元素为结束标志位的。如果没有标志位将导致程序崩溃。SVM模型类型枚举enum C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR ;u C_SVC:C表示惩罚因子,C越大表示对错误分类的惩罚越大u NU_SVC:和C_SVC相同。u ONE_CLASS:不需要类标号,用于支持向量的密度估计和聚类.u EPSILON_SVR:-不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域,即-带。u NU_SVR:由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。注意:C_SVC与NU_SVC其实采用的模型相同,但是它们的参数C的范围不同C_SVC采用的是0到正无穷,NU_SVC是0,1。核函数类型枚举enum LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED ; u LINEAR:线性核函数(linear kernel)u POLY:多项式核函数(ploynomial kernel)u RBF:径向机核函数(radical basis function)u SIGMOID: 神经元的非线性作用函数核函数(Sigmoid tanh)u PRECOMPUTED:用户自定义核函数计算模型参数结构体struct svm_parameterint svm_type; /支持向量机模型类型int kernel_type; /核函数类型int degree;/* 使用于POLY模型 */double gamma;/* for poly/rbf/sigmoid */double coef0;/* for poly/sigmoid */* these are for training only */double cache_size; /* 缓存块大小(MB) */double eps;/* 终止条件(默认0.001) */double C;/*惩罚因子 for 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;/*指明训练过程是否使用压缩 */int probability; /*指明是否要做概率估计*/;结构体svm_model用于保存训练后的训练模型,当然原来的训练参数也必须保留。struct svm_modelstruct svm_parameter param;/*训练参数 */int nr_class;/*类别数, = 2 in regression/one class svm */int l;/*支持向量数 */struct svm_node *SV;/*支持向量的指针 */double *sv_coef;/*相当于判别函数中的alpha */double *rho;/*相当于判别函数中的b */double *probA;/* pariwise probability information */double *probB; /* for classification only */int *label;/* label of each class (labelk) */int *nSV;/* number of SVs for each class (nSVk) */ /* nSV0 + nSV1 + . + nSVk-1 = l */int free_sv;/* 1 if svm_model is created by svm_load_model*/* 0 if svm_model is created by svm_train */;2. 程序代码实现这里定义SVMExample类,类主要成员变量为:struct svm_parameter param; /模型参数struct svm_problem prob;/struct svm_model *model; /struct svm_node *x_space; /构造函数构造函数里主要进行参数的初始化,和基本函数的调用param.svm_type = C_SVC;param.kernel_type = LINEAR;param.degree = 3;param.gamma = 0;/ 1/num_featuresparam.coef0 = 0;param.nu = 0.5;param.cache_size = 1;/缓存块大小param.C = 1;param.eps = 1e-3;param.p = 0.1;param.shrinking = 1;bability = 0;param.nr_weight = 0;param.weight_label = NULL;param.weight = NULL;cross_validation = 0;核函数的选取直接影响到分类的结果,如何正确选取核函数就需要使用者对数据的特性有所了解,根据实际情况,这里的核函数选用的是线性的。成员函数一:初始化样本数据样本选取是学生的身高和体重:男1:身高:190cm,体重:70kg;男2:身高:180cm,体重:80kg;女1:身高:161cm,体重:80kg;女2:身高:161cm,体重:47kg;这里由于事先已经知道样本有男女类别之分,所以设置男生标签为-1,女生标签为1,相对于程序中的y值。void SVMExample:initliazeData()struct svm_node *_node = Malloc(struct svm_node*, 4);x_space = Malloc(svm_node, 3);x_space0.index = 1;x_space0.value = 190;x_space1.index = 2;x_space1.value = 70;x_space2.index = -1;_node0 = x_space;x_space = Malloc(svm_node, 3);x_space0.index = 1;x_space0.value = 180;x_space1.index = 2;x_space1.value = 80;x_space2.index = -1;_node1 = x_space;x_space = Malloc(svm_node, 3);x_space0.index = 1;x_space0.value = 161;x_space1.index = 2;x_space1.value = 45;x_space2.index = -1;_node2 = x_space;x_space = Malloc(svm_node, 3);x_space0.index = 1;x_space0.value = 163;x_space1.index = 2;x_space1.value = 47;x_space2.index = -1;_node3 = x_space;double *y1 = Malloc(double, 4);y10 = -1;y11 = -1;y12 = 1;y13 = 1;prob.l = 4;prob.x = _node;prob.y = y1;成员函数二:训练样本数据,得出模型void SVMExample:analysisData()const char *error_msg;error_msg = svm_check_parameter(&prob,¶m);if(error_msg)fprintf(stderr, nerror:%sn, error_msg);exit(1);/如果有必要可以进行交叉性检验/*if(cross_validation)do_cross_validation();*/model = svm_train(&prob, ¶m);成员函数三:预测数据预测数据1:身高180cm,体重85kg;预测数据2:身高161cm,体重50kg;void SVMExample:displayResult()/进行预报struct svm_node *node1 = Malloc(svm_node, 3);node10.index = 1;node10.value = 180;node11.index = 2;node11.value = 85;node12.index = -1;double r1 = svm_predict(model, node1);printf(预测值r1:%fn, r1);free(node1);struct svm_node *node2 = Malloc(svm_node, 3);n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论