0

我已经写了这个方法。我想写一个贝叶斯网络,但我在classifyInstance()方法上遇到了一个异常。

这是我的代码:

public static double bayesNet1(Dataset data, Dataset testingSet) throws Exception {

        Instances insts = convertTxtToARFF(data);
        K2 learner = new K2();
        MultiNomialBMAEstimator estimator = new MultiNomialBMAEstimator();
        estimator.setUseK2Prior(true);

        EditableBayesNet bn = new EditableBayesNet(insts);
        bn.initStructure();
        learner.buildStructure(bn, insts);
        estimator.estimateCPTs(bn);

        double error = 0;

        Instances instsTest = convertTxtToARFF(testingSet);

        for(int i=0; i<instsTest.numInstances()-1; i++) {

        weka.core.Instance inst = instsTest.instance(i);

        double  predictedValue = bn.classifyInstance(inst);

        if(inst.value(inst.classIndex())!= predictedValue)

            error++;

        }

        return error/instsTest.numInstances();
    }

这是一个例外:

java.lang.ArrayIndexOutOfBoundsException: 4 at weka.classifiers.bayes.net.estimate.DiscreteEstimatorBayes.getProbability(DiscreteEstimatorBayes.java:106) at weka.classifiers.bayes.net.estimate.SimpleEstimator.distributionForInstance(SimpleEstimator.java:183) at weka.classifiers.bayes.BayesNet.distributionForInstance(BayesNet.java:386) at weka.classifiers.Classifier.classifyInstance(Classifier.java:84) at ensembleClassifiersV2.EnsembleClassifierV2.bayesNet1(EnsembleClassifierV2.java:1090) at ensembleClassifiersV2.EnsembleClassifierV2.performing (EnsembleClassifierV2.java:800) 在 ensembleClassifiersV2.EnsembleClassifierV2.main(EnsembleClassifierV2.java:1267)

谁能帮我出什么问题?

4

2 回答 2

0

我也有同样的问题。我的错是我没有为测试数据设置类。就如此容易。

于 2013-06-16T15:20:45.910 回答
0

我发现在distributionForInstance()处理名义属性时,许多不同分类器的方法中通常会出现此错误。

如果是这种情况,则可能是测试数据具有一个名义属性,而该属性值是训练数据所缺乏的。

在这种情况下,这实际上取决于您正在做的最佳决定是什么。也许检查数据本身的一致性是第一步,然后你从那里开始。

于 2016-12-23T19:51:08.737 回答