SVM实验报告资料介绍_第1页
SVM实验报告资料介绍_第2页
SVM实验报告资料介绍_第3页
SVM实验报告资料介绍_第4页
SVM实验报告资料介绍_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

SVM分类算法数据源说明数据源说远和理解:采用的实验数据源为第6组:TheInsuranceCompanyBenchmark(COIL2000)TICDATA2000.txt:这个数据集用来训练和检验预测模型,并且建立了一个5822个客户的记录的描述。每个记录由86个属性组成,包含社会人口数据(属性1-43)和产品的所有关系(属性44-86)。社会人口数据是由派生邮政编码派生而来的,生活在具有相同邮政编码地区的所有客户都具有相同的社会人口属性。第86个属性:“大篷车:家庭移动政策”,是我们的目标变量。共有5822条记录,根据要求,全部用来训练。TICEVAL2000.txt:这个数据集是需要预测(4000个客户记录)的数据集。它和TICDATA2000.txt它具有相同的格式,只是没有最后一列的目标记录。我们只希望返回预测目标的列表集,所有数据集都用制表符进行分隔。共有4003(自己加了三条数据),根据要求,用来做预测。TICTGTS2000.txt:最终的目标评估数据。这是一个实际情况下的目标数据,将与我们预测的结果进行校验。我们的预测结果将放在result.txt文件中。数据集理解:本实验任务可以理解为分类问题,即分为2类,也就是数据源的第86列,可以分为0、1两类。我们首先需要对TICDATA2000.txt进行训练,生成model,再根据model进行预测。数据清理代码中需要对数据集进行缩放的目的在于:A、避免一些特征值范围过大而另一些特征值范围过小;B、避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。因此,通常将数据缩放到

[-1,1]

或者是

[0,1]

之间。数据挖掘的算法说明svm算法说明LIBSVM软件包是台湾大学林智仁(Chih-JenLin)博士等用C++实现的SVM库,并且拥有matlab,perl等工具箱或者代码,移植和使用都比较方便.它可以解决分类问题(包括C-SVC、n-SVC)、回归问题(包括e-SVR、n-SVR)以及分布估计(one-class-SVM)等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。实现过程在源程序里面,主要由以下2个函数来实现:

(1)structsvm_model*svm_train(conststructsvm_problem*prob,conststructsvm_parameter*param);

该函数用来做训练,参数prob,是svm_problem类型数据,具体结构定义如下:

structsvm_problem//存储本次参加运算的所有样本(数据集),及其所属类别。

{

intn;//记录样本总数

double*y;//指向样本所属类别的数组

structsvm_node**x;//指向一个存储内容为指针的数组

};

其中svm_node的结构体定义如下:

structsvm_node//用来存储输入空间中的单个特征

{

intindex;//输入空间序号,假设输入空间数为m

doublevalue;//该输入空间的值

};

所以,prob也可以说是问题的指针,它指向样本数据的类别和输入向量,在内存中的具体结构图如下:图1.1LIBSVM训练时,样本数据在内存中的存放结构

只需在内存中申请n*(m+1)*sizeof(structsvm_node)大小的空间,并在里面填入每个样本的每个输入空间的值,即可在程序中完成prob参数的设置。

参数param,是svm_parameter数据结构,具体结构定义如下:

structsvm_parameter//训练参数

{

intsvm_type;//SVM类型,

intkernel_type;//核函数类型

intdegree;/*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权重,元素个数由nr_weight决定*/

double*weight;/*forC_SVC*/

doublenu;/*forNU_SVC,ONE_CLASS,andNU_SVR*/

doublep;/*forEPSILON_SVR*/

intshrinking;/*usetheshrinkingheuristics指明训练过程是否使用压缩*/

intprobability;/*doprobabilityestimates指明是否要做概率估计*/

}

其中,SVM类型和核函数类型如下:

enum{C_SVC,NU_SVC,ONE_CLASS,EPSILON_SVR,NU_SVR};/*svm_type*/

enum{LINEAR,POLY,RBF,SIGMOID,PRECOMPUTED};/*kernel_type*/

只需申请一个svm_parameter结构体,并按实际需要设定SVM类型、核函数和各种参数的值即可完成参数param的设置。

设定完这两个参数,就可以直接在程序中调用训练函数进行训练了,该其函数返回一个structsvm_model*SVM模型的指针,可以使用svm_save_model(constchar*model_file_name,conststructsvm_model*model)函数,把这个模型保存在磁盘中。至此,训练函数的移植已经完成。

(2)doublesvm_predict(conststructsvm_model*model,conststructsvm_node*x);

参数model,是一个SVM模型的指针,可以使用函数structsvm_model*svm_load_model(constchar*model_file_name),导入训练时保存好的SVM模型,此函数返回一个SVM模型的指针,可以直接赋值给变量model。

参数x,是conststructsvm_node结构体的指针,本意是一个输入空间的指针,但实际上,该函数执行的时候,是从参数x处计算输入空间,直到遇到单个样本数据结束标记-1才结束,也就是说,该函数运算了单个样本中的所有输入空间数据。因此,在调用此函数时,必须先把预测样本的数据按图3.4中的固定格式写入内存中。另外,该函数只能预测一个样本的值,本文需要对图像中的所有像数点预测,就要使用for循环反复调用。

该函数返回一个double类型,指明被预测数据属于哪个类。面对两分类问题的时候,通常使用+1代表正样本,即类1;-1代表负样本,即类2。最后根据返回的double值就可以知道预测数据的类别了。算法源代码及注释说明需要在工程中添加头文件svm.h和源文件svm.cpp自己编写的源代码(C++实现)(共230行):#include"svm.h"#include<iostream>#include<list>#include<iterator>#include<vector>#include<string>#include<ctime>usingnamespacestd;#ifdefWIN32#pragmawarning(disable:45144786)#endifsvm_parameterparam;svm_problemprob;svm_model*svmModel;list<svm_node*>xList;list<double>yList;constintMAX=10;constintnTstTimes=10;vector<int>predictvalue;vector<int>realvalue;inttrainNum=0;//设置参数voidsetParam(){param.svm_type=C_SVC; param.kernel_type=RBF; param.degree=3; param.gamma=0.5; param.coef0=0; param.nu=0.5; param.cache_size=40; param.C=500; param.eps=1e-3; param.p=0.1; param.shrinking=1; //bability=0; param.nr_weight=0; param.weight=NULL;param.weight_label=NULL;}voidtrain(char*filePath){ FILE*fp; intk; intline=0; inttemp; if((fp=fopen(filePath,"rt"))==NULL) return; while(1) { svm_node*features=newsvm_node[85+1]; for(k=0;k<85;k++) { fscanf(fp,"%d",&temp); features[k].index=k+1; features[k].value=temp/(MAX*1.0); } features[85].index=-1; fscanf(fp,"%d",&temp); xList.push_back(features); yList.push_back(temp); line++; trainNum=line; if(feof(fp)) break; } setParam(); prob.l=line; prob.x=newsvm_node*[prob.l];//对应的特征向量 prob.y=newdouble[prob.l];//放的是值 intindex=0; while(!xList.empty()) { prob.x[index]=xList.front(); prob.y[index]=yList.front(); xList.pop_front(); yList.pop_front(); index++; } //std::cout<<prob.l<<"listend\n"; svmModel=svm_train(&prob,¶m); //std::cout<<"\n"<<"over\n"; //保存model svm_save_model("model.txt",svmModel); //释放空间 deleteprob.y; delete[]prob.x; svm_free_and_destroy_model(&svmModel);}voidpredict(char*filePath){svm_model*svmModel=svm_load_model("model.txt"); FILE*fp; intline=0; inttemp; if((fp=fopen(filePath,"rt"))==NULL) return; while(1) { svm_node*input=newsvm_node[85+1]; for(intk=0;k<85;k++) { fscanf(fp,"%d",&temp); input[k].index=k+1; input[k].value=temp/(MAX*1.0); } input[85].index=-1; intpredictValue=svm_predict(svmModel,input); predictvalue.push_back(predictValue); cout<<predictValue<<endl; if(feof(fp)) break; }}voidwriteValue(vector<int>&v,stringfilePath){ FILE*pfile=fopen("filePath","wb"); vector<int>::iteratoriter=v.begin(); char*c=newchar[2]; for(;iter!=v.end();++iter) { c[1]='\n'; if(*iter==0) c[0]='0'; else c[0]='1';fwrite(c,1,2,pfile); } fclose(pfile);deletec;}boolgetRealValue(){FILE*fp; inttemp; if((fp=fopen("tictgts2000.txt","rt"))==NULL) returnfalse; while(1) { fscanf(fp,"%d",&temp); realvalue.push_back(temp); if(feof(fp)) break; } returntrue;}doublegetAccuracy(){if(!getRealValue()) return0.0; intcounter=0; intcounter1=0; for(inti=0;i<realvalue.size();i++) { if(realvalue.at(i)==predictvalue.at(i)) { counter++;//测试正确的个数 if(realvalue.at(i)==1) counter1++; } }//cout<<realvalue.size()<<endl;//目标值为1的记录测试真确的个数 returncounter*1.0/realvalue.size();}intmain(){clock_tt1,t2,t3; cout<<"请稍等待..."<<endl; t1=clock(); train("ticdata2000.txt");//训练t2=clock(); predict("ticeval2000.txt");//预测 t3=clock(); writeValue(predictvalue,"result.txt");//将预测值写入到文件 doubleaccuracy=getAccuracy();//得到正确率cout<<"训练数据共:"<<trainNum<<"条记录"<<endl; cout<<"测试数据共:"<<realvalue.size()<<"条记录"<<endl; cout<<"训练的时间:"<<1.0*(t2-t1)/nTstTimes<<"ms"<<endl; cout<<"预测的时间:"<<1.0*(t3-t2)/nTstTimes<<"ms"<<endl;cout<<"测试正确率为:"<<accuracy*100<<"%"<<endl;return0;}算法获得的模型1、模型说明改算法svm(支持向量机)用两个核心函数,第一个是structsvm_model*svm_train(conststructsvm_problem*prob,conststructsvm_parameter*param),设定好参数之后,运行改函数,该函数返回一个structsvm_model*SVM模型的指针,可以使用svm_save_model(constchar*model_file_name,conststructsvm_model*model)函数,把这个模型保存在磁盘中。第二个是doublesvm_predict(conststructsvm_model*model,conststructsvm_node*x);

参数model,是一个SVM模型的指针,可以使用函数structsvm_model*svm_load_model(constchar*model_file_name),导入训练时保存好的SVM模型,此函数返回一个SVM模型的指针,可以直接赋值给变量model。该函数返回一个double类型,指明被预测数据属于哪个类。面对两分类问题的时候,通常使用+1代表正样本,即类1;-1代表负样本,即类2。最后根据返回的double值就可以知道预测数据的类别了。2、查看模型我们可以查看源文中的model.txt文件。以下是部分内容:svm_typec_svckernel_typerbfgamma0.5nr_class2total_sv1333rho-2.12543label01nr_sv995338SV10.736583147298251:3.92:0.23:0.34:0.25:0.96:0.27:0.28:09:0.510:0.711:0.212:013:014:0.315:0.616:017:0.418:0.519:020:021:022:0.423:0.124:0.525:026:0.127:0.428:0.529:030:0.631:0.332:0.833:034:0.135:0.936:037:0.438:0.339:0.340:041:042:0.343:0.544:045:046:047:0.648:049:050:051:052:053:054:055:056:057:058:059:060:061:062:063:064:065:066:067:068:0.169:070:071:072:073:074:075:076:077:078:079:080:081:082:083:084:085:08.406931039506561:1.12:0.23:0.34:0.35:0.36:0.37:0.58:09:0.210:0.711:012:0.213:0.214:0.215:0.616:017:0.418:0.519:0.220:021:022:0.323:0.324:0.325:0.126:0.227:0.128:0.429:0.230:031:0.932:0.633:0.134:0.235:0.636:0.337:0.238:0.339:0.340:0.141:042:0.443:0.744:0.245:046:047:048:049:050:051:052:053:054:055:056:057:058:059:0.360:061

温馨提示

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

评论

0/150

提交评论