WEKA API LibSVM ClassPath не найден
Я пытаюсь использовать LibSVM с Weka API.
Моя система: Win7 Weka 3.7.12 LibSVM 1.0.6 (устанавливается через диспетчер пакетов)
Мой код:
import java.io.File;
import java.util.Random;
import javax.swing.JOptionPane;
import weka.classifiers.Evaluation;
import weka.classifiers.functions.LibSVM;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
public class LibSVMClassifier {
// Method to build a SVM classifier with a given data file
public static double buildModel(File dataSet){
// new instance of LibSVM
LibSVM clsSVM = new LibSVM();
try {
Instances data = DataSource.read(dataSet.getAbsolutePath());
// Sets the label feature
data.setClassIndex(data.numAttributes()-1);
String opts = "-S 0 -K 0 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.0010 -P 0.1";
// set the options for the algorithm
clsSVM.setOptions(weka.core.Utils.splitOptions(opts));
Evaluation eval = new Evaluation(data);
eval.crossValidateModel(clsSVM, data, 2, new Random(1));
return eval.pctIncorrect();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
return 100;
}
}
Код вызывается отсюда:
double error = LibSVMClassifier.buildModel(trainDataSet);
Моя проблема: когда я запускаю свой код и сначала использую свой классификатор J48 (код в конце), а затем LibSVM, все работает нормально.
Если я сначала запускаю LibSVM, я получаю следующую ошибку:
Исключение: классы libsvm не в CLASSPATH! weka.classifiers.functions.LibSVM.buildClassifier(LibSVM.java:1636) weka.classifiers.evaluation.Evaluation.crossValidateModel(Evaluation.java:764) weka.classifiers.Evaluation.crossValidateModel(Evaluation.jtd.ud. 4) LibSVMClassifier.buildModel(LibSVMClassifier.java:34) totd.GUI.Gui$5.actionPerformed(Gui.java:215)
Если я экспортирую проект в исполняемый jar-файл и использую его на другом компьютере без установленного weka, то также произойдет ошибка, если я сначала запусту алгоритм J48. Поэтому независимо от того, что я не могу использовать LibSVM на другой машине.
Я прочитал все другие вопросы, касающиеся этой проблемы, но для меня не было решения. Для того, чтобы предотвратить ответы, которые не помогут мне здесь некоторые вещи, которые не будут работать:
- Объяснение того, как добавить библиотеку в проект: я использовал менеджер пакетов от weka для установки LibSVM, и я добавил полученный jar-файл для LIBSVM AS WELL AS weka jar-файл в путь сборки
- Объяснение того, как использовать LibSVM с weka gui: я хочу использовать LibSVM вместе с weka api программным способом, он уже работает в weka gui, мне это не нужно!!!
- Объяснение того, как изменить путь к классу для вашей системы: я хочу экспортировать свой проект в файл jar и запустить его в любой системе, у которой нет доступа к пути к системному классу
Возможные решения, которые я не понял, но думаю, может сработать, если кто-то подробно объяснит:
/questions/7775051/kak-ispolzovat-libsvm-s-weka-v-moem-kode-java/7775070#7775070 В этом посте упоминается получение файлов.class из SVNLib (я полагаю, SVM?) и добавление их в мой путь сборки. Я не понимаю, о каких файлах он говорит, и как бы я скомпилировал файл make, если бы нашел его. Но это звучит как мое сообщение об ошибке.
https://weka.wikispaces.com/LibSVM рассказывает об использовании рефлексии. Я не уверен, как это используется
использование командного файла для запуска jar-файла вместе с LibSVM.jar с командой -classpath
Код J48:
import java.io.File;
import javax.swing.JOptionPane;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.classifiers.trees.J48;
import weka.classifiers.Evaluation;
import java.util.Random;
public class J48Classifier {
// Method to build a J48 classifier with a given data file
public static double buildModel(File dataSet){
// new instance of tree
J48 clsJ48 = new J48();
try {
Instances data = DataSource.read(dataSet.getAbsolutePath());
// Sets the label feature
data.setClassIndex(data.numAttributes()-1);
String[] options = new String[1];
// unpruned tree
options[0] = "-U";
// set the options for the algorithm
clsJ48.setOptions(options);
Evaluation eval = new Evaluation(data);
eval.crossValidateModel(clsJ48, data, 2, new Random(1));
return eval.pctIncorrect();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
return 100;
}
}
Мой путь сборки
1 ответ
Ладно, пошагово, как работает магия:
- Ищите часы и терпите неудачу
- Спросите на форуме
- Попробуйте еще 5 минут и добейтесь успеха
РЕШЕНИЕ: Есть 2! LibSVM.jar файлы в папке пакета weka, и вам нужно ОБА. Так что для всех, кто пытается использовать LibSVM с помощью менеджера пакетов weka, перейдите по адресу: (HOME)\wekafiles\packages\LibSVM Там вы найдете первый FIRST LibSVM.jar
Теперь перейдите по адресу: (HOME)\wekafiles\packages\LibSVM\lib здесь вы найдете libsvm.jar
ДОБАВЬТЕ ОБА ЭТИХ КАРТ В ВАШ СТРОИТЕЛЬНЫЙ ПУТЬ!!!
Привет