【问题标题】:Supprt Vector Machine works in matlab, doesn't work in c++支持向量机在 matlab 中有效,在 c++ 中无效
【发布时间】:2012-11-20 03:25:23
【问题描述】:

我正在编写一个使用 SVM 对某些图像(特别是 these)进行分类的应用程序。我的 Matlab 实现效果很好。使用 SIFT bag-of-words 方法,我能够通过线性内核获得接近 100% 的准确率。

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

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

【问题讨论】:

  • 也许你应该告诉 SVM == 支持向量机...

标签: c++ matlab machine-learning svm


【解决方案1】:

Matlab 版本的库并没有什么神奇之处,只是它在 Matlab 中运行,这让你更难自食其果。

检查清单:

  1. 您是否对数据进行规范化,使所有值都介于 0 和 1 之间 (或介于 -1 和 1 之间),线性地或使用均值和 标准差?
  2. 您是否正在参数搜索一个好的 C 值(或 C 和 gamma in RBF内核的情况)?进行交叉验证或保留集?
  3. 您确定您正在处理 NaN 和所有其他浮点 肮脏? Matlab 非常擅长向你隐藏这个,C++ 不是这样 很多。
  4. 可能是您加载数据不正确,读取的是 "%s" 变成双精度或其他会为您的输入添加噪音的东西 数据?
  5. 可能是 libsvm/dlib 期望数据按行主要顺序和 您是在专业专栏中发送它(或相反)?再次,Matlab 使这几乎不可能,而 C++ 则不然。
  6. 32-64 位讨厌的库的一个版本,编译后的可执行文件 和另一个?

其他一些事情:

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

【讨论】:

  • 1.我已经尝试过标准化和非标准化数据。 2.我试过参数搜索几乎没有成功。 3. 数据中没有 NaN。我们只是获取直方图并将所有值初始化为零,然后除以最大计数。因为没有一个特征向量是空的,所以这些向量保证是正的。 4. 我很确定不是这样。我尝试打印出传递给 SVM 的向量,它们看起来很好。 5. 这是可能的……我会调查的。 6. 我没有想过要在 32 位上试试这个。我会试一试。其他两项似乎也没有问题
  • 我终于用 OpenCV 的 CvSvm::train_auto 方法让事情合理地工作了。看起来我的参数选择已关闭。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2017-09-19
    • 2012-04-20
    • 2013-03-27
    相关资源
    最近更新 更多