[英]WEKA API LibSVM ClassPath not found
我正在嘗試將 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(我想是 SVM?)獲取 .class 文件並將這些文件添加到我的構建路徑中。 我不明白他在談論哪些文件,以及如果我找到它我將如何編譯 make 文件。 但這聽起來像我的錯誤信息。
https://weka.wikispaces.com/LibSVM談論使用反射。 我不確定這是如何使用的
使用批處理文件與 LibSVM.jar 一起使用 -classpath 命令啟動 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;
}
}
我的構建路徑
好的,步驟魔術是如何工作的:
- 搜索數小時並失敗
- 在論壇上提問
- 再嘗試 5 分鍾並成功
解決方案:有 2 個! weka 包文件夾中的 LibSVM.jar 文件,您需要兩者。 因此,對於所有嘗試使用 weka 包管理器使用 LibSVM 的人,請轉到: (HOME)\\wekafiles\\packages\\LibSVM 在那里您可以找到第一個 LibSVM.jar
現在去: (HOME)\\wekafiles\\packages\\LibSVM\\lib 在這里你會找到 libsvm.jar
將這兩個 JAR 添加到您的構建路徑中!!!
你好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.