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

载时自http://blog.csdn.net/u011177305/article/details/46458801?locationNum=1

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修道者博文的文章,使用其如下代码

[html] view plain copy

print?

  1. CvSVMParams param;
  2. param.svm_type = CvSVM::EPS_SVR;
  3. param.kernel_type = CvSVM::RBF;
  4. param.C = 1;  //给参数赋初始值
  5. param.p = 5e-3;  //给参数赋初始值
  6. param.gamma = 0.01;  //给参数赋初始值
  7. param.term_crit = cvTermCriteria(CV_TERMCRIT_EPS, 100, 5e-3);
  8. //对不用的参数step设为0
  9. CvParamGrid nuGrid = CvParamGrid(1,1,0.0);
  10. CvParamGrid coeffGrid = CvParamGrid(1,1,0.0);
  11. CvParamGrid degreeGrid = CvParamGrid(1,1,0.0);
  12. CvSVM regressor;
  13. regressor.train_auto(PCA_training,tr_label,NULL,NULL,param,
  14. 10,
  15. regressor.get_default_grid(CvSVM::C),
  16. regressor.get_default_grid(CvSVM::GAMMA),
  17. regressor.get_default_grid(CvSVM::P),
  18. nuGrid,
  19. coeffGrid,
  20. degreeGrid);

用上面的代码的就可以自动训练优化出参数了,最后想查看优化后的参数值可以使用CvSVMParams params_re = regressor.get_params()函数来获得各优化后的参数值。

[html] view plain copy

print?

  1. CvSVMParams params_re = regressor.get_params();
  2. regressor.save("training_srv.xml");
  3. float C = params_re.C;
  4. float P = params_re.p;
  5. float gamma = params_re.gamma;
  6. printf("\nParms: C = %f, P = %f,gamma = %f \n",C,P,gamma);

不过根据我的测试发现如下错误:
OpenCV Error: Assertion failed (sv_count != 0) in do_train, file /home/.../opencv-2.4.9/modules/ml/src/svm.cpp, line 1346

该问题在stack overflow中有人提出,不过没有解决方案。

我修改了一下

CvParamGrid CvParamGrid_C(pow(2.0,-5), pow(2.0,15), pow(2.0,2));
CvParamGrid CvParamGrid_gamma(pow(2.0,-15), pow(2.0,3), pow(2.0,2));
if (!CvParamGrid_C.check() || !CvParamGrid_gamma.check())
    cout<<"The grid is NOT VALID."<<endl;
CvSVMParams paramz;
paramz.kernel_type = CvSVM::RBF;
paramz.svm_type = CvSVM::C_SVC;
paramz.term_crit = cvTermCriteria(CV_TERMCRIT_ITER,100,0.000001);
svm.train_auto(trainingData, labels, Mat(), Mat(), paramz,10, CvParamGrid_C, CvParamGrid_gamma, CvSVM::get_default_grid(CvSVM::P), CvSVM::get_default_grid(CvSVM::NU), CvSVM::get_default_grid(CvSVM::COEF), CvSVM::get_default_grid(CvSVM::DEGREE), true);
paramz = svm.get_params();
cout<<"gamma:"<<paramz.gamma<<endl;
cout<<"C:"<<paramz.C<<endl;

大家不妨尝试一下。

时间: 2024-10-11 13:19:49

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

获取URL中附带的请求参数的方式

在进行请求的时候,通常的方式是:request.getParametere("param");来获得我们想要的一些参数, 但是在现实的生活中我们需要自定义一些URL格式的请求参数,对这些格式的请求参数可能通过request.getParameter("param") 就不是十分的合适. 下面我们以http://www.yongit.com/device/md5/44CF9590006BF252F707?firstParam=gHdg5pU48rHTDknJ&

spring mvc 3.1的自动注入参数遇到的问题

在网上下载了xheditor作为页面的编辑器,编辑内容后post到后台保存,后台方法用spring mvc的自动注入的方式接收参数. 这种方式在各个浏览器下运行良好,但是在ie11下发现,从word.文本编辑器或者其它编辑器复制内容到xheditor后,这时提交到后台的参数不能被接收到. 仔细排查下发现ie11下复制到xheditor的内容都被默默的加了一段无用的div: <div style="top: 0px;"> </div> 此时用最原始的接收参数的方式

python 超参数 自动搜索模块GridSearchCV(收藏)

1. 引言 当我们跑机器学习程序时,尤其是调节网络参数时,通常待调节的参数有很多,参数之间的组合更是繁复.依照注意力>时间>金钱的原则,人力手动调节注意力成本太高,非常不值得.For循环或类似于for循环的方法受限于太过分明的层次,不够简洁与灵活,注意力成本高,易出错.本文介绍sklearn模块的GridSearchCV模块,能够在指定的范围内自动搜索具有不同超参数的不同模型组合,有效解放注意力. 2. GridSearchCV模块简介 这个模块是sklearn模块的子模块,导入方法非常简单

C# 中参数验证方式的演变

一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限制,如果是整数可能需要判断范围,如果是一些特殊的类型比如电话号码,邮件地址等,可能需要使用正则表达式进行判断. 通常,我们一般都是在方法开始的地方进行条件判断,然后抛出合适的异常,这是最普通和通用的做法,但是在.NET中,利用一些语言特性和类库,可以使用一些其他的方式将我们从复杂繁琐的工作中解放出来

mysql中采用concat来拼接中文字符乱码解决方式(转)

mysql中采用concat来拼接中文字符乱码解决方式 - fuxuejun的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/fuxuejun/article/details/6284725 mysql concat乱码问题解决 concat(str1,str2) 当concat结果集出现乱码时,大都是由于连接的字段类型不同导致,如concat中的字段参数一个是varchar类型,一个是int类型或doule类型,就会出现乱码. 解决方法:利用mysql的字符

Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2[email protected] Software:系统源码Android5.1 前沿: 在全新的Camera API2架构下,常常会有人疑问再也看不到熟悉的SetParameter/Paramters等相关的身影,取而代之的是一种全新的CameraMetadata结构的出现,他不仅很早就出现在Camera API1/API2结构下的Camera2Device.Cam

Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法

Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx":意思是返回到某个JSP页面上 如果想在此Action中跳转到另一个Action中怎样做呢? return "redirect://.do?" 例如: @RequestMapping(params = "action=delete") public String del

解决:设置中打开蓝牙,测试机不会自动搜索设备

[操作步骤]:设置中打开蓝牙,测试机不会自动搜索设备 [测试结果]:设置中打开蓝牙,测试机不会自动搜索设备 [预期结果]:打开蓝牙,应该会自动搜索设备 根据反复测试发现,当蓝牙状态打开,并且有可用的设备的时候,或者存在已经配对成功的设备的时候,系统将不会在进行设备搜索,因此根据String定位到蓝牙的设置界面的Fragment为:BluetoothSettings.java. 在BluetoothSettings类的updateContent()方法中我们发现下面代码: ......      

PHP中多级查询采用递归和循环的方式详解

现在的商城类app或者是购物网站一般除了购物外,还起到了推广,宣传和分销的作用,多级查询一般采用递归和循环的方式.不过很多初学者都是不清楚如何实现的,下面就以20级为例,编写的代码和运行效果如下:1.Php查询每级人数.php代码如下:$aim["prevtel"] = $tel; $n=0; $array_co = array(); while ( $n< 10) { $users=M('user')->where($aim)->getField('tel',tru