关于SVM参数c&g选取的总结帖[matlab-libsvm]_svm cg值-程序员宅基地

技术标签: 机器学习 深度学习  

写了个程序 来选取SVM中参数 c和g的最佳值.
[写这个的目的是方便大家用这个小程序直接来寻找 
c和g的最佳值,不用再另外编写东西了. ] 
其实原本libsvm C语言版本中有相应的子程序可以找到最佳的c和g,需装载python语言然后用py 那个画图 就可以找到最佳的c和g,我写了个matlab版本的.算是弥补了libsvm在matlab版本下的空缺. 


测试数据 还是我视频 里的wine data.

寻找最佳c和g的思想仍然是让c和g在一定的范围里跑(比如 c = 2^(-5),2^(-4),...,2^(5),g = 2^(-5),2^(-4),...,2^(5)),然后用cross validation的想法找到是的准确率最高的c和g,在这里我做了一点修改(纯粹是个人的一点小经验和想法),我改进的是: 因为会有不同的c和g都对应最高的的准确率,我把具有最小c的那组c和g认为是最佳的c和g,因为惩罚参数不能设置 太高,很高的惩罚参数能使得validation数据的准确率提高,但过高的惩罚参数c会造成过学习状态,反正从我用SVM到现在,往往都是惩罚参数c过高会导致最终测试集合的准确率并不是很理想.. 

在使用这个程序时也有小技巧,可以先大范围粗糙的找 比较理想的c和g,然后再细范围找更加理想的c和g.

比如首先让 c = 2^(-5),2^(-4),...,2^(5),g = 2^(-5),2^(-4),...,2^(5)在这个范围找比较理想的c和g,如图:
======

======
此时bestc = 0.5,bestg=1,bestacc = 98.8764[cross validation 的准确率]

最终测试集合的准确率 Accuracy = 96.6292% (86/89) (classification)
======
此时看到可以把c和g的范围缩小.还有步进的大小也可以缩小(程序里都有参数可以自己调节,也有默认值可不调节).
让 c = 2^(-2),2^(-1.5),...,2^(4),g = 2^(-4),2^(-3.5),...,2^(4)在这个范围找比较理想的c和g,如图:
=============

===============
此时bestc = 0.3536,bestg=0.7017,bestacc = 98.8764[cross validation 的准确率]
最终测试集合的准确率 Accuracy = 96.6292% (86/89) (classification)
===================
上面第二个的测试的代码

:

复制内容到剪贴板
代码:
load wine_SVM;

train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];
train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];

test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];
test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];

[train_wine,pstrain] = mapminmax(train_wine');
pstrain.ymin = 0;
pstrain.ymax = 1;
[train_wine,pstrain] = mapminmax(train_wine,pstrain);

[test_wine,pstest] = mapminmax(test_wine');
pstest.ymin = 0;
pstest.ymax = 1;
[test_wine,pstest] = mapminmax(test_wine,pstest);

train_wine = train_wine';
test_wine = test_wine';

[bestacc,bestc,bestg] = SVMcg(train_wine_labels,train_wine,-2,4,-4,4,3,0.5,0.5,0.9);

cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model = svmtrain(train_wine_labels,train_wine,cmd);
[pre,acc] = svmpredict(test_wine_labels,test_wine,model);

============我写的那个选取SVM中参数c和g的最佳值.的程序的代码  SVMcg.m====================

复制内容到剪贴板
代码:
function [bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%SVMcg cross validation by faruto
%Email:faruto[email protected] QQ:516667408 http://blog.sina.com.cn/faruto BNU
%last modified 2009.8.23
%Super Moderator @ www.ilovematlab.cn
%% about the parameters of SVMcg 
if nargin < 10
    accstep = 1.5;
end
if nargin < 8
    accstep = 1.5;
    cstep = 1;
    gstep = 1;
end
if nargin < 7
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
end
if nargin < 6
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
end
if nargin < 5
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
end
if nargin < 4
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
    cmax = 5;
end
if nargin < 3
    accstep = 1.5;
    v = 3;
    cstep = 1;
    gstep = 1;
    gmax = 5;
    gmin = -5;
    cmax = 5;
    cmin = -5;
end
%% X:c Y:g cg:acc
[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
%% record acc with different c & g,and find the bestacc with the smallest c
bestc = 0;
bestg = 0;
bestacc = 0;
basenum = 2;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
        cg(i,j) = svmtrain(train_label, train, cmd);
        
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end
        if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )
            bestacc = cg(i,j);
            bestc = basenum^X(i,j);
            bestg = basenum^Y(i,j);
        end
        
    end
end
%% to draw the acc with different c & g
[C,h] = contour(X,Y,cg,60:accstep:100);
clabel(C,h,'FontSize',10,'Color','r');
xlabel('log2c','FontSize',10);
ylabel('log2g','FontSize',10);
grid on;

=====================================


这样那个libsvm-matlab工具箱 我就有了自己的一个升级版本的了.大家可以把这个SVMcg.m加进去 一起用了...

里面有SVMcg.m使用说明.如下:
[bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)

train_label:训练 集标签.要求与libsvm工具箱中要求一致.
train:训练集.要求与libsvm工具箱中要求一致.
cmin:惩罚参数c的变化范围的最小值(取以2为底的对数后),即 c_min = 2^(cmin).默认为 -5
cmax:惩罚参数c的变化范围的最大值(取以2为底的对数后),即 c_max = 2^(cmax).默认为 5
gmin:参数g的变化范围的最小值(取以2为底的对数后),即 g_min = 2^(gmin).默认为 -5
gmax:参数g的变化范围的最小值(取以2为底的对数后),即 g_min = 2^(gmax).默认为 5

v:cross validation的参数,即给测试集分为几部分进行cross validation.默认为 3
cstep:参数c步进的大小.默认为 1
gstep:参数g步进的大小.默认为 1
accstep:最后显示准确率图时的步进大小. 默认为 1.5
[上面这些参数大家可以更改以期达到最佳效果,也可不改用默认值] 

====================

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_17754181/article/details/45499637

智能推荐

springBoot(4):日志配置-logback-程序员宅基地

一、简介支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback对于日志的快捷方式:@Slf4j注解 注意:@Slf4j注解需要导入lombok包,pom如下:<dependency><groupId>org.projectlombok</groupId><...

腾讯QQ之下载的安装包在哪里-程序员宅基地

自己记录扣扣下载的软件包在哪接收到的包就不多说了,就在那个,Tencent/QQfile_recv.游戏中心下载的话:Download/com.tencent.gamecenter.wadl/dlapks.推送时候下载的话:Tencent\TMAssistantSDK\Download此上~~...

spring+mybatis+c3p0无法连接数据库-程序员宅基地

今天遇到一个问题,无法连接到MySQL, 项目用的 spring+mybatis+c3p0,报以下错误A ResourcePool could not acquire a resource from its primary factory or source. Could not get JDBC Connection; nested exception is java.sql.SQLExcept...

Servlet API(一)GenericServlet类、HttpServlet类、doget()、dopost()_doget右键-程序员宅基地

文章目录一、Servlet API二、Servlet接口三、GenericServlet类实例一:扩展GenericServlet类实现service()方法一、Servlet APIServlet:用来完成B/S架构下,对客户端请求的响应处理Servlet API:为Servlet提供了统一的编程接口常见的Servlet容器:Servlet 在容器中运行TomcatJetty / Resin二、Servlet接口Servlet接口是Servlet API中的基本接口,每个Serv_doget右键

Navicat for MySQL Mac 破解版-程序员宅基地

今天在macOS 系统下搭建 Java开发环境,需要配置MySQL,按照Windows的习惯,使用Navicat for MySQL 操作比较习惯。然后找不到比较好的破解版,这里介绍一个老版的,还是英文版的工具安装破解说明。 1. 官网下载地址:http://download3.navicat.com/download/navicat110_premium_en.dmg安装完后不要...

react-router-dom v6 中‘Switch‘ is not exported from ‘react-router-dom‘_react-router-dom v6 switch_九州县令的博客-程序员宅基地

首先出现这个问题是因为react-router-dom v6版本做了改动, 它用 Routes 组件替换了 Switch。react-router-dom v5 版本react-router-dom v6 版本_react-router-dom v6 switch

随便推点

简单的struts2框架(一)-程序员宅基地

struts2-blank.war,放到tomcat的webapps下,重新启动会部署,在部署后,会产生practice_struts2下载地址:http://pan.baidu.com/s/1jGKcvgq一:加载Struts2类库struts2-core-2.3.16.3.jar 框架的核心类库xwork-core-2.3.16.3.jar XWork类库,构架基础ognl-...

网络编程基础-程序员宅基地

移动应用一般由用户界面、用户体验、动态数据构成。 - 用户界面由UI设计 - 用户体验由多线程来完成 - 动态数据由网络编程来实现在网络编程中主要有这么两个角色客户端:移动应用服务器端:为客户端提供服务、数据和资源的机器步骤: 1.客户端向服务器发送请求,目的是索要资源 2.服务器会从数据库中寻找资源 3.服务器对客户端的请求进行响应,返回其所需资源服务器按照软件开发阶段,分为两种

动态规划专题——leetcode 72. Edit Distance Hard(最小编辑距离)_最小编辑距离 动态规划c算法实现含有追踪数组-程序员宅基地

1.题目描述2.题解方法1:自顶向下(递归 + 备忘录数组memo[])方法2:自底向上(dp table)3.收获_最小编辑距离 动态规划c算法实现含有追踪数组

makefile及条件编译_makefile如何判断当前是wsl环境-程序员宅基地

//getword.cc#include#includeusing namespace std;int main(){string word;#ifdef LINEwhile(getline(cin,word)) cout#elsewhile(cin>>word) cout#endifreturn 0;}上面是源文件,此程_makefile如何判断当前是wsl环境

Android 判断字符串是不是是身份证、邮箱、银行卡、手机号、中文 1-程序员宅基地

Android 判断字符串是否是身份证、邮箱、银行卡、手机号、中文1.判断字符串是否是身份证: /** * 功能:身份证的有效验证 * * @param IDStr * 身份证号 * @return 有效:返回"" 无效:返回String信息 * @throws ParseEx

互联网业务利润增长3倍,TCL电子走出第二增长曲线_娃哈哈业务增长-程序员宅基地

文 | 易牟来源 | 螳螂财经(ID:TanglangFin)近日,TCL电子披露了2020年第三季度财报,营收和净利润双双大增。这是一份让人满意的财报。具体来看,TCL电子第三季度营收146.83亿港元,同比增长76.6%,归母净利润20.96亿港元,同比增长1355.6%。其中主营业务实现明显增长,全球电视销量同比增49.7%,环比增24.7%达724万台,全球市占率同比提升2.7个百分点至11.3%,排名全球前三;收入119.2亿港元。互联网业务收入同比增长62.1%达2.6亿港元.._娃哈哈业务增长

推荐文章

热门文章

相关标签