哪个Weka和LibSVM .jar文件在Java代码中用于SVM分类
如果我使用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));
但是,正在抛出exception:
eval.evaluateModel(libsvm, test);
尽管在此代码周围尝试了多次尝试try...catch
块,但是根据下面的完整堆栈跟踪,发生的exception只是报告为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
,但没有任何作用。
Javaexception的完整堆栈跟踪是:
null 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:15 55)
我的测试代码的问题与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); } }
我发现我需要在应用程序的.lib
文件夹中放置weka.jar
(来自Weka)和libsvm.jar
(来自http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 。但是因为在Windows中命名冲突,我将文件LibSVM.jar
(从Weka)重命名为LibSVM_Weka.jar
并将其添加到.lib
文件夹中。
运行程序我现在的结果与Weka的资源管理器相匹配,使用的关键字频率在5类数据中分布不均匀。