【问题标题】:SMO classifier from Weka crashes on buildClassifierWeka 的 SMO 分类器在 buildClassifier 上崩溃
【发布时间】:2015-08-05 15:34:14
【问题描述】:

我正在尝试制作一个使用this tutorial 对推文的情绪进行分类的应用程序。我想比较朴素贝叶斯和 SMO 分类器的结果。虽然朴素贝叶斯工作正常,但 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();

我没有碰任何其他东西,但我仍然遇到同样的错误。有谁知道为什么以及如何解决它?

【问题讨论】:

    标签: java classification weka text-classification


    【解决方案1】:

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

    首先提供的教程链接无效。

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

    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())。

    这解决了问题。

    【讨论】:

    • 你是如何确定的?你有没有 deleteAttributeAt 直到它是一样的?
    猜你喜欢
    • 2012-08-19
    • 2012-08-23
    • 2014-05-31
    • 2014-03-28
    • 2016-09-15
    • 2015-07-07
    • 2014-07-03
    • 2023-04-08
    • 2012-06-02
    相关资源
    最近更新 更多