我已经在Weka的3.6.9 SMO中测试了一个数据集(没有做任何更改,只是使用了标准参数),并获得了不错的结果。我试图在OpenCV的SVM(适用于Android)中配置相同的SMO,但效果不佳。我想像在Weka中找到标准SMO一样,在我的应用程序中配置和训练OpenCV的SVM,有人可以帮助我吗?

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的多内核文档中的公式如下:
K(x,y)=( Gamma *(x,y)+ coef0)^度, Gamma > 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);

提前致谢!

最佳答案

您想查看在此处找到的Weka SMO的默认设置http://weka.sourceforge.net/doc/weka/classifiers/functions/SMO.html

看你的代码,



应该可以。

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

您应该使用C-SVC(默认),因此此处没有任何更改。
内核:多内核而不是rbf

请注意SMO和LibSVM的不同之处在于LibSVM的多核是(gamma + coefficient)^ exp(或类似的东西),而SMO具有(+1)^ exp。

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

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

10-08 07:01