我已经在WEKA(3.7.3)中训练了LIBSVM模型,现在想在我的java代码中使用它。但是,我得到了一个例外。
Exception:Attempt to invoke interface method 'double weka.classifiers.Classifier.classifyInstance(weka.core.Instance)' on a null object reference
所有其他模型在这个java代码中都可以正常工作。此外,WEKA jar的版本与我用于训练模型的版本完全相同。我的应用程序中没有任何LIBSVM jar,因为我正在使用经过训练的模型。我是否需要在我的应用程序中放置LIBSVM jar?
我在这里缺少什么?
inputStream = getApplicationContext().getAssets().open("svm.model");
classifier = (Classifier) weka.core.SerializationHelper.read(inputStream);
这是模型的内容:
=== Model information ===
Filename: svm.model
Scheme: weka.classifiers.functions.LibSVM -S 0 -K 2 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 -P 0.1 -model "D:\\Program Files (x86)\\Weka-3-7" -seed 1
Relation: Sho_gsw30SVRNULL-weka.filters.unsupervised.attribute.Remove-R5-13,18-26,31-39,44-130
Attributes: 17
F1
F2
F3
F4
F14
F15
F16
F17
F27
F28
F29
F30
F40
F41
F42
F43
class
=== Classifier model ===
LibSVM wrapper, original code by Yasser EL-Manzalawy (= WLSVM)
更新 我尝试了WEKA SMO(支持向量机分类器),它在我的代码中工作正常,但不是LIBSVM。
答案 0 :(得分:1)
如果您作为模型内容显示的内容是" svm.model"的实际内容。文件,那就是罪魁祸首。
WEKA中的模型文件是序列化的Java对象。它们可以通过训练分类器来创建,该分类器等同于模型,serializing that Java WEKA classifier object into a file。该文件可能不是人类可读的。
以下是基于我链接的WEKA网站序列化模型的代码:
// classifier will be your SVM classifier here
// and instances the training instances
classifier.buildClassifier(instances);
// serialize model
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("svm.model"));
oos.writeObject(classifier);
oos.flush();
oos.close();
然后,您可以通过您在问题中发布的代码加载和使用该模型。
答案 1 :(得分:0)
更新:我尝试了WEKA SMO(支持向量机分类器),它在我的代码中工作正常,但不是LIBSVM。