Java Weka的SMO分类器在buildClassifier上崩溃

Java Weka的SMO分类器在buildClassifier上崩溃,java,classification,weka,text-classification,Java,Classification,Weka,Text Classification,我正在尝试制作一个应用程序,通过使用。我想比较NaiveBayes和SMO分类器的结果。虽然NaiveBayes工作正常,但SMO会因以下错误而崩溃: java.lang.ArrayIndexOutOfBoundsException: 6786 at weka.core.SparseInstance.toDoubleArray(SparseInstance.java:425) at weka.filters.unsupervised.attribute.Normalize.bat

我正在尝试制作一个应用程序,通过使用。我想比较NaiveBayes和SMO分类器的结果。虽然NaiveBayes工作正常,但SMO会因以下错误而崩溃:

java.lang.ArrayIndexOutOfBoundsException: 6786
    at weka.core.SparseInstance.toDoubleArray(SparseInstance.java:425)
    at weka.filters.unsupervised.attribute.Normalize.batchFinished(Normalize.java:283)
    at weka.filters.Filter.useFilter(Filter.java:682)
    at weka.classifiers.functions.SMO.buildClassifier(SMO.java:1312)
    at machinelearning.WekaTutorial.trainClassifier(WekaTutorial.java:106)
    at machinelearning.WekaTutorial.main(WekaTutorial.java:219)
我的应用程序的工作原理有点不同(它有GUI,可以让你搜索推文并选择要分类的推文),但出于测试目的,我修改了教程中原始应用程序的代码,以确保这不是我的错误。我改变了这一行:

classifier = new NaiveBayes();
classifier = new SMO();
关于这一行:

classifier = new NaiveBayes();
classifier = new SMO();

我没有碰其他任何东西,我仍然得到同样的错误。有人知道为什么以及如何修复它吗?

即使一年过去了,它也可能与其他人有关:

首先,提供的教程链接不起作用

现在,对我来说,错误发生在以下情况:

Instances data1 = ... // something with 50 attributes
Instances data2 = ... // something with 30 attributes
Instances data3 = new Instances(data2, data2.numInstances()) // This constructor creates an empty Instances, with the properties of data2.

data3.add(data1.isntance(0));

smo.buildClassifier(data3);
我们刚刚做的是将一个具有50个属性的实例添加到一个具有30个属性的数据集中。我们还在一个具有30个属性的数据集上训练SMO

请注意,如果查询data3.numAttributes(),则输出为30,但如果查询data3.instance(0).numAttributes(),则输出为50

SMO分类器在30个属性上进行训练,它在内部的某个地方查询data3.instance(0).numAttributes(),其中给出了50个属性(对我来说,它在ReplaceMissingValues.class中)

因此,我意识到错误与此差异有关,并确保从data1插入data3的各个实例具有正确数量的属性(例如data2.numAttributes())


这就解决了问题。

您是如何确定的?你一直吃到它还是原来的样子吗?