libsvm:C++ 与 MATLAB:不同的精度有何不同?

Posted

技术标签:

【中文标题】libsvm:C++ 与 MATLAB:不同的精度有何不同?【英文标题】:libsvm : C++ vs. MATLAB : What's With The Different Accuracies? 【发布时间】:2013-09-23 17:02:13 【问题描述】:

我有两个包含 5 个标签的多类数据集,一个用于训练,另一个用于交叉验证。这些数据集存储为 .csv 文件,因此它们在本实验中充当对照。

我有一个用于 libsvm 的 C++ 包装器,以及用于 libsvm 的 MATLAB 函数。

对于 C++ 和 MATLAB: 使用带有 RBF 内核的 C 类型 SVM,我迭代了 2 个 C 和 Gamma 值列表。对于每个参数组合,我在训练数据集上进行训练,然后预测交叉验证数据集。我将预测的准确性存储在与产生准确性的 C 和 Gamma 值相关的 2D 地图中。

我已经多次重新创建不同的训练和交叉验证数据集。每次,C++ 和 MATLAB 的精度都不一样;有时很多!大多数情况下,MATLAB 产生更高的精度,但有时 C++ 实现更好。

造成这些差异的原因是什么?我尝试的 C/Gamma 值相同,其余 SVM 参数也相同(默认)。

【问题讨论】:

【参考方案1】:

C 和 Matlab 代码都使用 same svm.c 文件,因此应该没有显着差异。那么可能是什么原因呢?

代码中的实现错误,不幸的是,这是最可能的错误 使用的包装器有一些错误和/或使用其他版本的 libsvm 然后你的 matlab 代码(libsvm 是用纯 C 编写的,并带有 python、Matlab 和 java 包装器,所以你的 C++ 包装器是“非官方的”)或你的包装器假设一些额外的默认值,在 C/Matlab/Python/Java 实现中不是默认值 您以某种随机形式执行交叉验证(将数据打乱然后折叠,这是完全正确和合理的,但会在两次不同的运行中导致不同的结果) 在您的一个(或两个)代码中从 .csv 加载数据期间执行了一些舍入/转换,这会导致不一致(确实不太可能发生,但仍有可能发生)

【讨论】:

以上是关于libsvm:C++ 与 MATLAB:不同的精度有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中移植 MATLAB libSVM 参数

matlab里用Libsvm得到模型但是无法得到预测精度

解密SVM系列:matlab下libsvm的简单使用:分类与回归

LibSVM 和 scikit-learn 的不同精度

记录在学习ML过程中,在MATLAB中集成LibSVM时遇到的问题

关于libsvm工具箱在64位matlab下的安装说明