我尝试将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,则会收到以下错误:
java.lang.Exception:libsvm类不在CLASSPATH中! weka.classifiers.functions.LibSVM.buildClassifier(LibSVM.java:1636) weka.classifiers.evaluation.Evaluation.crossValidateModel(Evaluation.java:764) weka.classifiers.Evaluation.crossValidateModel(Evaluation.java:374) totd.BuildModel.LibSVMClassifier.buildModel(LibSVMClassifier.java:34) totd.GUI.Gui $ 5.actionPerformed(Gui.java:215)
如果我将项目导出到可运行的jar并在没有安装weka的另一台机器上使用它,如果我首先运行J48算法,也会发生错误。所以无论我能在另一台机器上使用LibSVM。
我已经阅读了有关此问题的所有其他问题,但我没有解决方案。为了防止答案在这里无法帮助我做一些不起作用的事情:
我不理解的可能解决方案,但如果有人详细解释,我认为可能会有效:
https://stackoverflow.com/a/13766120/5006670在这篇文章中提到从SVNLib获取.class文件(我想是SVM?)并将它们添加到我的构建路径中。我不明白他说的是哪些文件,以及如果我找到它,我将如何编译make文件。但这听起来像是我的错误信息。
https://weka.wikispaces.com/LibSVM谈论使用反射。我不确定如何使用
使用批处理文件与带有-classpath命令的LibSVM.jar一起启动jar文件
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;
}
}
我的构建路径
答案 0 :(得分:5)
好的,了解神奇的工作方式:
- 搜索小时数并失败
- 在论坛上提问
- 再试5分钟并成功
醇>
解: 有2个! weka包文件夹中的LibSVM.jar文件,你需要两个。 因此,对于尝试使用weka包管理器使用LibSVM的所有人,请访问: (HOME)\ wekafiles \包\ LIBSVM 在那里你找到第一个FIRST LibSVM.jar
现在去: (HOME)\ wekafiles \包\ LIBSVM \ LIB 在这里你会找到libsvm.jar
将这些JAR添加到您的构建路径中!!!
问候