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: weka.classifiers.bayes.net.estimate.DiscreteEstimatorBayes.getProbability(DiscreteEstimatorBayes.java:106) で 4 weka.classifiers.bayes.net.estimate.SimpleEstimator.distributionForInstance(SimpleEstimator.java:183) でweka.classifiers.bayes.BayesNet.distributionForInstance(BayesNet.java:386) で weka.classifiers.Classifier.classifyInstance(Classifier.java:84) で ensembleClassifiersV2.EnsembleClassifierV2.bayesNet1(EnsembleClassifierV2.java:1090) で ensembleClassifiersV2.EnsembleClassifierV2.performing (EnsembleClassifierV2.java:800) at ensembleClassifiersV2.EnsembleClassifierV2.main(EnsembleClassifierV2.java:1267)

誰が何が間違っているのか教えてもらえますか?

4

2 に答える 2

0

私も同じ問題を抱えてる。私の失敗は、テスト データのクラスを設定していなかったことです。それと同じくらい簡単です。

于 2013-06-16T15:20:45.910 に答える
0

このエラーはdistributionForInstance()、名義属性を扱っているときに、さまざまな分類子の多くのメソッドで一般的に発生することがわかりました。

この場合、テスト データには、トレーニング データにない属性値を持つ公称属性がある可能性があります。

この場合、それはあなたがしていることにとって最良の決定が何であるかに本当に依存します. おそらく、データ自体の整合性をチェックすることが最初のステップであり、そこから先に進みます。

于 2016-12-23T19:51:08.737 に答える