




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年天津音樂學院招聘碩士及以上崗位筆試真題
- 醫療科研市場調研行業深度調研及發展項目商業計劃書
- 越南面餐館企業制定與實施新質生產力項目商業計劃書
- 作者互動平臺企業制定與實施新質生產力項目商業計劃書
- 補血水果茶企業制定與實施新質生產力項目商業計劃書
- 2025年兒童教育創新引擎:教育游戲化教學設計策略研究報告
- 2025甘肅國企蘭州能源投資集團蘭能投能源化工公司招聘34人筆試參考題庫附帶答案詳解
- 2025年棗莊光明電力服務有限責任公司招聘(約55人)筆試參考題庫附帶答案詳解
- 金屬基耐磨復合材料項目投資風險評估報告
- 2016年陜西高考理綜試題及答案
- 風力發電畢業設計
- GB∕T 27423-2019 合格評定 檢驗檢測服務風險管理指南
- 必威自動化Profibus網關配置相互模塊到STEP7詳細地址分配
- 高血壓危象急救和護理
- 企業財務通則
- 《新疆是個好地方》教學課件(共17p)
- 病理科規章制度(共42頁)
- 招標工作的合理化建議
- MBR系統運行技術手冊
- 皮膚管理顧客檔案表
- 零件加工檢驗標準
評論
0/150
提交評論