【发布时间】:2014-12-07 09:42:43
【问题描述】:
我对 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;
}
【问题讨论】:
-
只是评论,评估您的模型在训练集上的准确性并不能很好地了解它在新数据上的表现。了解训练错误很有用,但请尝试在训练集中保留一些示例,并在训练完成后使用它们来测试您的模型。
-
是的,我知道。我的问题是为什么所有的训练数据都归为一类。看起来它们是不可分离的。
-
请提供一些代码。这可能是您忽略的一些小错误。
-
我刚刚添加了我的代码。 trainingMat 大小为 1000x863。