2016-10-24 78 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