【问题标题】:Which Weka and LibSVM .jar files to use in Java code for SVM classification在 Java 代码中使用哪些 Weka 和 LibSVM .jar 文件进行 SVM 分类
【发布时间】:2014-09-23 11:21:56
【问题描述】:

如果我使用 Weka Explorer 来针对使用带有线性内核的 SVM 的测试数据运行一些训练数据,一切都很好。

但我需要在我自己的 Java 中以编程方式执行此操作,而我当前的代码如下所示:

Instances train = new Instances (...);
train.setClassIndex(train.numAttributes() - 1);
Instances test = new Instances (...) + 
ClassificationType classificationType = ClassificationTypeDAO.get(6);       
LibSVM libsvm = new LibSVM();
String options = (classificationType.getParameters());
String[] optionsArray = options.split(" ");                  
libsvm.setOptions(optionsArray);
String[] pars = libsvm.getOptions();     
Evaluation eval = new Evaluation(train);
libsvm.buildClassifier(train);       
eval.evaluateModel(libsvm, test);

System.out.println(eval.toSummaryString("\nResults\n======\n", false)); 

但是,在以下行抛出异常:

eval.evaluateModel(libsvm, test);

尽管在此代码周围多次尝试try...catch 块,但根据下面的完整堆栈跟踪,发生的异常仅报告为null(这非常有用)。

我不认为这个问题是由于我自己的代码造成的,因为其他分类器已经成功地使用它运行了。我正在研究问题的原因是环境的理论。但是在哪里和什么?我正在使用 Tomcat 通过 NetBeans 8 运行我的应用程序,并且在应用程序的 .lib 文件夹中有 weka.jarLibSVM.jar 的最新版本。

但是我是否需要libsvm.jar 提供的下载地址:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

如果是后者,我该如何解决 Windows 中 LibSVM.jarlibsvm.jar 被视为同一个文件的命名冲突?

在过去的几个小时里,这真的让我很困惑。我尝试将LibSVM.jarlibsvm.jar 文件都添加到.lib 文件夹中,将它们都重命名,将它们放入新定义的CLASSPATH,但没有任何效果。

Java 异常的完整堆栈跟踪是:

空 weka.classifiers.functions.LibSVM.distributionForInstance(LibSVM.java:1489) weka.classifiers.Evaluation.evaluationForSingleInstance(Evaluation.java:1560) weka.classifiers.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1597) weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1477) visualRSS.test.Weka_LibSVM_Test.classify(Weka_LibSVM_Test.java:48) visualRSS.initialisation.TestProgram_Context_Listener.contextInitialized(TestProgram_Context_Listener.java:29) org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972) org.apache.catalina.core.StandardContext.start(StandardContext.java:4467) org.apache.catalina.core.StandardContext.reload(StandardContext.java:3228) org.apache.catalina.manager.ManagerServlet.reload(ManagerServlet.java:943) org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:361) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)

【问题讨论】:

  • 如果您提供了可运行的最小要点或等效项。重现问题的代码,它会更容易帮助你。
  • 您需要提供什么?
  • 我听不懂你在评论里问什么。
  • 道歉:我的意思是除了问题之外,您还需要我提供什么?
  • 正是我在评论中要求的。

标签: java jar weka libsvm


【解决方案1】:

我的测试代码的问题在于环境与 Weka 以编程方式运行 LibSVM 所需的 .jar 文件有关。

如果我的代码是:

public static void classify() {      
    try {            
        Instances train = new Instances (...);            
        train.setClassIndex(train.numAttributes() - 1);         
        Instances test = new Instances (...);            
        test.setClassIndex(test.numAttributes() - 1);                      
        ClassificationType classificationType = ClassificationTypeDAO.get(6);  // 6 is SVM.        
        LibSVM classifier = new LibSVM();
        String options = (classificationType.getParameters());
        String[] optionsArray = options.split(" ");                          
        classifier.setOptions(optionsArray);        
        classifier.buildClassifier(train);        
        Evaluation eval = new Evaluation(train);
        eval.evaluateModel(classifier, test);
        System.out.println(eval.toSummaryString("\nResults\n======\n", false));       
    } 
    catch (Exception ex) {            
        Misc_Utils.printStackTrace(ex);
    }                       
}

我发现我需要将weka.jar(来自Weka)和libsvm.jar(来自http://www.csie.ntu.edu.tw/~cjlin/libsvm/)放在应用程序的.lib文件夹中。但由于Windows中的命名冲突,我将文件重命名为LibSVM.jar (来自 Weka)到 LibSVM_Weka.jar 并将其添加到 .lib 文件夹中。

运行程序,我现在得到了与 Weka 的 Explorer 匹配的结果,使用的关键字频率在 5 类数据中分布不均。

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 2012-05-14
    • 2012-07-27
    • 2016-03-28
    • 2012-07-24
    • 2011-07-10
    • 2015-10-27
    • 2016-04-02
    • 2015-07-07
    相关资源
    最近更新 更多