在我的java代码中使用WEKA SVM模型时出错(在WEKA中保存后的空SVM模型)

时间:2016-10-24 15:26:12

标签: java android svm weka libsvm

我已经在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。

2 个答案:

答案 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。