支持向量机在matlab中工作,在c ++中不起作用

时间:2012-12-02 14:15:25

标签: c++ matlab machine-learning svm

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

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

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

2 个答案:

答案 0 :(得分:5)

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

检查清单:

  1. 您是否正常化数据,使所有值介于0和1之间 (或-1和1之间),线性或使用均值和 标准偏差?
  2. 您是否参数搜索C的良好值(或C中的C和gamma) RBF内核的情况)?进行交叉验证还是保留设置?
  3. 你确定你正在处理NaN,以及所有其他浮动点 乱七八糟吗? Matlab非常善于将此隐藏起来,C ++并非如此 得多。
  4. 可能是您正在错误地加载数据,阅读 “%s”变成了一个双重或者某种东西,它会给你的输入增加噪音 数据?
  5. 可能是libsvm / dlib期望行中的数据主要顺序和 你是以专栏(或其他方式)发送的吗? Matlab再一次认为这几乎是不可能的,C ++并没有那么多。
  6. 32-64位nastiness一个版本的库,可执行编译 与另一个?
  7. 其他一些事情:

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

答案 1 :(得分:1)

我对使用rbf内核的libsvm非常满意。 carlosdc以正确的顺序指出了最常见的错误:-)。对于libsvm - 你使用libsvm附带的python工具吗?如果不是我建议这样做。将您的特征向量写入文件(来自matlab和/或c ++),并使用easy.py对rbf内核进行元素训练。您可以获得生成模型的参数和预测。如果这个预测没问题,请继续使用c ++。从训练中你还可以获得一个缩放的特征文件(每个特征的最小/最大转换为-1.0 / 1.0)。将这些与您的c ++实现进行比较。

一些libsvm问题:一个讨厌的习惯是(如果我没记错的话)在缩放文件中省略了缩放为0(零)的值。 grid.py中的参数是“nr_local_worker”,它定义了多个线程。你可能希望增加它。