gpt4 book ai didi

java - toString() 在不相关的更改后不起作用。我在 WEKA、Java 中找不到 toString()

转载 作者:行者123 更新时间:2023-12-01 04:20:06 28 4
gpt4 key购买 nike

最近在做WEKA,输出随机森林的详细规则。
我正在处理的类具有以下层次关系:

public class RandomForest extends Classifier {
public Bagging m_bagger;
public String toString(){
return "other"+m_bagger.toString();
}
}
public class Bagging extends RandomizableIteratedSingleClassifierEnhancer{
// no relative declaration
public String toString(){
return "other"+m_Classifiers[i].toString(); //changes I made
}
}
public abstract class RandomizableIteratedSingleClassifierEnhancer extends IteratedSingleClassifierEnhancer {
// no relative declaration
// no toString()
}
public abstract class IteratedSingleClassifierEnhancer extends SingleClassifierEnhancer{
public Classifier[] m_Classifiers;
// no toString()
}
public abstract class SingleClassifierEnhancer extends Classifier{
protected Classifier m_Classifier = new ZeroR();
// no toString()
}
public abstract class Classifier{
// no toString()
}

在我更改之前,代码运行良好。
我改了之后,如果我读入数据,自己训练一个WEKA模型,效果也很好。
但是,如果我加载教授给我的模型,然后运行 ​​toString(),它会报告以下几行:

java.lang.NullPointerException
at weka.classifiers.trees.RandomTree.leafString(RandomTree.java:656)
at weka.classifiers.trees.RandomTree.toString(RandomTree.java:678)
at weka.classifiers.trees.RandomTree.toString(RandomTree.java:707)
at weka.classifiers.trees.RandomTree.toString(RandomTree.java:700)

它会无限重复这些行,直到我耗尽内存。

我已经调试过了,发现bug在

m_Classifiers[i].toString()   

相关代码为(RandomForest类中):

if (m_classifier.m_bagger.m_Classifiers == null) {
System.out.println("Bagging: No model built yet.");
}
else {
StringBuffer text = new StringBuffer();
text.append("All the base classifiers: \n\n");
for (int i = 0; i < m_classifier.m_bagger.m_Classifiers.length; i++)
text.append(m_classifier.m_bagger.m_Classifiers[i].toString()+"\n\n"); //It goes wrong here

if (m_classifier.m_bagger.m_CalcOutOfBag) {
text.append("Out of bag error: "
+ Utils.doubleToString(
m_classifier.m_bagger.m_OutOfBagError, 4)
+ "\n\n");
}
System.out.println(text.toString());

如果我调用方法(而不是使用公共(public)变量),它的行为是相同的。

一个有趣的事实是我根本找不到这个 toString() 的定义。当我在这个特定的 toString() (而不是其他)上按 F3 (在 Eclipse 中意味着转到定义)时,它报告“未找到源”
我不知道哪里出了问题,有人可以帮助我吗?

谢谢你一百万。

仅供澄清:
这不应该是索引i的问题,因为我尝试过其他功能,例如

m_Classifiers[i].debugTipText()

它工作完美。
出于同样的原因,我认为 m_Classifiers 不能为 null
我将一些“ protected ”更改为“公共(public)”,但在进行此更改之前它不起作用。

为了回应 Jim 的评论,这里是 RandomTree.java
的 github 代码 https://github.com/HaohanWang/WekaRandomForest/blob/master/src/weka/classifiers/trees/RandomTree.java
抱歉,我没有在这里粘贴代码,因为相关代码大约有100行,从第626行到第715行
eclipse错误中实际上还有更多行,与第656行、第678行、第700行、第707行和第642行相关。所有这些行都调用 leafString()toString(int )
现在我猜我的问题是我没有合适的 int toString(int)

最佳答案

第 656 行是

int maxIndex = Utils.maxIndex(m_Distribution[0]);

因此m_Distribution为空。如果 m_Distribution[0] 为 null,则错误将发生在 Utils.maxIndex 内部,我假设这是一个静态方法。

关于java - toString() 在不相关的更改后不起作用。我在 WEKA、Java 中找不到 toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19019184/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com