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

Supprt Vector Machine works in matlab, doesn't work in c++

本文关键字:c++ 不起作用 工作 matlab Vector Machine Supprt      更新时间:2023-10-16

我正在编写一个应用程序,它使用SVM对一些图像(特别是这些图像)进行分类。我的Matlab实现非常好。使用SIFT单词袋方法,我能够用线性内核获得接近100%的准确率。

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

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

除了在Matlab中运行之外,Matlab版本的库没有什么神奇之处,这会让你更难开枪。

检查清单:

  1. 是否对数据进行标准化,使所有值都在0和1之间(或在-1和1之间),线性或使用平均值和标准偏差
  2. 你是在参数搜索中寻找一个好的C值吗RBF核的情况)?进行交叉验证还是在搁置集上
  3. 你确定你在处理NaN和所有其他浮点肮脏?Matlab非常善于向你隐藏这一点,C++则不然很多
  4. 可能是你加载数据不正确,读取了将"%s"转换为双精度或其他会给您的输入添加噪声的东西数据
  5. 可能是libsvm/dlib期望数据按行主顺序排列你是在专栏专业(或者反过来)发的?再次,Matlab使这几乎是不可能的,C++没有那么多
  6. 32-64位肮脏的一个版本的库,可执行编译和另一个

其他一些东西:

  1. 可能是在Matlab中以某种方式将类(y)泄漏到预处理?没有人故意这么做,但我亲眼目睹了这种情况的发生。如果你把几乎任何一个f(y)作为一个特征,你会得到几乎100%每次
  2. 有时,验证一切都是数字的会有所帮助在C++和Matlab

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

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