我在 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 )^ 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);
提前致谢!