【发布时间】: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.jar 和 LibSVM.jar 的最新版本。
但是我是否需要libsvm.jar 提供的下载地址:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
如果是后者,我该如何解决 Windows 中 LibSVM.jar 和 libsvm.jar 被视为同一个文件的命名冲突?
在过去的几个小时里,这真的让我很困惑。我尝试将LibSVM.jar 和libsvm.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)
【问题讨论】:
-
如果您提供了可运行的最小要点或等效项。重现问题的代码,它会更容易帮助你。
-
您需要提供什么?
-
我听不懂你在评论里问什么。
-
道歉:我的意思是除了问题之外,您还需要我提供什么?
-
正是我在评论中要求的。