【发布时间】:2015-02-17 11:01:47
【问题描述】:
我正在使用 libsvm 来解决一类分类问题。我正在尝试为不同的内核(多项式、线性和 rbf)选择理想的 C 和 gamma 参数 我正在使用建议的 matlab 代码,该代码通过 v-fold 验证技术找到最佳参数。
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-fold 交叉验证中,我们首先将训练集划分为 v 个相等的子集 尺寸。依次使用在其余子集上训练的分类器测试一个子集 v - 1 个子集。因此,整个训练集的每个实例都被预测一次,因此 交叉验证准确率是正确分类的数据的百分比。
在此代码中,C 和 gamma 取值范围为 (2^-1, 2^3) 和 (2^-4, 2^1)
我注意到,当调用 svmtrain 函数时,没有为 -s 指定参数来控制 svm 的类型。 libsvm 中 -s 的默认参数是 0,用于 C-SVC。我有一个类分类问题,所以我应该根据 svmtrain 选项使用 -s 2 。但是,当我将上述代码的第 4 行修改为
cmd = ['-s 2 -v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
我收到此错误:
“struct”类型的输入参数的未定义函数“ge”。
ergasia 中的错误(第 37 行) 如果 (cv >= bestcv),
据我所知,svm 返回一个 struct 类型的模型。我的问题是,我使用的代码是否适合一类分类问题中的参数选择?
另一个问题:除此之外,还有更好的方法来定义最佳 C 和 gamma 吗? 我在这里找到了这个方法: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
我真的需要一些帮助,所以提前谢谢你。
【问题讨论】:
标签: matlab machine-learning svm libsvm