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

WEKA: How to get the CPT values for every node in BayesNet?

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

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

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

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

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

在 BayesNet class 上尝试 getProbability 方法。这是我做的。

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

其中 row 为 0 <= row < bnet.getParentCardinality() 并且 row 的每个值对应于 parent 的输出符号的单个组合。

因此,如果您的节点有 2 parents 并且每个 parent 输出 2 个符号,那么您将有 0 <= 行 < 4(2 parents x 2 个符号)

row = 0 对应于组合 0,0 // 索引 0 处的符号值 parent 处索引 0 和索引 0 处的符号值 parent 处索引 1

行=1对应组合0,1

row = 2 对应于组合 1,0 // parent 0 的索引 1 处的交易品种值,依此类推。

行=3对应组合1,1


这是示例输出

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

姓名:TuberculosisOrCancer parents: 2 : LungCancer Tuberculosis

一个节点可以取值的数量:2

[0] = yes // 索引和值

[1] = 无 // 索引和值

分布---

当肺癌 = 是,结核病 = 否

是=0.9990990990990991否=9.009009009009009E-4

当肺癌 = 是,结核病 = 是

是=0.9444444444444444否=0.05555555555555555

当肺癌 = 否,肺结核 = 否

是=5.3475935828877E-5否=0.9999465240641712

当肺癌 = 否,结核病 = 是

是=0.9944444444444445否=0.005555555555555556