#java #api #weka #bayesian-networks
#java #API #weka #байесовские сети
Вопрос:
Кто-нибудь знает «правильную» процедуру изучения байесовской сети на основе данных с использованием WEKA API? Я не могу найти хороших инструкций в документации WEKA.
Основываясь на документации и на том, что «предполагается» делать каждой функции, я подумал, что это сработает:
Instances ins = DataSource.read( filename );
ins.setClassIndex(0);
K2 learner = new K2();
MultiNomialBMAEstimator estimator = new MultiNomialBMAEstimator();
estimator.setUseK2Prior(true);
EditableBayesNet bn = new EditableBayesNet( ins );
bn.initStructure();
learner.buildStructure(bn, ins);
estimator.estimateCPTs(bn);
Но это не так. Я пробовал этот и другие варианты, и я продолжаю получать ArrayIndexOutOfBoundsException
или NullPointerException
где-то внутри кода WEKA, так чего же мне не хватает?
Комментарии:
1. Я искал ресурсы, чтобы начать работу с байесовскими сетями. Посмотрим на упомянутый вами WEKA API.
2. Использует ли сам графический интерфейс WEKA API? Если да, вы могли бы использовать это в качестве примера. Вы также могли бы взглянуть на исходный код, просто чтобы увидеть, имеет ли что-либо из этого смысл.
Ответ №1:
У меня это работает. Я пытался использовать следующий набор данных:
@relation test
@attribute x {0,1}
@attribute y {0,1,2}
@attribute z {0,1}
@data
0,1,0
1,0,1
1,1,1
1,2,1
0,0,0
Позвольте мне упомянуть, что исключения ожидаются, когда ваш целевой атрибут не является номинальным (например, числовым). Байесовские сети работают лучше, когда все ваши атрибуты номинальны. Если вы измените целевой атрибут на числовой, вы получите NullPointerException
или ArrayIndexOutOfBoundsException
. В частности, это исключение выдается в строке:
EditableBayesNet bn = new EditableBayesNet(ins);
Сначала вы должны дискретизировать свой целевой класс.
Комментарии:
1. Я не знаю, что было не так раньше, но теперь это работает и у меня.