Кои 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.listen erStart(Стандартен контекст .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$Http11Conne ctionHandler .process(Http11AprProtocol.java:579) org.apache.tomcat.util.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