Я протестировал набор данных в 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);
Заранее спасибо!
p=1
, вы в основном используете линейное ядро. В этом случае лучше отойти от полинома. - person Marc Claesen   schedule 27.05.2013