SVM實(shí)驗(yàn)報(bào)告資料介紹_第1頁
SVM實(shí)驗(yàn)報(bào)告資料介紹_第2頁
SVM實(shí)驗(yàn)報(bào)告資料介紹_第3頁
SVM實(shí)驗(yàn)報(bào)告資料介紹_第4頁
SVM實(shí)驗(yàn)報(bào)告資料介紹_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

SVM分類算法數(shù)據(jù)源說明數(shù)據(jù)源說遠(yuǎn)和理解:采用的實(shí)驗(yàn)數(shù)據(jù)源為第6組:TheInsuranceCompanyBenchmark(COIL2000)TICDATA2000.txt:這個(gè)數(shù)據(jù)集用來訓(xùn)練和檢驗(yàn)預(yù)測(cè)模型,并且建立了一個(gè)5822個(gè)客戶的記錄的描述。每個(gè)記錄由86個(gè)屬性組成,包含社會(huì)人口數(shù)據(jù)(屬性1-43)和產(chǎn)品的所有關(guān)系(屬性44-86)。社會(huì)人口數(shù)據(jù)是由派生郵政編碼派生而來的,生活在具有相同郵政編碼地區(qū)的所有客戶都具有相同的社會(huì)人口屬性。第86個(gè)屬性:“大篷車:家庭移動(dòng)政策”,是我們的目標(biāo)變量。共有5822條記錄,根據(jù)要求,全部用來訓(xùn)練。TICEVAL2000.txt:這個(gè)數(shù)據(jù)集是需要預(yù)測(cè)(4000個(gè)客戶記錄)的數(shù)據(jù)集。它和TICDATA2000.txt它具有相同的格式,只是沒有最后一列的目標(biāo)記錄。我們只希望返回預(yù)測(cè)目標(biāo)的列表集,所有數(shù)據(jù)集都用制表符進(jìn)行分隔。共有4003(自己加了三條數(shù)據(jù)),根據(jù)要求,用來做預(yù)測(cè)。TICTGTS2000.txt:最終的目標(biāo)評(píng)估數(shù)據(jù)。這是一個(gè)實(shí)際情況下的目標(biāo)數(shù)據(jù),將與我們預(yù)測(cè)的結(jié)果進(jìn)行校驗(yàn)。我們的預(yù)測(cè)結(jié)果將放在result.txt文件中。數(shù)據(jù)集理解:本實(shí)驗(yàn)任務(wù)可以理解為分類問題,即分為2類,也就是數(shù)據(jù)源的第86列,可以分為0、1兩類。我們首先需要對(duì)TICDATA2000.txt進(jìn)行訓(xùn)練,生成model,再根據(jù)model進(jìn)行預(yù)測(cè)。數(shù)據(jù)清理代碼中需要對(duì)數(shù)據(jù)集進(jìn)行縮放的目的在于:A、避免一些特征值范圍過大而另一些特征值范圍過??;B、避免在訓(xùn)練時(shí)為了計(jì)算核函數(shù)而計(jì)算內(nèi)積的時(shí)候引起數(shù)值計(jì)算的困難。因此,通常將數(shù)據(jù)縮放到

[-1,1]

或者是

[0,1]

之間。數(shù)據(jù)挖掘的算法說明svm算法說明LIBSVM軟件包是臺(tái)灣大學(xué)林智仁(Chih-JenLin)博士等用C++實(shí)現(xiàn)的SVM庫,并且擁有matlab,perl等工具箱或者代碼,移植和使用都比較方便.它可以解決分類問題(包括C-SVC、n-SVC)、回歸問題(包括e-SVR、n-SVR)以及分布估計(jì)(one-class-SVM)等問題,提供了線性、多項(xiàng)式、徑向基和S形函數(shù)四種常用的核函數(shù)供選擇,可以有效地解決多類問題、交叉驗(yàn)證選擇參數(shù)、對(duì)不平衡樣本加權(quán)、多類問題的概率估計(jì)等。實(shí)現(xiàn)過程在源程序里面,主要由以下2個(gè)函數(shù)來實(shí)現(xiàn):

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

該函數(shù)用來做訓(xùn)練,參數(shù)prob,是svm_problem類型數(shù)據(jù),具體結(jié)構(gòu)定義如下:

structsvm_problem//存儲(chǔ)本次參加運(yùn)算的所有樣本(數(shù)據(jù)集),及其所屬類別。

{

intn;//記錄樣本總數(shù)

double*y;//指向樣本所屬類別的數(shù)組

structsvm_node**x;//指向一個(gè)存儲(chǔ)內(nèi)容為指針的數(shù)組

};

其中svm_node的結(jié)構(gòu)體定義如下:

structsvm_node//用來存儲(chǔ)輸入空間中的單個(gè)特征

{

intindex;//輸入空間序號(hào),假設(shè)輸入空間數(shù)為m

doublevalue;//該輸入空間的值

};

所以,prob也可以說是問題的指針,它指向樣本數(shù)據(jù)的類別和輸入向量,在內(nèi)存中的具體結(jié)構(gòu)圖如下:圖1.1LIBSVM訓(xùn)練時(shí),樣本數(shù)據(jù)在內(nèi)存中的存放結(jié)構(gòu)

只需在內(nèi)存中申請(qǐng)n*(m+1)*sizeof(structsvm_node)大小的空間,并在里面填入每個(gè)樣本的每個(gè)輸入空間的值,即可在程序中完成prob參數(shù)的設(shè)置。

參數(shù)param,是svm_parameter數(shù)據(jù)結(jié)構(gòu),具體結(jié)構(gòu)定義如下:

structsvm_parameter//訓(xùn)練參數(shù)

{

intsvm_type;//SVM類型,

intkernel_type;//核函數(shù)類型

intdegree;/*forpoly*/

doublegamma;/*forpoly/rbf/sigmoid*/

doublecoef0;/*forpoly/sigmoid*/

/*thesearefortrainingonly*/

doublecache_size;/*inMB制定訓(xùn)練所需要的內(nèi)存*/

doubleeps;/*stoppingcriteria*/

doubleC;/*forC_SVC,EPSILON_SVRandNU_SVR,懲罰因子*/

intnr_weight;/*forC_SVC權(quán)重的數(shù)目*/

int*weight_label;/*forC_SVC權(quán)重,元素個(gè)數(shù)由nr_weight決定*/

double*weight;/*forC_SVC*/

doublenu;/*forNU_SVC,ONE_CLASS,andNU_SVR*/

doublep;/*forEPSILON_SVR*/

intshrinking;/*usetheshrinkingheuristics指明訓(xùn)練過程是否使用壓縮*/

intprobability;/*doprobabilityestimates指明是否要做概率估計(jì)*/

}

其中,SVM類型和核函數(shù)類型如下:

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

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

只需申請(qǐng)一個(gè)svm_parameter結(jié)構(gòu)體,并按實(shí)際需要設(shè)定SVM類型、核函數(shù)和各種參數(shù)的值即可完成參數(shù)param的設(shè)置。

設(shè)定完這兩個(gè)參數(shù),就可以直接在程序中調(diào)用訓(xùn)練函數(shù)進(jìn)行訓(xùn)練了,該其函數(shù)返回一個(gè)structsvm_model*SVM模型的指針,可以使用svm_save_model(constchar*model_file_name,conststructsvm_model*model)函數(shù),把這個(gè)模型保存在磁盤中。至此,訓(xùn)練函數(shù)的移植已經(jīng)完成。

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

參數(shù)model,是一個(gè)SVM模型的指針,可以使用函數(shù)structsvm_model*svm_load_model(constchar*model_file_name),導(dǎo)入訓(xùn)練時(shí)保存好的SVM模型,此函數(shù)返回一個(gè)SVM模型的指針,可以直接賦值給變量model。

參數(shù)x,是conststructsvm_node結(jié)構(gòu)體的指針,本意是一個(gè)輸入空間的指針,但實(shí)際上,該函數(shù)執(zhí)行的時(shí)候,是從參數(shù)x處計(jì)算輸入空間,直到遇到單個(gè)樣本數(shù)據(jù)結(jié)束標(biāo)記-1才結(jié)束,也就是說,該函數(shù)運(yùn)算了單個(gè)樣本中的所有輸入空間數(shù)據(jù)。因此,在調(diào)用此函數(shù)時(shí),必須先把預(yù)測(cè)樣本的數(shù)據(jù)按圖3.4中的固定格式寫入內(nèi)存中。另外,該函數(shù)只能預(yù)測(cè)一個(gè)樣本的值,本文需要對(duì)圖像中的所有像數(shù)點(diǎn)預(yù)測(cè),就要使用for循環(huán)反復(fù)調(diào)用。

該函數(shù)返回一個(gè)double類型,指明被預(yù)測(cè)數(shù)據(jù)屬于哪個(gè)類。面對(duì)兩分類問題的時(shí)候,通常使用+1代表正樣本,即類1;-1代表負(fù)樣本,即類2。最后根據(jù)返回的double值就可以知道預(yù)測(cè)數(shù)據(jù)的類別了。算法源代碼及注釋說明需要在工程中添加頭文件svm.h和源文件svm.cpp自己編寫的源代碼(C++實(shí)現(xiàn))(共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;//設(shè)置參數(shù)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];//對(duì)應(yīng)的特征向量 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++;//測(cè)試正確的個(gè)數(shù) if(realvalue.at(i)==1) counter1++; } }//cout<<realvalue.size()<<endl;//目標(biāo)值為1的記錄測(cè)試真確的個(gè)數(shù) returncounter*1.0/realvalue.size();}intmain(){clock_tt1,t2,t3; cout<<"請(qǐng)稍等待..."<<endl; t1=clock(); train("ticdata2000.txt");//訓(xùn)練t2=clock(); predict("ticeval2000.txt");//預(yù)測(cè) t3=clock(); writeValue(predictvalue,"result.txt");//將預(yù)測(cè)值寫入到文件 doubleaccuracy=getAccuracy();//得到正確率cout<<"訓(xùn)練數(shù)據(jù)共:"<<trainNum<<"條記錄"<<endl; cout<<"測(cè)試數(shù)據(jù)共:"<<realvalue.size()<<"條記錄"<<endl; cout<<"訓(xùn)練的時(shí)間:"<<1.0*(t2-t1)/nTstTimes<<"ms"<<endl; cout<<"預(yù)測(cè)的時(shí)間:"<<1.0*(t3-t2)/nTstTimes<<"ms"<<endl;cout<<"測(cè)試正確率為:"<<accuracy*100<<"%"<<endl;return0;}算法獲得的模型1、模型說明改算法svm(支持向量機(jī))用兩個(gè)核心函數(shù),第一個(gè)是structsvm_model*svm_train(conststructsvm_problem*prob,conststructsvm_parameter*param),設(shè)定好參數(shù)之后,運(yùn)行改函數(shù),該函數(shù)返回一個(gè)structsvm_model*SVM模型的指針,可以使用svm_save_model(constchar*model_file_name,conststructsvm_model*model)函數(shù),把這個(gè)模型保存在磁盤中。第二個(gè)是doublesvm_predict(conststructsvm_model*model,conststructsvm_node*x);

參數(shù)model,是一個(gè)SVM模型的指針,可以使用函數(shù)structsvm_model*svm_load_model(constchar*model_file_name),導(dǎo)入訓(xùn)練時(shí)保存好的SVM模型,此函數(shù)返回一個(gè)SVM模型的指針,可以直接賦值給變量model。該函數(shù)返回一個(gè)double類型,指明被預(yù)測(cè)數(shù)據(jù)屬于哪個(gè)類。面對(duì)兩分類問題的時(shí)候,通常使用+1代表正樣本,即類1;-1代表負(fù)樣本,即類2。最后根據(jù)返回的double值就可以知道預(yù)測(cè)數(shù)據(jù)的類別了。2、查看模型我們可以查看源文中的model.txt文件。以下是部分內(nèi)容: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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論