WEKA:如何获得BayesNet中每个节点的CPT值?

时间:2015-03-06 01:31:22

标签: weka bayesian-networks

我以无人监督的方式使用BayesNet和SimpleEstimator并寻找网络的联合分布。 我知道通过使用以下内容:

BayesNet bn=new BayesNet();
...
SimpleEstimator sbne = new SimpleEstimator();
sbne.estimateCPTs(bn);
...
distributionForInstance(bn,testingsource.instance( i ))

我们将得到例如i的类索引的条件概率表(CPT)。但是,我不知道如何获得每个其他节点的(CPT)(除了类索引)。

一种方法是递归更改类索引并再次调用此函数,但这样效率非常低。

如果您帮我检索每个其他节点的估计CPT,我将非常感激。

1 个答案:

答案 0 :(得分:0)

在BayesNet类上尝试getProbability方法。这就是我的工作。

for(int i = 0; i < bnet.getCardinality(nodeIndex); i++)
      {
        System.out.print(bnet.getNodeValue(nodeIndex, i) + " = " + bnet.getProbability(nodeIndex, row, i) + " ");
      }

其中row为0&lt; = row&lt; bnet.getParentCardinality()和行的每个值对应父父输出符号的单个组合。

因此,如果您的节点有2个父节点,并且每个父节点输出2个符号,那么您将得到0&lt; = row&lt; 4(2个父母x 2个符号)

row = 0对应于索引0处的组合0,0 //符号值(对于索引为0的父项,符号值为0处,对于索引为1的父项)

row = 1对应于组合0,1

row = 2对应于父0的索引1处的组合1,0 //符号值,依此类推。

row = 3对应于组合1,1


以下是示例输出

-----节点--------------

姓名:TuberculosisOrCancer父母:2:LungCancer Tuberculosis

节点可以采用的值的数量:2

[0] =是//索引和值

[1] = no //索引和值

发行---

当LungCancer =是,结核病=否

是= 0.9990990990990991否= 9.009009009009009E-4

当LungCancer =是,结核病=是

是= 0.9444444444444444否= 0.05555555555555555

当LungCancer = no时,结核病=否

是= 5.3475935828877E-5否= 0.9999465240641712

当LungCancer = no时,结核=是

是= 0.9944444444444445否= 0.005555555555555556