Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的java代码中使用WEKA SVM模型时出错(将SVM模型保存在WEKA中后为空)_Java_Android_Svm_Weka_Libsvm - Fatal编程技术网

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

在我的java代码中使用WEKA SVM模型时出错(将SVM模型保存在WEKA中后为空),java,android,svm,weka,libsvm,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的版本与我用于训练模型的

我已经在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中没有

如果您显示的模型内容是“svm.model”文件的实际内容,那么这就是罪魁祸首

WEKA中的模型文件是序列化的Java对象。它们可以通过训练一个与模型等价的分类器来创建。该文件可能不是人类可读的

下面是基于我链接的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();

然后,您在问题中发布的代码可以加载并使用该模型。

更新:我尝试了WEKA SMO(支持向量机分类器),它在我的代码中运行良好,但不是LIBSVM。向我们展示调用
classifyInstance
@Sentry code的代码添加到原始问题中。看起来
分类器
null
,因此使用SerializationHelper加载它会出错。从远处很难说原因是什么。你能检查一下文件“svm.model”是否存在,以及它是否包含有效的模型吗?@Sentry你可能是对的。模型文件存在,但当我尝试在WEKA中重新加载它时,只有特性,没有其他特性。看起来WEKA没有正确保存模型?我刚刚在这里更新了模型的内容。我认为这是WEKA方面的问题,而不是java或android方面的问题。我尝试了一个答案,我知道这可能不是人类可读的。然而,在保存的SVM模型中没有任何信息。我使用了WEKA的SMO分类器,它也实现了支持向量机,但是有关于模型的信息。当我加载一个经过训练的SMO分类器时,它包含关于模型的信息,但是,LIBSVM分类器是空的。在WEKA中保存模型意味着其已序列化。我对其他分类器使用了相同的方法,它们在我的代码中工作得很好。所以问题似乎在于如何将libsvm模型保存在weka中。您使用的是什么weka版本,以及从哪里获得的用于weka的libsvm分类器?这些可能也是添加到原始问题的好信息。我添加了weka版本。weka只有一个版本的libsvm,我主要使用的是weka 3.6,为此我不得不单独下载libsvm。我去看看,看能不能找到有用的东西。谢谢。是的,3.6版曾经是这样,但我想从3.7版开始就不是这样了。