前言:
文章主要的目的是介绍eBay所使用的一个贝叶斯网络的框架,博主通过阅读相关论文和源代码以及代码测试,慢慢熟悉了该框架的使用方法及主要思想。
本文将尽量的阐述清楚贝叶斯网络的解决过程,如果你还不知道贝叶斯网络是解决哪一类问题的,请查看:贝叶斯网络笔记。
如果你能通过阅读论文熟悉贝叶斯网络,请尽量阅读论文,因为论文里一般都有详细的解释和公式化的证明过程。而本文的重点并不在于公式证明。(贝叶斯网络论文可以自行Google)
在阐述联合树算法的过程中,尽量去理解每段话的含义,如果实在理解不了的话,后面会给出一个案例,可以去结合案例来理解联合树算法的过程。
简介:
Bayesian-belief-networks 允许你用纯Python创建贝叶斯信念网络和其他图模型,目前支持四种不同的推理方法。
支持的图模型:
- 离散变量的贝叶斯信念网络
- 有着高斯分布的连续变量的高斯贝叶斯网络推理引擎:
- 消息传递和联合树算法(Junction Tree Algorithm)
- 和积算法(The Sum Product Algorithm)
- MCMC采样的近似推理
- 高斯贝叶斯网络中得Exact Propagation
框架解读
核心算法
联合树算法(Junction Tree Algorithm):
其主要步骤包括:构建联合树 + 在联合树上进行消息传递。如何构建联合树:
对于给定的贝叶斯网络进行道德化,也就是将有向图转换为无向图,
将每个有共同子节点的父节点连接起来,把所有的有向边改为无向边。将道德图三角化。原道德图记为
G
,复制得到的图记为g
。
每次选择图g的点观测顺序,选择规则为:val
= (节点V的所有邻居节点 两两不是相邻节点的对数),优先选择val
值小的。
按照上述规则选好点V后,将节点V的所有邻居节点,两两不是相邻节点连边,图G中也连上边.
cluster = [v] + v.neighbours
在cliques
中添加cluster
,如果cluster
不是cliques
任何一个元素的子集。
在g
图中消去点V
以及所有与该点V
相连的边。
重复上述步骤,直到g
图中不存在节点。
如此图G
便是三角化后的图。(添加了最少的边)
同时得到了三角化图中各个团,即cliques
(用于后面联合树的构建)。构建联合树。首先得到了三角化后的所有团节点
Cliques
,算法目的在于:将N
个节点用N-1
条边连接成一棵树,并且使得树最优,类似于克鲁斯卡尔算法(也就是一种最小生成树算法)。
团节点之间两两组合取交集得到分离点Septor = intersection(Ci,Cj)
选择最佳的分离点的标准为:
- 最大的
mass = len(Septor)
,即分离点里变量的数量。cost
越小,cost = weight(Ci) + weight(Cj)
如何在联合树上进行消息传递:
(这里看着可能会比较懵,所以可以先看看后面的实例,再回头查看消息传递的过程)下面就是在这颗树上进行若干次消息传递,从而完成数值的更新过程:
对于每个evidence variable
,把它放到包括这个变量的表里,然后把所有不满足这个evidence
的entry
全设为0。接着做一个自底向上的迭代,对