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 ответ

Ладно, пошагово, как работает магия:

  1. Ищите часы и терпите неудачу
  2. Спросите на форуме
  3. Попробуйте еще 5 минут и добейтесь успеха

РЕШЕНИЕ: Есть 2! LibSVM.jar файлы в папке пакета weka, и вам нужно ОБА. Так что для всех, кто пытается использовать LibSVM с помощью менеджера пакетов weka, перейдите по адресу: (HOME)\wekafiles\packages\LibSVM Там вы найдете первый FIRST LibSVM.jar

Теперь перейдите по адресу: (HOME)\wekafiles\packages\LibSVM\lib здесь вы найдете libsvm.jar

ДОБАВЬТЕ ОБА ЭТИХ КАРТ В ВАШ СТРОИТЕЛЬНЫЙ ПУТЬ!!!

Привет

Другие вопросы по тегам