svm 中采用自动搜索参数的方式获得参数值

opencv中SVM类是提供了优化参数值功能的,下面讲讲具体的做法。


要让svm自动优化参数,那么训练时就不能再用train函数了,而应该用train_auto函数。下面是train_auto的函数原型

C++: bool CvSVM:: train_auto (const Mat & trainData ,

const Mat & responses ,

const Mat & varIdx ,

const Mat & sampleIdx ,

CvSVMParams params ,

int k_fold=10 ,

CvParamGrid Cgrid=CvSVM::get_default_grid(CvSVM::C) ,

CvParamGrid gammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA) ,

CvParamGrid pGrid=CvSVM::get_default_grid(CvSVM::P) ,

CvParamGrid nuGrid=CvSVM::get_default_grid(CvSVM::NU) ,

CvParamGrid coeffGrid=CvSVM::get_default_grid(CvSVM::COEF) ,

CvParamGrid degreeGrid=CvSVM::get_default_grid(CvSVM::DEGREE) ,

bool balanced=false

)

自动训练函数的使用说明:
这个方法根据CvSVMParams中的最佳参数C, gamma, p, nu, coef0, degree自动训练SVM模型。参数被认为是最佳的交叉验证,其测试集预估错误最小。如果没有需要优化的参数,相应的网格步骤应该被设置为小于或等于1的值。

例如,为了避免gamma的优化,设置gamma_grid.step = 0,gamma_grid.min_val, gamma_grid.max_val 为任意数值。所以params.gamma 由gamma得出。
最后,如果参数优化是必需的,但是相应的网格却不确定,你可能需要调用函数CvSVM::get_default_grid(),创建一个网格。例如,对于gamma,调用CvSVM::get_default_grid(CvSVM::GAMMA)。该函数为分类运行 (params.svm_type=CvSVM::C_SVC 或者 params.svm_type=CvSVM::NU_SVC) 和为回归运行 (params.svm_type=CvSVM::EPS_SVR 或者 params.svm_type=CvSVM::NU_SVR)效果一样好。如果params.svm_type=CvSVM::ONE_CLASS,没有优化,并指定执行一般的SVM。

参考IT修道者博文的文章,使用其如下代码

CvSVMParams param;  
  param.svm_type = CvSVM::EPS_SVR;  
  param.kernel_type = CvSVM::RBF;  
  param.C = 1;  //给参数赋初始值
  param.p = 5e-3;  //给参数赋初始值
  param.gamma = 0.01;  //给参数赋初始值
  param.term_crit = cvTermCriteria(CV_TERMCRIT_EPS, 100, 5e-3); 
  //对不用的参数step设为0
  CvParamGrid nuGrid = CvParamGrid(1,1,0.0);
  CvParamGrid coeffGrid = CvParamGrid(1,1,0.0);
  CvParamGrid degreeGrid = CvParamGrid(1,1,0.0);

  CvSVM regressor;
  regressor.train_auto(PCA_training,tr_label,NULL,NULL,param,
    10,
    regressor.get_default_grid(CvSVM::C),
    regressor.get_default_grid(CvSVM::GAMMA),
    regressor.get_default_grid(CvSVM::P),
    nuGrid,
    coeffGrid,
    degreeGrid);
用上面的代码的就可以自动训练优化出参数了,最后想查看优化后的参数值可以使用CvSVMParams params_re = regressor.get_params()函数来获得各优化后的参数值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值