如何使用贝叶斯网络工具箱2004-1-7版翻译:By 斑斑(QQ:23920620)联系方式:banban23920620@安装安装Matlab源码安装C源码有用的Matlab提示创建你的第一个贝叶斯网络手工创建一个模型从一个文件加载一个模型使用GUI创建一个模型推断处理边缘分布处理联合分布虚拟证据最或然率解释条件概率分布列表(多项式)节点Noisy-or节点其它(噪音)确定性节点Softmax(多项式 分对数)节点神经网络节点根节点高斯节点广义线性模型节点分类 / 回归树节点其它连续分布CPD类型摘要模型举例高斯混合模型PCA、ICA等专家系统的混合专家系统的分等级混合QMR条件高斯模型其它混合模型参数学习从一个文件里加载数据从完整的数据中进行最大似然参数估计先验参数从完整的数据中(连续)更新贝叶斯参数数据缺失情况下的最大似然参数估计(EM算法) 参数类型结构学习穷举搜索K2算法爬山算法MCMC主动学习结构上的EM算法肉眼观察学习好的图形结构基于约束的方法推断函数联合树消元法全局推断方法快速打分置信传播采样(蒙特卡洛法)推断函数摘要影响图 / 制定决策DBNs、HMMs、Kalman滤波器等等安装安装Matlab代码1.下载FullBNT.zip文件。
2.解压文件。
3.编辑"FullBNT/BNT/add_BNT_to_path.m"让它包含正确的工作路径。
4.BNT_HOME = 'FullBNT的工作路径';5.打开Matlab。
6.运行BNT需要Matlab版本在V5.2以上。
7.转到BNT的文件夹例如在windows下,键入8.>> cd C:\kpmurphy\matlab\FullBNT\BNT9.键入"add_BNT_to_path",执行这个命令。
添加路径。
添加所有的文件夹在Matlab的路径下。
10.键入"test_BNT",看看运行是否正常,这时可能产生一些数字和一些警告信息。
(你可以忽视它)但是没有错误信息。
11.仍有问题?你是否编辑了文件?仔细检查上面的步骤。
创建你的第一个贝叶斯网络为了定义一个贝叶斯网络,你必须指定它的图形结构和参数。
我们用一个简单的例子依次看一下它们。
(根据Russell and Norvig, "Artificial Intelligence: a Modern Approach", Prentice Hall, 1995, p454改编)图形结构设想如下网络我们创建一个相邻矩阵来指定这个有向无环图N = 4;dag = zeros(N,N);C = 1; S = 2; R = 3; W = 4;dag(C,[R S]) = 1;dag(R,W) = 1;dag(S,W)=1;我们给节点按照如下编号:Cloudy = 1, Sprinkler = 2, Rain = 3, WetGrass = 4.在拓扑次序中,节点是必须被编号的,也就是说:父节点要在子节点前。
对于一个更复杂的图来说,这有点麻烦:我们将在下面(以后)看一看如何避免这个。
*注:在原文中“下面”是使用的超链接,因此,这里的下面并不一定等同目前的上下文关系。
后面的文中也是如此,为方便区别,我将把非上下文关系的“下面”翻译为“以后”或“后面”。
在Matlab6中,你可以使用逻辑数组来代替双重数组,这样可以缩小四倍。
dag = false(N,N);dag(C,[R S]) = true;..然而,一些图的功能(比如 无环的)不支持逻辑数组你可以使用后面讨论的方法来观察结果图形结构。
关于GUIs的详细内容,点击这里。
创建贝叶斯网络的框架除了指定图形结构,我们必须指定每个节点的大小和类型。
如果一个节点是离散的,它的大小就是该节点可能采取的数值;如果一个节点是连续的,它就是一个矢量,它的大小就是矢量的长度。
在这个例子中,我们假定所有的节点是离散的和二进制的。
discrete_nodes = 1:N;node_sizes = 2*ones(1,N);如果节点不是二进制的,我们可以这样键入。
node_sizes = [4 2 3 5];这意味Cloudy有四种可能的值,Sprinkler有两种可能的值等等。
注意,这些都是基数而不是序数。
他们不能用任何方式排序,如“低”“中”“高”现在,我们准备建立贝叶斯网络:bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes);默认情况下,所有的节点都被假定为离散的,因此我们可以只写成bnet = mk_bnet(dag, node_sizes);你也可以指定那些节点是可以被观察的。
如果你不知道或者预先没有确定,那么就使用空的列表。
onodes = [];bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes, 'observed', onodes);注意你可以使用一个名字或语法值来指定可选参数。
这在BNT的函数中很普遍。
通常,要找到一个函数更多的信息(例如,可以使用那些可选参数),请按如下方式查看它的帮助文档。
help mk_bnet请参阅 useful Matlab tips.将一个名字和节点关联起来可以按如下方式:bnet = mk_bnet(dag, node_sizes, 'names', {'cloudy','S','R','W'}, 'discrete', 1:4);你可以用它的名字引用一个节点:C = s('cloudy'); % s是一个关联数组;bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);这个特征使用我自己的关联数组类。
参数一个模型由图形结构和参数组成。
参数用CPD(条件概率分布)来表达.CPD定义了一个节点与它父节点间的概率分布。
(我们将交替使用“节点”项和“随机变量”项)最简单的一种CPD是一个表格(多维数组),与之匹配的是所有节点类型都是离散的。
值得注意的是离散值是被假定为不能用任何方式排序的。
换句话说,它代表绝对数量,如男或女,而非序数,如低、中、高。
(我们将在后面更详细的讨论CPD的类型)列表状的CPDs,也叫CPTs(条件概率表),是作为多维数组储存的。
这些维数作为节点以相同的方式安排。
例如:节点4(WetGrass)的CPT是与Sprinkler (2), Rain (3)和WetGrass (4)本身挂钩的。
因此,子节点通常是最后一维。
如果一个节点没有父节点,它的CPT是一个列向量,代表它的先验概率。
要注意的是在Matlab里(不同于C),数组的索引是从1开始安排在内存中的,这样第一个索引切换的最快,例如在节点4(WetGrass)的CPT中(如下)这里我们按惯例 false(假)==1, true(真)==2. 我们可以在Matlab中创建如下CPT:CPT = zeros(2,2,2);CPT(1,1,1) = 1.0;CPT(2,1,1) = 0.1;...这里有一个更简单的方法:CPT = reshape([1 0.1 0.1 0.01 0 0.9 0.9 0.99], [2 2 2]);事实上,我们不需要改造这个数组,CPD构造函数会为我们做这件事。
因此我们可以只要这样写。
bnet.CPD{W} = tabular_CPD(bnet, W, 'CPT', [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);其它节点按类似方法创建(对于可选参数使用旧的语法)bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);随机参数如果我们没有指定CPT,随机参数将被创建。
也就是说,CPT的每一行将按均匀分布创建。
为了确保可重复的结果,使用:rand('state', seed);randn('state', seed);通过控制无规度(熵),你可以从狄利克雷分布采样CPT的每一行。
如果P<<1,将促使“确定性”CPTs(一个条目接近1,剩余的接近0)。
如果P=1,每个条目从U[0,1]间形成。
如果P>>1,所有条目将全接近1/K,K是这个节点的元数,也就是每一行几乎一致。
你可以象下面这样做,假定这个节点是数目i,ns是它的node_size。
k = ns(i);ps = parents(dag, i);psz = prod(ns(ps));CPT = sample_dirichlet(p*ones(1,k), psz);bnet.CPD{i} = tabular_CPD(bnet, i, 'CPT', CPT);从文件加载一个网络如果你已经拥有一个基于XML的贝叶斯交换格式(BNIF)的贝叶斯网络,(例如,从Bayes Net repository下载一个),你可以用Ken Shan写的BIF-BNT Java program转换它成为BNT格式(这不需要最新的)。
目前还不能保存或加载一个BNT的matlab对象到文件当中,但是如果你修改了类的构造函数,还是很容易确定的。
使用GUI创建一个模型Senthil Nachimuthu 用Java写的开源软件projeny using Java. 这是BNJ的后续。
Philippe LeRay 用matlab写了BNT GUIImme Ebert-Uphoff 写的工具包LinkStrength图形可视化图形可视化见原始文件超链接推断创立好一个贝叶斯网络,我们现在可以用它来进行推断。
贝叶斯网络中有许多不同的算法来作为推断的的工具,在速度、复杂性、普遍性和精确性上有不同的表现。
BNT因此提供了多种多样的不同的推断引擎。
我们将在后面更详细的讨论它们。
现在,我们使用联合树引擎,它是所有精确推断引擎的根本。
它可以按如下步骤调用:engine = jtree_inf_engine(bnet);其它引擎有这类似的构造函数,但是可能有附加的该算法的细节参数。