2

我有大小为 100 的特征向量。总训练样本为 500,其中每个类有 10 个样本。我想为每个类设计一个单独的 svm 分类器。也就是说,每个类的分类器将得到 10 个正样本(为此类)和 490 个否定实例。我的opencv代码如下

为了训练:

Mat trainingDataMat(500, 100, CV_32FC1, trainingData);//trainingData is 2D MATRIX

Mat labelsMat(500, 1, CV_32FC1, labels);//10 positive and 490 -ve labels
CvSVMParams params;
params.svm_type = SVM::C_SVC;
params.kernel_type = SVM::RBF;
CvSVM SVM; 
SVM.train_auto(trainingDataMat, labelsMat, Mat(), Mat(), params,5);
SVM.save(name);

用于检测

Mat sampleMat(1, size, CV_32FC1, testing_vector);// testing_vector is 1D vector
CvSVM SVM;
SVM.load(name);
float response = SVM.predict(sampleMat);

问题是,即使我从训练集中给出正测试样本,类的分类器也会输出 -1,其他测试样本也是如此。

我也尝试过 ONE_CLASS svm,但它为每个测试样本提供 0。

我哪里出错了或者我应该使用什么 svm 类型?如果可能,请用代码解释。先感谢您。

4

2 回答 2

4

您似乎错过了标准化步骤。OpenCV 中的 SVM 分类器使用与libsvm相​​同的方法,如果您阅读 libsvm 的文档,它会说您应该在区间 [-1,1] 内标准化您的训练数据并获取比例参数。然后使用这些缩放参数来缩放您的测试数据。这可能是一个问题。或者可能是因为正样本和负样本的数量不相等。在您训练了 SVM 之后,是否尝试将您的训练数据分类为交叉验证?

于 2013-09-19T16:03:15.363 回答
0

尝试对每个类使用线性内核和大致相等的正负数。您可以通过设置 gamma 和成本参数的值来调整精度/召回率。看一看: SVM的gamma和cost参数

于 2013-09-19T15:07:09.430 回答