ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

其中Weka和LibSVM .jar文件在Java代码中用于SVM分类

2019-08-30 16:02:55  阅读:278  来源: 互联网

标签:libsvm java jar weka


如果我使用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);

尽管在此代码周围尝试了很多尝试… 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异常的完整堆栈跟踪是:

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:1555)

解决方法:

我的测试代码的问题与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(来自应用程序的.lib文件夹中的http://www.csie.ntu.edu.tw/~cjlin/libsvm/.但是由于Windows中的命名冲突,我将文件LibSVM.jar(来自Weka)重命名为LibSVM_Weka .jar并将其添加到.lib文件夹中.

运行程序我现在的结果与Weka的资源管理器相匹配,使用的关键字频率在5类数据中分布不均匀.

标签:libsvm,java,jar,weka
来源: https://codeday.me/bug/20190830/1769346.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有