我在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 )^ <度> , gamma &gt; 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);
提前致谢!
答案 0 :(得分:1)
您想查看此处http://weka.sourceforge.net/doc/weka/classifiers/functions/SMO.html
中Weka的SMO的默认设置查看您的代码,
params.set_coef0(1.0);
应该这样做。
更详细地说,要使LibSVM(或任何基于它的库,如openCV MLL)产生相同的结果,您需要为您的内核进行以下设置:
您应该使用C-SVC(默认),因此不会有任何更改。 kernel:polykernel而不是rbf
注意SMO和LibSVM的不同之处在于,当SMO具有(+ 1)^ exp时,LibSVM的多核通道是(gamma +系数)^ exp(或类似的东西)。
因此,很明显您需要以下设置: 指数:1 gamma:1.0 系数:1.0
我进行了几次测试,这就足够了。如果没有,您可能还想调整其他设置以匹配默认值。