OpenCV4android - 使用与Weka的SMO相同的参数配置SVM的训练

时间:2013-05-27 05:54:05

标签: android opencv weka svm

我在Weka的3.6.9中SMO测试了一个数据集(没有改变任何东西,只使用了标准参数)并得到了很好的结果。我尝试在OpenCV的SVM(适用于Android)中配置相同的SMO,但我没有取得好成绩。我想在我的应用程序中配置和训练OpenCV的SVM,就像在Weka中找到的标准SMO一样,有人可以帮助我吗?

Weka的标准SMO 配置(10次交叉验证):

weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K "weka.classifiers.functions.supportVector.PolyKernel -C 250007 -E 1.0"

多项式核(在Weka SMO中)如下: K(x,y)=(x,y)^ p K(x,y)=((x ,y)+1)^ p ,p = 1。

OpenCV的polykernel文档中的公式如下: K(x,y)=( gamma *(x,y)+ coef0 )^ <度> gamma &gt; 0

现在我的代码尝试在 OpenCV4Android中配置相同的方式:

CvSVMParams params = new CvSVMParams();
    params.set_svm_type(CvSVM.C_SVC);
    params.set_kernel_type(CvSVM.POLY);
    params.set_C(1.0);
    params.set_degree(1.0);
    params.set_coef0(0.0);
    params.set_gamma(1.0);
    params.set_term_crit(new TermCriteria(TermCriteria.EPS, 10000, 1e-12));

    CvSVM svm = new CvSVM();

    // n-fold cross validation
    int kFolds = 10;

    CvParamGrid C = new CvParamGrid();
    CvParamGrid p = new CvParamGrid();
    CvParamGrid nu = new CvParamGrid();

    CvParamGrid gamma = new CvParamGrid();
    gamma.set_step(0.0);
    CvParamGrid coeff = new CvParamGrid();
    CvParamGrid degree = new CvParamGrid();

    svm.train_auto(trainData, responses, new Mat(), new Mat(), params,
            kFolds, C, gamma, p, nu, coeff, degree, false);

提前致谢!

1 个答案:

答案 0 :(得分:1)

您想查看此处http://weka.sourceforge.net/doc/weka/classifiers/functions/SMO.html

中Weka的SMO的默认设置

查看您的代码,

  

params.set_coef0(1.0);

应该这样做。

更详细地说,要使LibSVM(或任何基于它的库,如openCV MLL)产生相同的结果,您需要为您的内核进行以下设置:

您应该使用C-SVC(默认),因此不会有任何更改。 kernel:polykernel而不是rbf

注意SMO和LibSVM的不同之处在于,当SMO具有(+ 1)^ exp时,LibSVM的多核通道是(gamma +系数)^ exp(或类似的东西)。

因此,很明显您需要以下设置: 指数:1 gamma:1.0 系数:1.0

我进行了几次测试,这就足够了。如果没有,您可能还想调整其他设置以匹配默认值。