上一个章节中,讲到了贝叶斯网络常用的评分函数,本节主要讲下搜索的算法,搭配上搜索算法,对于贝叶斯网络的结构学习就完整啦。
贝叶斯网络的结构学习问题是一个NP-hard问题,所以实际上计算中并不是对所有的结构分别计算并且评分的,而是采用搜索算法按照某种评分在可能的拓扑结构中进行搜索来获取结构。最基本的搜索算法是启发式的局部搜索算法,主要是K2搜索,Hill-climbing算法、随机重复爬山算法、禁忌搜索、模拟退火以及遗传算法,主要分为以下几个步骤
- 计算每个节点之间互信息,建立完整无向图
- 如果节点对不是d分割的话,把这个点对加入到边集合
- 检查边集中每个点对,如果两个节点是d分割的,则移走这条边
K2算法
K2算法用贪心搜索处理模型的问题,先定义一种评价结构优劣的方式,再从一个网络开始,根据事先确定的最大父节点数目和节点次序,选择分值最高的节点作为该节点的父节点。K2算法一般使用BEe评分函数。
K2伪代码
X=X1,..,Xn 一组变量
ρ 变量的顺序
N 变量父节点的最大个数
D 完整数据集合
- ξ←由父节点X组成的无向图
- for j=1 in n
- πj←ϕ
- Vold←BDe(Xj,πj∣D)
- while(True)
- i←argmaxBDe(<Xj,πj∪{Xi}>∣D)
- Vnew←BDe(<Xj,πj∪{Xi}>∣D)
- If Vnew>Vold and ∣πj∣<N
- Vold>Vnew
- πj←πi∪{Xi}
- 在D中加入边Xi→Xj
- else
- break
- end If
- end While
- end for
- 估计ξ的参数θ
- return (ξ, θ)
K2算法的出发点是一个包含所有节点,但是没有边的无向图。搜索过程中,K2算法按顺序逐个考察ρ中的变量,确定其父节点,然后添加相应的边。对某一个变量Xj,假设K2已经找到它的一些父节点πj, 如果∣πj∣<N,也就是Xj的父节点个数还未达到上限,那么就继续找其他父节点。否则停止搜索
Hill-climbing搜索算法
Hill-climbing搜索算法同样也是为了找到评分最高的结构,初始的结构是一个无边的模型,搜索的每一步,就在当前的模型上做局部的修改,获得一系列的候选模型,然后计算每个模型的评分,如果评分大就替换之前的模型。
Hill-climbing搜索算法的对模型的修改主要体现在加边、减边、和转边。但是不能在网络中构成环。接下来可以一起看看伪代码。
X,一组变量
D 关于X的完整数据
f 评分函数
ξ0初始的贝叶斯结构
- ξ←ξ0;θ←ξ
- oldScore←f(ξ,θ∣D)
- while(true)
- ξ∗←null,θ∗←null,newScore←max
- for(每个对ξ)做一次加边、减边、翻转得到结构ξ‘
- θ’←ξ′的参数的最大似然估计
- tempScore←f(ξ′,θ′∣D)
- if(tempScore>newScore)
- ξ∗←ξ′,θ∗=θ′,newScore=tempScore
- end if
- end for
- if(tempScore<newScore)
- ξ←ξ∗,θ=θ∗,oldScore=newScore
- else
- return(ξ,θ)
- end if
- end while
基于独立性检测的结构学习
基于独立性检测的结构学习的核心思想是对训练数据进行统计,确定不同节点的独立一致条件,利用这个条件构造有向无环图,极可能多的覆盖之前的独立性检测。