如何使用WEKA API学习贝叶斯网络(结构+参数)?

tru*_*ity 7 java api bayesian-networks 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);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.我已经尝试了这个和其他变化,我一直在WEKA代码中ArrayIndexOutOfBoundsException或者NullPointerException某个地方,所以我错过了什么?

Pan*_*kis 5

这个对我有用.我尝试了以下数据集:

@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
Run Code Online (Sandbox Code Playgroud)

让我提一下,当您的目标属性不是名义上(例如数字)时,会出现异常.当所有属性都是名义上时,贝叶斯网络可以更好地工作.如果您将目标属性更改为数字,您将获得一个NullPointerException或一个ArrayIndexOutOfBoundsException.特别是,这个异常被抛出:

EditableBayesNet bn = new EditableBayesNet(ins);
Run Code Online (Sandbox Code Playgroud)

您应首先将目标类离散化.