2

我在 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)^pK(x, y) = ((x, y)+1)^p,其中 p = 1 .

OpenCV 的 polykernel 文档中的公式如下: K(x,y) = ( gamma *(x,y)+ coef0 )^ degree,其中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);

提前致谢!

4

1 回答 1

1

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

看着你的代码,

params.set_coef0(1.0);

应该做的伎俩。

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

您应该使用 C-SVC(默认),因此这里没有更改。内核:polykernel 而不是 rbf

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

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

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

于 2013-06-27T19:21:10.513 回答