C++ OpenCV线性支持向量机未训练

C++ OpenCV线性支持向量机未训练,c++,opencv,svm,libsvm,C++,Opencv,Svm,Libsvm,我已经在这上面呆了一段时间了。OpenCV的SVM实现似乎不适用于线性内核。我相当确定代码中没有bug:当我将内核类型更改为RBF或POLY,保持其他一切不变时,它就工作了 我之所以说它不起作用,是因为我保存了生成的模型并将其签出。它将支持向量计数显示为1。在RBF或多项式核中,情况并非如此 代码本身没有什么特别之处,我以前使用过OpenCV的SVM实现,但从未使用过线性内核。我尝试在多核中将度设置为1,结果是相同的模型。这让我相信这里有些东西有问题 代码结构(如果需要): Mat traini

我已经在这上面呆了一段时间了。OpenCV的SVM实现似乎不适用于线性内核。我相当确定代码中没有bug:当我将
内核类型
更改为RBF或POLY,保持其他一切不变时,它就工作了

我之所以说它不起作用,是因为我保存了生成的模型并将其签出。它将支持向量计数显示为1。在RBF或多项式核中,情况并非如此

代码本身没有什么特别之处,我以前使用过OpenCV的SVM实现,但从未使用过线性内核。我尝试在多核中将
度设置为1,结果是相同的模型。这让我相信这里有些东西有问题

代码结构(如果需要):

Mat trainingdata;    //acquire from files. done and correct.
Mat testingdata;     //acquire from files. done and correct again.
Mat labels;          //corresponding labels. checked and correct.

SVM my_svm;
SVMParams my_params;
my_params.svm_type = SVM::C_SVC;
my_params.kernel_type = SVM::LINEAR;    //or poly, with my_params.degree = 1.
my_param.C = 0.02;    //doesn't matter if I set it to 20000, makes no difference.

my_svm.train( trainingdata, labels, Mat(), Mat(), my_params );
//train_auto(..) function with 10-fold cross-validation takes the same time as above (~2sec)!
Mat responses;
my_svm.predict( testingdata, responses );
//responses matrix is all wrong.
我有500个样本来自一个类,600个样本来自另一个类,我得到的正确分类是:1/500和597/600

最疯狂的部分:
我在libSVM的MATLAB包装器上用相同的数据做了相同的实验,效果很好。只是尝试做一个OpenCV版本。

使用线性CvSVM总是只能得到一个支持向量,这不是一个错误

OpenCV将线性支持向量机优化为一个支持向量。
这里的想法是,支持向量定义分类边界,而要进行实际分类,只需要分离超平面,它只能由一个向量定义


如果训练数据是线性可分离的,则参数C无关紧要。也许是你的情况。

你确定数据是线性可分的吗?事实上,它与更为奇特的内核一起工作,强烈地表明了非线性可分离数据。。。你是用线性核训练libSVM吗?你知道SVM的公式吗?当您将C设置为0.02或20000时,应该存在差异。请确保设置正确。它不可能对所有参数都相同。此外,还应将epsilon参数设置为0.001,默认值为其他值。最后一件事,当您运行
train\u auto()
而不是
train()
时会发生什么?尝试调整标准示例/cpp/points\u classifier.cpp还有svm分类器。“我已经检查过了,它成功了。”SchighSchagh我从libSVM中复制了这个实验。“它在那里很有魅力。”guneykayim我知道SVM的公式,我知道C对模型做了什么。这就是为什么我发现C的值没有任何区别,这让我感到惊讶<代码>列车自动()。给我C=1。我试过了。我不明白一个分离的超平面怎么只需要一个支持向量。除此之外,我以前使用过线性支持向量机,得到了许多支持向量(这与过度拟合和泛化的思想很好地结合)。并且
C
在噪声会影响分类的情况下非常有用;噪声的存在不是一个巨大的假设(至少在这种情况下是如此)。当支持向量机进行训练时,它使用了一些位于边缘或内部的支持向量(如果我们使用“软”边缘)。但当opencv存储经过训练的分类器时,它只需要一个向量(垂直于超平面)来定义区分超平面。是的,如果我们有噪音,C是有用的。但如果我们没有噪声,数据是线性可分的,那么C不会影响训练。哦,是的,我同意。我记不起这个实验的nSV,但我肯定我看到的数字大于一。