程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 貝葉斯網絡工具Hugin api的使用

貝葉斯網絡工具Hugin api的使用

編輯:關於.NET

由於做畢設的需要,最近一直在研究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,我們可以一起探討,請留言。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved