我已经在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
我进行了几次测试,这就足够了。如果没有,您可能还需要调整其他设置以匹配默认设置。