我正在编写一个应用程序,它使用 SVM 对某些图像(特别是 these)进行分类。我的 Matlab 实现效果非常好。使用 SIFT 词袋方法,我能够使用线性内核获得接近 100% 的准确度。
出于速度/可移植性的原因,我需要在 C++ 中实现它,因此我尝试同时使用 libsvm和 dlib .我尝试了多种 SVM 类型(c_svm、nu_svm、one_class)和多个内核(线性、多项式、rbf)。我能达到的最高准确度是 50% 左右——即使是在我训练过的相同样本上也是如此。我已经确认我的特征生成器正在运行,因为当我将我的 C++ 生成的特征导出到 Matlab 并在这些特征上进行训练时,我能够再次获得近乎完美的结果。
Matlab 的 SVM 实现有什么神奇之处吗?是否有任何我可能会研究的常见陷阱或领域可以解释我所看到的行为?我知道这有点含糊,但部分问题是我不知道该去哪里。如果我可以提供其他有用的信息,请在评论中告诉我。
最佳答案
库的 Matlab 版本没有什么神奇之处,除了它在 Matlab 中运行,这使得你更难搬起石头砸自己的脚。
检查 list :
- 您是否正在规范化数据,使所有值都介于 0 和 1 之间 (或介于 -1 和 1 之间),线性地或使用均值和 标准偏差?
- 您是否在参数搜索中寻找合适的 C 值(或 C 和 gamma RBF 内核的情况)?进行交叉验证或保留集?
- 您确定要处理 NaN 和所有其他 float 吗 下流? Matlab 非常善于向你隐藏这一点,而 C++ 则不然 很多。
- 会不会是你加载的数据不正确,读了一个 "%s"变成双倍或给您的输入增加噪音的东西 数据?
- 难道是 libsvm/dlib 期望数据按行主要顺序排列并且 您是将其发送到专业栏目(或相反)吗? Matlab 再次使这几乎不可能,C++ 则不然。
- 32-64 位 nastiness 一个版本的库,可执行编译 与另一个?
一些其他的东西:
- 会不会是在 Matlab 中你以某种方式将类 (y) 泄漏到 预处理?没有人故意这样做,但我已经看到它发生了。 如果你把几乎任何 f(y) 都变成一个特征,你将得到几乎 100% 每次。
- 有时它有助于验证一切都是数字 在 C++ 和 Matlab。
关于c++ - 支持 vector 机在 matlab 中有效,在 c++ 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670101/