OpenCV4android - настройте обучение SVM с теми же параметрами, что и SMO ​​Weka.

Я протестировал набор данных в Weka 3.6.9 SMO ( ничего не менял, просто использовал стандартные параметры) и получил отличный результат. Я попытался настроить тот же SMO в SVM OpenCV (для Android), но Я не получаю хороших результатов. Я хотел бы настроить и обучить SVM OpenCV в своем приложении так же, как стандартный SMO в Weka, может ли кто-нибудь мне помочь?

Стандартная конфигурация SMO Weka (с 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) ^ градус, с гаммой> 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);

Заранее спасибо!


person mtndg    schedule 27.05.2013    source источник
comment
Если p=1, вы в основном используете линейное ядро. В этом случае лучше отойти от полинома.   -  person Marc Claesen    schedule 27.05.2013


Ответы (1)


Вы хотите посмотреть настройки по умолчанию для SMO Weka, найденные здесь 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 имеет вид (гамма + коэффициент) ^ exp (или что-то в этом роде), а SMO имеет (+ 1) ^ exp.

Таким образом, очевидно, что вам нужны следующие настройки: экспонента: 1 гамма: 1.0 коэффициент: 1.0

Я провел несколько тестов, и этого было достаточно. В противном случае вы можете также изменить другие настройки, чтобы они соответствовали значениям по умолчанию.

person Dainis Boumber    schedule 27.06.2013