SVM.docx
- 文档编号:27608706
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:100
- 大小:36.72KB
SVM.docx
《SVM.docx》由会员分享,可在线阅读,更多相关《SVM.docx(100页珍藏版)》请在冰豆网上搜索。
SVM
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//IMPORTANT:
READBEFOREDOWNLOADING,COPYING,INSTALLINGORUSING.
//
//Bydownloading,copying,installingorusingthesoftwareyouagreetothislicense.
//Ifyoudonotagreetothislicense,donotdownload,install,
//copyorusethesoftware.
//
//
//IntelLicenseAgreement
//
//Copyright(C)2000,IntelCorporation,allrightsreserved.
//Thirdpartycopyrightsarepropertyoftheirrespectiveowners.
//
//Redistributionanduseinsourceandbinaryforms,withorwithoutmodification,
//arepermittedprovidedthatthefollowingconditionsaremet:
//
//*Redistribution'sofsourcecodemustretaintheabovecopyrightnotice,
//thislistofconditionsandthefollowingdisclaimer.
//
//*Redistribution'sinbinaryformmustreproducetheabovecopyrightnotice,
//thislistofconditionsandthefollowingdisclaimerinthedocumentation
//and/orothermaterialsprovidedwiththedistribution.
//
//*ThenameofIntelCorporationmaynotbeusedtoendorseorpromoteproducts
//derivedfromthissoftwarewithoutspecificpriorwrittenpermission.
//
//Thissoftwareisprovidedbythecopyrightholdersandcontributors"asis"and
//anyexpressorimpliedwarranties,including,butnotlimitedto,theimplied
//warrantiesofmerchantabilityandfitnessforaparticularpurposearedisclaimed.
//InnoeventshalltheIntelCorporationorcontributorsbeliableforanydirect,
//indirect,incidental,special,exemplary,orconsequentialdamages
//(including,butnotlimitedto,procurementofsubstitutegoodsorservices;
//lossofuse,data,orprofits;orbusinessinterruption)howevercaused
//andonanytheoryofliability,whetherincontract,strictliability,
//ortort(includingnegligenceorotherwise)arisinginanywayoutof
//theuseofthissoftware,evenifadvisedofthepossibilityofsuchdamage.
//
//M*/
#include"precomp.hpp"
/****************************************************************************************\
COPYRIGHTNOTICE
----------------
Thecodehasbeenderivedfromlibsvmlibrary(version2.6)
(http:
//www.csie.ntu.edu.tw/~cjlin/libsvm).
Hereistheorignalcopyright:
------------------------------------------------------------------------------------------
Copyright(c)2000-2003Chih-ChungChangandChih-JenLin
Allrightsreserved.
Redistributionanduseinsourceandbinaryforms,withorwithout
modification,arepermittedprovidedthatthefollowingconditions
aremet:
1.Redistributionsofsourcecodemustretaintheabovecopyright
notice,thislistofconditionsandthefollowingdisclaimer.
2.Redistributionsinbinaryformmustreproducetheabovecopyright
notice,thislistofconditionsandthefollowingdisclaimerinthe
documentationand/orothermaterialsprovidedwiththedistribution.
3.Neithernameofcopyrightholdersnorthenamesofitscontributors
maybeusedtoendorseorpromoteproductsderivedfromthissoftware
withoutspecificpriorwrittenpermission.
THISSOFTWAREISPROVIDEDBYTHECOPYRIGHTHOLDERSANDCONTRIBUTORS
``ASIS''ANDANYEXPRESSORIMPLIEDWARRANTIES,INCLUDING,BUTNOT
LIMITEDTO,THEIMPLIEDWARRANTIESOFMERCHANTABILITYANDFITNESSFOR
APARTICULARPURPOSEAREDISCLAIMED.INNOEVENTSHALLTHEREGENTSOR
CONTRIBUTORSBELIABLEFORANYDIRECT,INDIRECT,INCIDENTAL,SPECIAL,
EXEMPLARY,ORCONSEQUENTIALDAMAGES(INCLUDING,BUTNOTLIMITEDTO,
PROCUREMENTOFSUBSTITUTEGOODSORSERVICES;LOSSOFUSE,DATA,OR
PROFITS;ORBUSINESSINTERRUPTION)HOWEVERCAUSEDANDONANYTHEORYOF
LIABILITY,WHETHERINCONTRACT,STRICTLIABILITY,ORTORT(INCLUDING
NEGLIGENCEOROTHERWISE)ARISINGINANYWAYOUTOFTHEUSEOFTHIS
SOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGE.
\****************************************************************************************/
usingnamespacecv;
#defineCV_SVM_MIN_CACHE_SIZE(40<<20)/*40Mb*/
#include
#include
#if1
typedeffloatQfloat;
#defineQFLOAT_TYPECV_32F
#else
typedefdoubleQfloat;
#defineQFLOAT_TYPECV_64F
#endif
//ParamGrid
boolCvParamGrid:
:
check()const
{
boolok=false;
CV_FUNCNAME("CvParamGrid:
:
check");
__BEGIN__;
if(min_val>max_val)
CV_ERROR(CV_StsBadArg,"Lowerboundofthegridmustbelessthentheupperone");
if(min_val CV_ERROR(CV_StsBadArg,"Lowerboundofthegridmustbepositive"); if(step<1.+FLT_EPSILON) CV_ERROR(CV_StsBadArg,"Gridstepmustgreaterthen1"); ok=true; __END__; returnok; } CvParamGridCvSVM: : get_default_grid(intparam_id) { CvParamGridgrid; if(param_id==CvSVM: : C) { grid.min_val=0.1; grid.max_val=500; grid.step=5;//totaliterations=5 } elseif(param_id==CvSVM: : GAMMA) { grid.min_val=1e-5; grid.max_val=0.6; grid.step=15;//totaliterations=4 } elseif(param_id==CvSVM: : P) { grid.min_val=0.01; grid.max_val=100; grid.step=7;//totaliterations=4 } elseif(param_id==CvSVM: : NU) { grid.min_val=0.01; grid.max_val=0.2; grid.step=3;//totaliterations=3 } elseif(param_id==CvSVM: : COEF) { grid.min_val=0.1; grid.max_val=300; grid.step=14;//totaliterations=3 } elseif(param_id==CvSVM: : DEGREE) { grid.min_val=0.01; grid.max_val=4; grid.step=7;//totaliterations=3 } else cvError(CV_StsBadArg,"CvSVM: : get_default_grid","Invalidtypeofparameter" "(useoneofCvSVM: : C,CvSVM: : GAMMAetal.)",__FILE__,__LINE__); returngrid; } //SVMtrainingparameters CvSVMParams: : CvSVMParams(): svm_type(CvSVM: : C_SVC),kernel_type(CvSVM: : RBF),degree(0), gamma (1),coef0(0),C (1),nu(0),p(0),class_weights(0) { term_crit=cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,1000,FLT_EPSILON); } CvSVMParams: : CvSVMParams(int_svm_type,int_kernel_type, double_degree,double_gamma,double_coef0, double_Con,double_nu,double_p, CvMat*_class_weights,CvTermCriteria_term_crit): svm_type(_svm_type),kernel_type(_kernel_type), degree(_degree),gamma(_gamma),coef0(_coef0), C(_Con),nu(_nu),p(_p),class_weights(_class_weights),term_crit(_term_crit) { } ///////////////////////////////////////SVMkernel/////////////////////////////////////// CvSVMKernel: : CvSVMKernel() { clear(); } voidCvSVMKernel: : clear() { params=0; calc_func=0; } CvSVMKernel: : ~CvSVMKernel() { } CvSVMKernel: : CvSVMKernel(constCvSVMParams*_params,Calc_calc_func) { clear(); create(_params,_calc_func); } boolCvSVMKernel: : create(constCvSVMParams*_params,Calc_calc_func) { clear(); params=_params; calc_func=_calc_func; if(! calc_func) calc_func=params->kernel_type==CvSVM: : RBF? &CvSVMKernel: : calc_rbf: params->kernel_type==CvSVM: : POLY? &CvSVMKernel: : calc_poly: params->kernel_type==CvSVM: : SIGMOID? &CvSVMKernel: : calc_sigmoid: &CvSVMKernel: : calc_linear; returntrue; } voidCvSVMKernel: : calc_non_rbf_base(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results, doublealpha,doublebeta) { intj,k; for(j=0;j { constfloat*sample=vecs[j]; doubles=0; for(k=0;k<=var_count-4;k+=4) s+=sample[k]*another[k]+sample[k+1]*another[k+1]+ sample[k+2]*another[k+2]+sample[k+3]*another[k+3]; for(;k s+=sample[k]*another[k]; results[j]=(Qfloat)(s*alpha+beta); } } voidCvSVMKernel: : calc_linear(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results) { calc_non_rbf_base(vcount,var_count,vecs,another,results,1,0); } voidCvSVMKernel: : calc_poly(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results) { CvMatR=cvMat(1,vcount,QFLOAT_TYPE,results); calc_non_rbf_base(vcount,var_count,vecs,another,results,params->gamma,params->coef0); if(vcount>0) cvPow(&R,&R,params->degree); } voidCvSVMKernel: : calc_sigmoid(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results) { intj; calc_non_rbf_base(vcount,var_count,vecs,another,results, -2*params->gamma,-2*params->coef0); //TODO: speedupthis for(j=0;j { Qfloatt=results[j]; doublee=exp(-fabs(t)); if(t>0) results[j]=(Qfloat)((1.-e)/(1.+e)); else results[j]=(Qfloat)((e-1.)/(e+1.)); } } voidCvSVMKernel: : calc_rbf(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results) { CvMatR=cvMat(1,vcount,QFLOAT_TYPE,results); doublegamma=-params->gamma; intj,k; for(j=0;j { constfloat*sample=vecs[j]; doubles=0; for(k=0;k<=var_count-4;k+=4) { doublet0=sample[k]-another[k]; doublet1=sample[k+1]-another[k+1]; s+=t0*t0+t1*t1; t0=sample[k+2]-another[k+2]; t1=sample[k+3]-another[k+3]; s+=t0*t0+t1*t1; } for(;k { doublet0=sample[k]-another[k]; s+=t0*t0; } results[j]=(Qfloat)(s*gamma); } if(vcount>0) cvExp(&R,&R); } voidCvSVMKernel: : calc(intvcount,intvar_count,constfloat**vecs, constfloat*another,Qfloat*results) { constQfloatmax_val=(Qfloat)(FLT_MAX*1e-3); intj; (this->*calc_func)(vcount,var_count,vecs,another,results); for(j=0;j { if(results[j]>max_val) results[j]=max_val; } } //GeneralizedSMO+SVMlightalgorithm //Solves: // //min[0.5(\alpha^TQ\alpha)+b^T\alpha] // //y^T\alpha=\delta //y_i=+1or-1 //0<=alpha_i<=Cpfory_i=1 //0<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SVM