2016-10-24 48 views
1

我已经在WEKA(3.7.3)中训练过LIBSVM模型,现在想在我的java代码中使用它。但是,我收到一个例外。在我的java代码中使用WEKA SVM模型时出错(保存在WEKA中后为空SVM模型)

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

向我们显示您调用'classifyInstance'的代码 – Sentry

+0

@Sentry代码被添加到原始问题中。 – utengr

+0

好像'classifier'是'null',所以使用SerializationHelper加载它出错了。很难从远处说出原因。你可以检查文件“svm.model”是否存在,是否包含有效的模型? – Sentry

回答

0

更新:我试过WEKA SMO(支持向量机分类器),它在我的代码中工作正常,但不是LIBSVM。

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(); 

该模型然后可以加载和你张贴在你的问题的代码中使用。

+0

我知道它可能不是人类可读的。但是,保存的SVM模型中根本没有任何信息。我使用了WEKA的SMO分类器,它也实现了支持向量机,但是有关于模型的信息。当我加载一个训练过的SMO分类器时,它包含有关其中的模型的信息,但LIBSVM分类器是空的。在WEKA中保存模型意味着它的序列化。我使用了与其他分类器相同的方法,它们在我的代码中工作正常。所以问题似乎是在weka中保存libsvm模型。 – utengr

+0

您使用的是什么Weka版本,以及您获得Weka的LibSVM分类器的位置?这些也许是增加原始问题的好信息。 – Sentry

+0

我已添加weka版本。 WEKA附带的weka只有一个版本的libsvm。 – utengr