Supprt Vector Machine在matlab中工作,在c ++中不起作用

Jak*_*ake 1 c++ matlab machine-learning svm

我正在编写一个使用SVM对某些图像进行分类的应用程序(特别是这些).我的Matlab实现非常有效.使用SIFT字袋方法,我可以使用线性内核获得接近100%的准确度.

我需要在C++中以速度/可移植性的原因实现它,所以我尝试使用libsvmdlib.我尝试了多种SVM类型(c_svm,nu_svm,one_class)和多个内核(线性,多项式,rbf).我能够达到的最好的准确度是大约50% - 即使是我训练过的相同样本.我已经确认我的特征生成器正在工作,因为当我将我的c ++生成的特性导出到Matlab并对其进行训练时,我能够再次获得接近完美的结果.

Matlab的SVM实现有什么神奇之处吗?是否有任何常见的陷阱或领域可以解释我所看到的行为?我知道这有点模糊,但问题的一部分是我不知道去哪里.如果我能提供其他有用的信息,请在评论中告诉我.

car*_*sdc 5

Matlab版本的库没有什么神奇之处,其他它在Matlab中运行,这让你更难以自己拍脚.

检查清单:

  1. 您是否正常化您的数据,使所有值在0和1之间(或介于-1和1之间),线性地或使用均值和标准差?
  2. 您是否参数搜索C的良好值(或者在RBF内核的情况下为C和gamma)?进行交叉验证还是保留设置?
  3. 你确定你正在处理NaN,以及所有其他浮点数的肮脏吗?Matlab非常擅长将这个隐藏起来,C++并没有那么多.
  4. 可能是你正在加载你的数据不正确,将"%s"读入双重内容或者为输入数据添加噪音的内容?
  5. 可能是libsvm/dlib期望行中的数据主要顺序,并且您是以列major(或其他方式)发送它?Matlab再一次认为这几乎是不可能的,C++并没有那么多.
  6. 32-64位nastiness一个版本的库,可执行编译与另一个?

其他一些事情:

  1. 可能是在Matlab中你以某种方式将类(y)泄漏到预处理中吗?没有人故意这样做,但我看到它发生了.如果你几乎任何f(y)一个特征,你每次都会得到几乎100%.
  2. 有时,在使用C++和Matlab进行训练之前,通过打印到文件来验证所有内容在数值上是否相同是有帮助的.