Какие файлы 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)); 

Однако в строке возникает исключение:

eval.evaluateModel(libsvm, test);

И, несмотря на многочисленные попытки try...catch блоков вокруг этого кода, возникающее исключение просто сообщается как null (что действительно полезно) в соответствии с полной трассировкой стека ниже.

Я не думаю, что эта проблема связана с моим собственным кодом, потому что с ним успешно работают другие классификаторы. Я работаю над теорией, что причиной проблемы является окружающая среда. Но где и что? Я запускаю свое приложение через NetBeans 8 с помощью Tomcat и имею последние версии weka.jar и LibSVM.jar в папке приложения .lib.

Но нужно ли мне 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(HttpSe rvlet.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.u til.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)


person Mr Morgan    schedule 31.07.2014    source источник
comment
если вы предоставили исполняемый минимальный смысл или эквивалент. кода, чтобы воспроизвести проблему, было бы легче вам помочь.   -  person Erik Kaplun    schedule 31.07.2014
comment
Что вам нужно предоставить?   -  person Mr Morgan    schedule 31.07.2014
comment
Я не могу понять, что вы спрашиваете в комментарии.   -  person Erik Kaplun    schedule 31.07.2014
comment
Извинения: я имел в виду, что вам нужно, чтобы я предоставил в дополнение к вопросу как есть?   -  person Mr Morgan    schedule 31.07.2014
comment
именно то, что я прошу в комментарии.   -  person Erik Kaplun    schedule 31.07.2014
comment
Я бы сделал, но я думаю, что только что определил проблему. Всё равно спасибо.   -  person Mr Morgan    schedule 31.07.2014
comment
не забудьте опубликовать ответ тогда.   -  person Erik Kaplun    schedule 31.07.2014


Ответы (1)


Проблема с моим тестовым кодом была связана с окружающей средой, связанной с .jar файлами, необходимыми Weka для программного запуска LibSVM.

Если мой код:

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's Explorer, используя частоты ключевых слов, неравномерно распределенные по 5 категориям данных.

person Mr Morgan    schedule 31.07.2014