优化 C、g 参数时 LIBSVM 中的网格搜索错误



我正在使用libsvm来解决单类分类问题。我正在尝试为不同的核(多项式、线性和 rbf(选择理想的 C 和 gamma 参数我正在使用建议的 matlab 代码,该代码通过 V 折叠验证技术找到最佳参数。

bestcv = 0;
for log2c = -1:3,
  for log2g = -4:1,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(Target_train, train, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('%g %g %g (bestc=%g, g=%g, rate=%g)n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end

在 v 折交叉验证中,我们首先将训练集划分为相等的 v 子集大小。使用在其余子集上训练的分类器按顺序测试一个子集v − 1 个子集。因此,整个训练集的每个实例都被预测一次,因此交叉验证准确性是正确分类的数据的百分比。

在此代码中,C 和 gamma 取的值范围为 (2^-1, 2^3( 和 (2^-4, 2^1(

我注意到,当调用 svmtrain 函数时,没有指定 -s 的参数来控制 svm 的类型。libsvm 中 -s 的默认参数是 0,用于 C-SVC。我有一个单类 clssization 问题,所以我应该根据 svmtrain 选项使用 -s 2。但是当我将上述代码的第 4 行修改为

cmd = ['-s 2 -v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];

我收到此错误:

用于类型为"struct"的输入参数的未定义函数"ge"。

ergasia 中的错误(第 37 行( 如果(CV>= bestcv(,

据我所知,svm 返回结构类型的模型。我的问题是,我使用的代码是否适合在单类分类问题中选择参数?

另一个问题:除了这个之外,有没有更好的方法来定义最好的C和伽马?我在这里找到了这种方法:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

我真的可以使用一些帮助,所以提前谢谢你。

这些

天我只是在谈论 LibSvm 的事情。我还使用网格搜索来获得最佳的c,g,它确实有效。首先,我用 -s 2 -v 5 -c -g 12 运行一个小测试

traindata=getData(1,1,12);
testdata=getData(1,0,12);
trainLabel=getLabel(1);
trainLabel(trainLabel>1)=0;
testLabel=getLabel(0);
testLabel(testLabel>1)=0;
v=5;
c=4;
g=12;
cmd = ['-s 2 -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),'    -q '];
cg = svmtrain(trainLabel,traindata,cmd);  

我得到一个结果cg,它只是一个数字

>> littletest
Cross Validation Accuracy = 4.53333%
>> cg
cg =
    4.5333

'if (cv>= bestcv(',所以它会起作用。

我还想告诉你的是,如果你不为 -s 指定参数,它也可以工作。

traindata=getData(1,1,12);
testdata=getData(1,0,12);
trainLabel=getLabel(1);
trainLabel(trainLabel>1)=0;
testLabel=getLabel(0);
testLabel(testLabel>1)=0;
v=5;
c=4;
g=12;
cmd = [' -t 2  -v ',num2str(v),' -c ',num2str( c ),' -g ',num2str( g ),' -q '];
cg = svmtrain(trainLabel,traindata,cmd);  
>> littletest
Cross Validation Accuracy = 99.0667%
>> cg
cg =
   99.0667
其次,我

粘贴我在这里使用的网格搜索代码,希望对您有所帮助。

[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 = ['-t 2  -v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -q '];
        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

在一个类 svm 中没有 gamma 参数。有成本 (-c( 和 nu (-n(。您可以在 libsvm 发行版的 matlab 文件夹中的 svmtrain.c 文件中查看所有选项。

最新更新