首页 文章

使用带有RBF内核的SVM的意外性能

提问于
浏览
0

我是svm分类的新手 . 我正在尝试使用opencv svm分类器来做一些人脸识别 . 输入要素参数是规范化的局部二进制模式 . 所以所有值都是0-1 . 我首先尝试使用线性内核来训练分类器,然后使用训练数据集来测试集合 . 我得到了100%的准确度(我知道这意味着什么) . 但是,当我将内核更改为RBF(所有其他参数都是默认值)并重新测试训练集时,所有情况都归类为一个类,这意味着它们不可分离 . 我尝试了从0.000001到10的不同伽马值 . 有没有人知道这个问题?谢谢 .

顺便说一句,我在训练后检查了支持的向量,所有值都是相同的 .

这是代码

CvSVMParams param;
param.svm_type = CvSVM::C_SVC;
param.kernel_type = CvSVM::RBF; //CvSVM::RBF, CvSVM::LINEAR ...
param.degree = 2; // for poly
param.gamma = 0.000000001; // for poly/rbf/sigmoid
param.coef0 = 1; // for poly/sigmoid

param.C = 0.5; // for CV_SVM_C_SVC, CV_SVM_EPS_SVR and CV_SVM_NU_SVR
param.term_crit.type = CV_TERMCRIT_EPS;//CV_TERMCRIT_ITER +CV_TERMCRIT_EPS;
param.term_crit.max_iter = 1000000;
param.term_crit.epsilon = 1e-9;
SVM.train(trainingDataMat, labelMat, Mat(), Mat(), param);

for(int i=0; i<trainingDataMat.rows; i++){
    Mat sampleMat = trainingDataMat(Range(i,i+1), Range::all());
    double response = SVM.predict(sampleMat);
    cout<<"test"<<i<<"=  "<<response<<endl;
}

1 回答

  • 2

    你可以做的是当使用 train_auto 使用RBF内核时让OpenCV优化SVM参数 . 这样您就不必担心这些参数,它们会自动设置 .

    这个OpenCV docmentation提供了关于如何使用它的很好的解释 . 或者,你可以参考这个great example on how to optimize SVM parameters

    使用train_auto的缺点是训练可能需要很长时间 . 根据您的训练集,甚至可能需要数天才能做好准备 .

    我实际上不知道你期待什么,但我会给你一个提示:RBF可能是OpenCV中最复杂的内核,但它可能不会给你最好的结果 . 尝试其他内核!

相关问题