【问题标题】:i need to pass this files to WEKA classifiers by c++ code我需要通过 C++ 代码将此文件传递给 WEKA 分类器
【发布时间】:2016-05-27 19:24:23
【问题描述】:

我正在编写一个 C++ 项目并在 C++ 代码中创建了 ARFF 文件,因此我需要使用 C++ 将这些文件传递给 WEKA 分类器。 我尝试使用系统调用但遇到错误。 我将偶尔使用对 WEKA 的系统调用来获取一些机器学习信息。首先,我想确保训练模型 (training.model) 是最新的。所以,在main()的开头,我调用:

system("\"java weka.classifiers.trees.J48 -t ML_data.arff -d training.model\"");

如何在 C++ 代码中调用 WEKA 分类器?

【问题讨论】:

  • 发布您在执行此代码时收到的确切错误或您观察到的让您认为遇到错误的行为。
  • 我的建议是否解决了问题?我真的很好奇。
  • 是的,但Linux仍然给我错误错误:无法找到或加载主类weka.classifiers.functions.Logistic
  • 好的,我想我知道那是什么,请参阅更新的答案。
  • 现在好点了吗?设置类路径能解决问题吗?

标签: c++ weka system-calls


【解决方案1】:

我认为错误在于双引号:

system("\"java weka.classifiers.trees.J48 -t ML_data.arff -d training.model\"");
//      ^^                                                                 ^^

这段代码应该如下:

system("java weka.classifiers.trees.J48 -t ML_data.arff -d training.model");

您似乎正在使用\" 将双引号传递给system() 调用,但这太过分并且会导致错误。 (转义双引号的语法是正确的,但您不需要将额外的引号传递给system() 函数。)

下面是一个最小的测试用例,展示了使用您使用的语法在 Linux 上发生了什么:

#include <cstdlib>

int main(void)
{
        system("\"ls -l\"");
}

输出:

sh: ls -l: 找不到命令

另一方面,代码system("ls -l"); 正确调用ls -l 并在控制台中显示输出。

编辑:

就您的第二条错误消息而言:

错误:无法找到或加载主类 weka.classifiers.functions.Logistic

这是一个很常见的问题:What does “Could not find or load main class” mean?。例如,您需要将类路径设置为指向系统中的 weka.jar,如下所示(将确切路径更改为您的发行版中的路径):

system("java -cp /usr/share/java/weka.jar weka.classifiers.trees.J48 -t ML_data.arff -d training.model");

或者在命令行中(注意这里使用export命令)

export CLASSPATH=/usr/share/java/weka.jar:$CLASSPATH

./name_of_your_cpp_executable_file

或将CLASSPATH 放入您的~/.bashrc:

CLASSPATH=/usr/share/java/weka.jar:$CLASSPATH

export CLASSPATH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2020-09-21
    • 2014-01-23
    相关资源
    最近更新 更多