Welcome

首页 / 软件开发 / .NET编程技术 / 贝叶斯网络工具Hugin api的使用

贝叶斯网络工具Hugin api的使用2011-07-24 博客园 小橋流水由于做毕设的需要,最近一直在研究Hugin Expert,一个关于贝叶斯网络的软件,今天有一些眉目, 总结一下,方便自己也方便他人。

Hugin Expert是一款商业软件,提供c、c++、java、.net的api支持,并且有免费的Hugin lite使用, 它的贝叶斯网络支持离散和连续的节点,支持表达式和高斯分布。这是我找了很多软件后最终选择Hugin 的原因。

由于我的毕设打算用java做,所以我开始只看java的api,没想到这该死的java api文档竟然没有一点 例子,郁闷得我不行,上网找也没找到有用的信息。几天后,一个偶然的机会让我打开了.net的api,竟 然发现其中有例子,而且还很详细,惊喜之余赶紧看,终于看明白了。然后就是把.net的转为java就行了 ,这难不倒我,java和.net我都比较熟,应该没什么问题。下面就讲讲我用得到的一些东西。

在api中,用到最多的就是Domain这个类了,它就是指一个贝叶斯网络,可以通过getNodes()方法获得 其中的所有节点。Node代表贝叶斯网络中的一个节点,它是一个基类,子类包括ContinuousChanceNode, DiscreteNode, InstanceNode, UtilityNode。其中ContinuousChanceNode顾名思义就是连续节点了 ,DiscreteNode顾名思义就是离散节点,UtilityNode就是工具节点,InstanceNode,我目前还没有用到 它。DiscreteNode还有子类DiscreteChanceNode, DiscreteDecisionNode,最长用到的是 DiscreteChanceNode。

构建一个贝叶斯网络,可以通过载入某个文件,也可以新建一个网络,下面的代码演示,载入一个网 络:Domain domain = new Domain("C:\Program Files\Hugin Expert\Hugin Lite 7.0 \Samples\fire.net", new DefaultClassParseListener());,新建一个网络更简单,只要调用Domian 的无参构造就好了。

现在由于自己也研究得不是很通,就不多做叙述了,贴一下代码:

package com.ssdut.wangyou;

import COM.hugin.HAPI.*;

public class LoadAndRun {

public static void main(String[] args) throws ExceptionHugin {

Domain domain = new Domain("C:\Program Files\Hugin Expert\Hugin Lite 7.0 \Samples\fire.net", new DefaultClassParseListener());

domain.openLogFile("mylog.log");

domain.compile();

domain.closeLogFile();

domain.propagate(Domain.H_EQUILIBRIUM_SUM, Domain.H_EVIDENCE_MODE_NORMAL);

DiscreteChanceNode node = (DiscreteChanceNode)domain.getNodeByName("Fire");

node.selectState(1);

PrintNodeMarginals(domain);

}

public static void PrintNodeMarginals(Domain domain) throws ExceptionHugin

{

NodeList nlist = domain.getNodes();

for(int i=0; i<nlist.size(); i++)

{

DiscreteChanceNode node = (DiscreteChanceNode)nlist.get(i);

int nStates = node.getNumberOfStates();

System.out.println(node.getLabel());

for (int j = 0; j < nStates; j++)

{

System.out.println(("-" + node.getStateLabel(j) + " " + node.getBelief(j)));

}

}

}

}

上面的代码是载入一个网络,然后将名为Fire的节点设为证据,然后再显示所有节点的概率。如果有 研究Hugin Expert,我们可以一起探讨,请留言。