使用Weka分类器时出现Nullpointer异常

时间:2014-06-10 18:49:45

标签: java weka

我正在使用Weka通过Java API创建分类器。 实例是使用java代码创建的。 分类器也是通过传递以下

从代码创建的
String args[]=" -x 10 -s 1 -W weka.classifiers.functions.Logistic".split(" ");

String classname;
String[] tmpOptions = Utils.splitOptions(Utils.getOption("W", args));
classname = tmpOptions[0];
System.out.println(classname);
Classifier cls = (Classifier) Utils.forName(Classifier.class, classname, tmpOptions);

它工作正常并且交叉验证。

之后我再次加载我的训练实例并将其输出标记为? 并使用

将其传递给分类器
for (int index = 0; index < postDatas.size(); index++) {
    Instance instance = nominal.instance(index);

    double label = classifier.classifyInstance(instance);

    System.out.println(label);  

}

classifier.classifyInstance(instance);给了我以下例外情况:

java.lang.NullPointerException
    at weka.classifiers.functions.Logistic.distributionForInstance(Logistic.java:710)

我出错的地方的任何线索?

1 个答案:

答案 0 :(得分:0)

由于你没有提供所有相关信息,我会在黑暗中拍摄:

我假设您使用的是Weka版本3.7.5,我在网上发现了以下source code for Logistic.java

public double [] distributionForInstance(Instance instance) throws Exception {
    // line 710
    m_ReplaceMissingValues.input(instance);
    instance = m_ReplaceMissingValues.output();
    ...
}

假设您没有为null传递instance,则只会离开m_ReplaceMissingValues。调用方法Logistic.buildClassifier(Instances train)时初始化该成员:

public void buildClassifier(Instances train) throws Exception {
    ...
    // missing values   
    m_ReplaceMissingValues = new ReplaceMissingValues();
    m_ReplaceMissingValues.setInputFormat(train);
    train = Filter.useFilter(train, m_ReplaceMissingValues);
    ...
}

在行中创建对象后,您似乎从未在任何数据上训练过分类器Logistic

Classifier cls = (Classifier) Utils.forName(Classifier.class, classname, tmpOptions);