除了精确推理之外,我们还有非精确推理的手段来对概率图单个变量的分布进行求解。在很多情况下,概率图无法简化成团树,或者简化成团树后单个团中随机变量数目较多,会导致团树标定的效率低下。以图像分割为例,如果每个像素的label都是随机变量,则图中会有30W个随机变量(30W像素的小型相机)。且这30W个随机变量相互之间耦合严重(4邻接,多回环),采用团树算法无法高效的获得单个像素label的可能值。所以,在精确推理之外,我们使用非精确推理的手段对节点的概率分布进行估计。
BP是精确推理中的概念,我们从root向leaf发射一次MESSAGE,再接受一次MESSAGE则可完成团树的标定,这个过程称为置信传播。但是在多回环的团树,BP非常难执行,由于环的存在会导致某个节点一直无法出于可发射MESSAGE的状态(此时的团树不叫团树,应该称为“聚类图”)。然而理论证明,如果我们预先给定一套消息传递的顺序,保证节点i -> j 传播且仅传播一次消息,那么消息最终会收敛到某个定值。一旦消息收敛到某个定值,则代表节点之间就某变量达成一致,我们获得概率图可行的分布。此时对聚类图中的变量进行边缘化,即可获得有效的单变量分布。
Loopy置信传播有3项极其重要的工作:
1、保证节点之间仅传播一次的传播顺序(此顺序显然不是唯一的)
2、获取每次传播后更新的消息
3、判断消息最终收敛
1 List = []; 2 edges_ = P.edges; 3 for i = 1:length(P.clusterList) 4 j = find(edges_(i,:),8); 5 List = [List; j' linspace(i,i,length(j))']; 6 end 7 length_list = length(List); 8 array_ = mod(m,length_list)+1; 9 ij = List(array_,:); 10 i = ij(1); 11 j = ij(2);