【问题标题】:Nullpointer exception while using Weka classifier使用 Weka 分类器时出现 Nullpointer 异常
【发布时间】:2014-07-31 16:07:34
【问题描述】:

我正在使用 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)

我哪里出错了有什么线索吗?

【问题讨论】:

  • 这是你的线索:“Logistic.java:710”。那是什么线?
  • 它是 weka api 的一部分。我非常感谢您在否决之前理解这个问题。这不是一个 java 问题,更多的是一个 weka 问题。我是一名 Oracle 认证的 java 开发人员,可以自己解决 java 问题。
  • 我们无法调试我们看不到的代码。
  • 感谢 Takendarkk,它不是 java 问题,而是 weka 问题。
  • 如果您将完整的堆栈跟踪添加到您的问题中会有所帮助。

标签: java weka


【解决方案1】:

由于您没有提供所有相关信息,我将在黑暗中试一试:

我假设您使用的是 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);

【讨论】:

  • 是的,我通过调用 buildClassifier 解决了这个问题。我实际上是在做交叉验证和构建模型,但它在分类器.copy().buildClassifier 上。谢谢!
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多