【06】概率图推断之变量消除算法

news2024/11/16 1:25:41

概率图推断之变量消除算法

在这里插入图片描述

文章目录

    • 说明性示例
    • 消除变量
      • 因子
      • 因子运算
      • 排序
      • 变量消除算法
      • 举例
    • 证据
    • 变量消除的时间复杂度
      • 选择变量消除顺序

接下来,我们将注意力转向图模型中的推断问题。

给定概率模型(如贝叶斯网络或马尔可夫随机场),我们真正关注的是如何使用它来解决问题,例如判断给定的邮件是不是垃圾邮件。更确切地说,我们关注两类问题:

  • 边际推断:在我们将所有其他变量相加后,模型中给定变量的概率是多少(例如垃圾邮件vs非垃圾邮件)

p ( y = 1 ) = ∑ x 1 ∑ x 2 ⋯ ∑ x n p ( y = 1 , x 1 , x 2 , … , x n ) p(y=1) = \sum_{x_1} \sum_{x_2} \cdots \sum_{x_n} p(y=1, x_1, x_2, \dotsc, x_n) p(y=1)=x1x2xnp(y=1,x1,x2,,xn)

  • 最大后验(MAP)推断:模型中变量最可能的取值是什么(可能以证据为条件)

max ⁡ x 1 , … , x n p ( y = 1 , x 1 , … , x n ) \max_{x_1, \dotsc, x_n} p(y=1, x_1, \dotsc, x_n) x1,,xnmaxp(y=1,x1,,xn)

事实证明,推理是一项颇具挑战的任务。对于很多我们感兴趣的概率,要准确回答这些问题都是NP难题。至关重要的是,推理是否容易处理取决于描述概率的图的结构。尽管有些问题很难解决,我们仍然可以通过近似推理方法获得有用的答案。

本章介绍了第一个精确推理算法——变量消除法。我们将在后面的章节中讨论近似推断算法。为了方便讨论,这里我们约定 x i x_i xi是离散变量,每个变量取 k k k个可能值。

说明性示例

我们先从边际推断问题入手。为了简单起见,假设我们有一个链式贝叶斯网络,即
p ( x 1 , … , x n ) = p ( x 1 ) ∏ i = 2 n p ( x i ∣ x i − 1 ) p(x_1, \dotsc, x_n) = p(x_1) \prod_{i=2}^n p(x_i \mid x_{i-1}) p(x1,,xn)=p(x1)i=2np(xixi1)
我们想要计算边缘概率 p ( x n ) p(x_n) p(xn),最朴素的办法是将 x 1 , … , x n − 1 x_1, \dotsc, x_{n-1} x1,,xn1上每个取值,共 k n − 1 k^{n-1} kn1个概率相加
p ( x n ) = ∑ x 1 ⋯ ∑ x n − 1 p ( x 1 , … , x n ) p(x_n) = \sum_{x_1} \cdots \sum_{x_{n-1}} p(x_1, \dotsc, x_n) p(xn)=x1xn1p(x1,,xn)
然而,利用概率分布的因子分解可以更好地完成这项工作。我们可以通过将某些特定变量“推到”后面来重写该求和公式
p ( x n ) = ∑ x 1 ⋯ ∑ x n − 1 p ( x 1 ) ∏ i = 2 n p ( x i ∣ x i − 1 ) = ∑ x n − 1 p ( x n ∣ x n − 1 ) ∑ x n − 2 p ( x n − 1 ∣ x n − 2 ) ⋯ ∑ x 1 p ( x 2 ∣ x 1 ) p ( x 1 ) \begin{align*} p(x_n) & = \sum_{x_1} \cdots \sum_{x_{n-1}} p(x_1) \prod_{i=2}^n p(x_i \mid x_{i-1}) \\ & = \sum_{x_{n-1}} p(x_n \mid x_{n-1}) \sum_{x_{n-2}} p(x_{n-1} \mid x_{n-2}) \cdots \sum_{x_1} p(x_2 \mid x_1) p(x_1) \end{align*} p(xn)=x1xn1p(x1)i=2np(xixi1)=xn1p(xnxn1)xn2p(xn1xn2)x1p(x2x1)p(x1)
我们先对内部项求和,从 x 1 x_1 x1开始到 x n − 1 x_{n-1} xn1结束。具体来说,我们首先通过对 x 1 x_1 x1求和计算出一个中间因子 τ ( x 2 ) = ∑ x 1 p ( x 2 ∣ x 1 ) p ( x 1 ) \tau(x_2) = \sum_{x_1} p(x_2 \mid x_1) p(x_1) τ(x2)=x1p(x2x1)p(x1)。这一步需要 O ( k 2 ) O(k^2) O(k2)的时间,因为我们必须对 x 2 x_2 x2的每个取值求和 x 1 x_1 x1。因子 τ ( x 2 ) \tau(x_2) τ(x2)的结果是一个有 k k k个值得表(不一定是概率),对 x 2 x_2 x2的每个取值对应一个条目。我们可以用因子 τ \tau τ重写边缘概率公式为:
p ( x n ) = ∑ x n − 1 p ( x n ∣ x n − 1 ) ∑ x n − 2 p ( x n − 1 ∣ x n − 2 ) ⋯ ∑ x 2 p ( x 3 ∣ x 2 ) τ ( x 2 ) p(x_n) = \sum_{x_{n-1}} p(x_n \mid x_{n-1}) \sum_{x_{n-2}} p(x_{n-1} \mid x_{n-2}) \cdots \sum_{x_2} p(x_3 \mid x_2) \tau(x_2) p(xn)=xn1p(xnxn1)xn2p(xn1xn2)x2p(x3x2)τ(x2)
这里我们可以发现,上面公式跟初始公式形式相同,只是我们少对一个变量进行求和。因此我们可以计算因子 τ ( x 3 ) = ∑ x 2 p ( x 3 ∣ x 2 ) τ ( x 2 ) \tau(x_3) = \sum_{x_2} p(x_3 \mid x_2) \tau(x_2) τ(x3)=x2p(x3x2)τ(x2),同样方法带入上面公式将边缘概率重写…如此循环直到公式中仅剩下 x n x_n xn。因为每一步耗时都是 O ( k 2 ) O(k^2) O(k2),我们共进行了 O ( n ) O(n) O(n)次,因此总共耗时 O ( n k 2 ) O(nk^2) O(nk2),这远好于一开始的 O ( k n ) O(k^n) O(kn)

上面的过程,每一步我们都会消去一个变量,“变量消除”算法因此得名。

消除变量

通过上面这个特殊的例子,相信大家对变量消除有了直观上的认识,下面我们一般形式来介绍变量消除算法。

因子

假设我们给定一个图模型作为因素的乘积
p ( x 1 , … , x n ) = ∏ c ∈ C ϕ c ( x c ) p(x_1, \dotsc, x_n) = \prod_{c \in C} \phi_c(x_c) p(x1,,xn)=cCϕc(xc)
回想一下,我们可以将因子视为多维表,为一组变量 x c x_c xc的每个取值赋值。在贝叶斯网络中,这些因子对应于条件概率分布。在马尔可夫随机场中,因子编码了非正态分布;为了计算边缘概率,我们首先计算分配函数(也使用变量消去法),然后使用非正态分布计算边缘概率,最后将结果除以分配常数以构造有效的边缘概率。

因子运算

变量消除算法重复执行两个因子操作:乘积和边缘化。在上面的链式示例中,我们一直在隐式执行这些操作。

因子乘积运算简单地定义了两个因子 ϕ 1 , ϕ 2 \phi_1, \phi_2 ϕ1,ϕ2的乘积 ϕ 3 : = ϕ 1 × ϕ 2 \phi_3 := \phi_1 \times \phi_2 ϕ3:=ϕ1×ϕ2
ϕ 3 ( x c ) = ϕ 1 ( x c ( 1 ) ) × ϕ 2 ( x c ( 2 ) ) \phi_3(x_c) = \phi_1(x_c^{(1)}) \times \phi_2(x_c^{(2)}) ϕ3(xc)=ϕ1(xc(1))×ϕ2(xc(2))
ϕ 3 \phi_3 ϕ3的范围定义为 ϕ 1 , ϕ 2 \phi_1, \phi_2 ϕ1,ϕ2范围内变量的并集,同时 x c ( i ) x_c^{(i)} xc(i)表示对 ϕ i \phi_i ϕi范围内的变量的赋值,该范围由 x c x_c xc对该范围的限制限定。例如我们定义: ϕ 3 ( a , b , c ) : = ϕ 1 ( a , b ) × ϕ 2 ( b , c ) \phi_3(a,b,c) := \phi_1(a,b) \times \phi_2(b,c) ϕ3(a,b,c):=ϕ1(a,b)×ϕ2(b,c)

其次,边缘化操作“局部”消除了一个因子中的一组变量。如果我们有两组变量 X , Y X, Y X,Y构成的因子 ϕ ( X , Y ) \phi(X, Y) ϕ(X,Y),对 Y Y Y边缘化产生一个新因子
τ ( x ) = ∑ y ϕ ( x , y ) \tau(x) = \sum_y \phi(x, y) τ(x)=yϕ(x,y)
其中求和是对Y变量集合的每一个取值进行求和。

我们使用 τ \tau τ来表示边缘化因子。这里重点要理解,该因子不一定与概率分布相对应,即使 ϕ \phi ϕ是条件概率分布。

在这里插入图片描述

这里,我们将变量 B B B从因子 ϕ ( A , B , C ) \phi(A, B,C) ϕ(A,B,C)中边缘化。

排序

最后,变量消除算法需要根据哪些变量将被“消除”来对变量进行排序。在我们的链式示例中,我们采用DAG所蕴含的顺序。需要注意的是:

  • 不同的排序可能会显著影响变量消除算法的运行时间。
  • 找到最佳排序是NP问题

稍后我们将讨论这些复杂问题。

变量消除算法

我们正式定义变量消除(VE)算法。本质上,我们按照 O O O给出的顺序循环变量,并按顺序消除它们。

更正式地说,对于每个变量 X i X_i Xi(根据 O O O排序)

  1. 将包含 X i X_i Xi的因子 Φ i \Phi_i Φi相乘;
  2. X i X_i Xi边缘化以获得新因子 τ \tau τ;
  3. τ \tau τ替换因子 Φ i \Phi_i Φi

举例

我们还是用上面的链式示例看一下算法步骤是如何对应的。在这个例子中,我们选择的顺序是 x 1 , x 2 , … , x n − 1 x_1, x_2, \dots, x_{n-1} x1,x2,,xn1。从 x 1 x_1 x1开始,我们收集所有与 x 1 x_1 x1相关的因子,分别是 p ( x 1 ) p(x_1) p(x1) p ( x 2 ∣ x 1 ) p(x_2 \mid x_1) p(x2x1)。我们用它们构建新的因子 τ ( x 2 ) = ∑ x 1 p ( x 2 ∣ x 1 ) p ( x 1 ) \tau(x_2) = \sum_{x_1} p(x_2 \mid x_1) p(x_1) τ(x2)=x1p(x2x1)p(x1)。这可以看作是变量消除算法的1、2步的结果:首先我们构建一个大因子 σ ( x 2 , x 1 ) = p ( x 2 ∣ x 1 ) p ( x 1 ) \sigma(x_2, x_1) = p(x_2 \mid x_1) p(x_1) σ(x2,x1)=p(x2x1)p(x1),然后从因子中消去 x 1 x_1 x1得到 τ \tau τ。接着我们对 x 2 x_2 x2重复相同的步骤,不同的是此时因子变为 p ( x 3 ∣ x 2 ) , τ ( x 2 ) p(x_3 \mid x_2), \tau(x_2) p(x3x2),τ(x2)

对于稍微复杂一些的例子,回想一下我们前面介绍的学生成绩的图模型。

在这里插入图片描述

学生考试成绩的贝叶斯网络模型

模型指示的概率可以描述为:
p ( l , g , i , d , s ) = p ( l ∣ g ) p ( s ∣ i ) p ( i ) p ( g ∣ i , d ) p ( d ) p(l, g, i, d, s) = p(l \mid g) p(s \mid i) p(i) p(g \mid i, d) p(d) p(l,g,i,d,s)=p(lg)p(si)p(i)p(gi,d)p(d)
假设我们要计算 p ( l ) p(l) p(l)并消除图中拓扑排序的变量。首先我们消除 d d d,为此我们构建新的因子 τ 1 ( g , i ) = ∑ d p ( g ∣ i , d ) p ( d ) \tau_1(g,i) = \sum_d p(g \mid i, d) p(d) τ1(g,i)=dp(gi,d)p(d)。然后我们消除 i i i,并构建新的因子 τ 2 ( g , s ) = ∑ i τ 1 ( g , i ) p ( i ) p ( s ∣ i ) \tau_2(g,s) = \sum_i \tau_1(g,i) p(i) p(s \mid i) τ2(g,s)=iτ1(g,i)p(i)p(si)。接着我们消除 s s s,构建新的因子 τ 3 ( g ) = ∑ s τ 2 ( g , s ) \tau_3(g) = \sum_s \tau_2(g,s) τ3(g)=sτ2(g,s),以此类推。注意,这些操作相当于将因子的概率分布以如下形式求和:
p ( l ) = ∑ g p ( l ∣ g ) ∑ s ∑ i p ( s ∣ i ) p ( i ) ∑ d p ( g ∣ i , d ) p ( d ) p(l) = \sum_g p(l \mid g) \sum_s \sum_i p(s\mid i) p(i) \sum_d p(g \mid i, d) p(d) p(l)=gp(lg)sip(si)p(i)dp(gi,d)p(d)
这个例子每步需要最多 k 3 k^3 k3次操作,因为每个因子最多涉及2个变量,且每步加总出一个变量。

证据

一个密切相关且同等重要的问题是用如下形式计算条件概率:
P ( Y ∣ E = e ) = P ( Y , E = e ) P ( E = e ) P(Y \mid E = e) = \frac{P(Y, E=e)}{P(E=e)} P(YE=e)=P(E=e)P(Y,E=e)
其中 P ( X , Y , E ) P(X, Y, E) P(X,Y,E)是查询变量 Y Y Y,观察到证据 E E E和为观测变量 X X X下的概率分布。

我们可以通过对 P ( Y , E = e ) P(Y, E=e) P(Y,E=e)执行一次变量消除,然后对 P ( E = e ) P(E=e) P(E=e)执行一次变量消除,来计算这个概率。

要计算 P ( Y , E = e ) P(Y, E=e) P(Y,E=e),我们可以简单地取所有因子 ϕ ( X ′ , Y ′ , E ′ ) \phi(X', Y', E') ϕ(X,Y,E),其范围中任意变量 E ′ ⊆ E E' \subseteq E EE也包含在 E E E中,然后将其值设为 e e e,接着,我们对 X X X执行标准变量消除,以获得仅对 Y Y Y的因子。

变量消除的时间复杂度

理解变量消除的运行时间很大程度上取决于图的结构,这一点非常重要。

上面的例子中,假如我们先消去 g g g,那么我们需要将因子 p ( g ∣ i , d ) , ϕ ( l ∣ g ) p(g \mid i, d), \phi(l \mid g) p(gi,d),ϕ(lg)转换为一个具有3个变量的大因子 τ ( d , i , l ) \tau(d, i, l) τ(d,i,l),这将需要 O ( k 4 ) O(k^4) O(k4):即每个条件变量计算 k k k次,对 g g g的每个取值计算 k k k次。如果我们有因子 S → G S \rarr G SG,那么我们还需要消去 p ( g ∣ s ) p(g \mid s) p(gs),用 O ( k 5 ) O(k^5) O(k5)次计算产生一个巨无霸因子 τ ( d , i , l , s ) \tau(d, i, l, s) τ(d,i,l,s)。然后,从这个因子中消除任何变量所需的工作几乎与从原始分布开始消除一样多,因为所有变量都已耦合。

显然,有些消除顺序比其他顺序更有效。实际上,变量消除的运行时间为 O ( n k M + 1 ) O(n k^{M+1}) O(nkM+1),其中 M M M是消除过程中产生因子 τ \tau τ的最大大小, n n n是变量数量。

选择变量消除顺序

遗憾的是,选择最优变量消除顺序是个NP问题。然而,在实践中,我们可以采用以下启发式方法:

  • 最少邻居:选择依赖变量最少的变量。
  • 最小权重:选择变量以最小化其因变量基数的乘积。
  • 最小填充:选择顶点以最小化添加到图中的因子的大小。

这些方法通常会在许多环境中产生相当好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开个脑洞,带你写一个自己的极狐GitLab CI Runner

极狐GitLab Runner 是极狐GitLab CI/CD 执行的利器,能够帮助完成 CI/CD Pipeline Job 的执行。 目前极狐GitLab Runner 是一个开源项目,以 Golang 编写。 极狐Gitlab 有个不错的特性,就是你可以使用自己的极狐Gitlab CI Runner。可是&#xf…

Oracle 单实例如何开机自启动

作者 | JiekeXu来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle 单实例如何开机自启动,欢迎点击…

盘点JAVA程序猿必备的webserver

作为java工程师,除了必备的java编程能力,我们还需要些什么呢? 一般而言,要从工程师进化为构架师,一个合格的java工作者需要掌握一些关于构架的知识, 比如互联网的结构,服务器的建设&#xff0c…

PhotoShop入门

PhotoShop入门 零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub&am…

JAVA结构、循环语句

一、 if选择结构 代码示例: int num 1;if (num 1) {System.out.println("壹");} else if (num 2) {System.out.println("贰");} else if (num 3) {System.out.println("参");}输出: 壹 二、switch结构 1.switch 会根…

HNU编译原理实验四cminus_compiler-2022-fall

前言:原本想认认真真把这个实验给完成的,但是当时时间太赶了,一周要做三个实验,所以这次实验基本都是抄的了,有些地方也抄的不明不白,不过懂不懂这个对课程学习的帮助并不是很大,毕竟这个实验的…

vue 弹窗 惯性滚动 加速滚动

惯性滚动组件 新建文件 components/scroll-viwe <template><div v-if"visiable"><div class"mapbox-result-scroll-hidden"><div class"mapbox-result-wrap" ref"resultWrap"><div class"mapbox-resu…

服务了可口可乐、海底捞、某头部商业银行,我有这些体会

我非常喜欢巴西队的内马尔&#xff0c;他曾说&#xff1a;“你可能会看到我一秒钟、一分钟、一天不开心&#xff0c;但第二天你会看到我的笑脸。” 在 Authing 工作两年多了&#xff0c;在这期间&#xff0c;我为可口可乐、海底捞、某头部商业银行等客户做了交付&#xff0c;在…

jq实现倒计时功能

效果如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>jq实现…

10 IO实例

IO 1 流 流可以认为是一条通道&#xff0c;它可以将数据从源端传送到目的地。 例如将程序中的某些数据写入文件&#xff0c;或将文件中的某些数据读入程序。 Java中数据的操作是以“流”的方式进行。 Java中的“流”是一个具体的Java对象&#xff0c;该对象提供一些方法进行…

组件的概念

文章目录组件&#xff1f;从UI层面看组件化组件&#xff1f; 等下&#xff0c;你有没有留意到我说了一个很关键的词&#xff0c;叫组件。组件&#xff1f;直观的理解组件是一个什么东西&#xff1f;可拼接&#xff0c;可组合&#xff0c;搭积木&#xff0c;乐高积木? 对&…

Springboot定时任务调度的实现原理

前言 源码的世界是一片汪洋大海&#xff0c;springboot的源码更是如此&#xff0c;虽然用的时候似乎很简单&#xff0c;然而正是因为其内部的设计巧妙、复杂&#xff0c;才造就了其使用上的简单易上手。罗马不是一天建起来的&#xff0c;要完全理解它也并非一时的事&#xff0c…

webdriver的尝试:一 【webdriver自动打开浏览器与页面】

文章目录Webdriver尝试使用步骤1&#xff1a;安装类库2&#xff1a;安装驱动3&#xff1a;配置环境3&#xff1a;编写脚本4&#xff1a;执行脚本Webdriver 网站地址 Selenium webdriver 简单介绍&#xff1a;webdriver是一个api和协议。支持多种语言。主要功能&#xff0c;通…

大米新闻微信小程序和Springboot新闻管理系统项目源码

介绍 本项目分为大米news小程序端和springboot新闻管理系统后台项目。小程序主要用来新闻展示&#xff0c;后台管理系统用于提供相关新闻API。 项目源码 参考&#xff1a;https://www.bilibili.com/video/BV1TD4y1j7g3/?spm_id_from333.337.search-card.all.click&vd_s…

day08 常用API

1.API 1.1 API概述-帮助文档的使用 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&a…

两个链表的第一个公共结点

今天为大家带来一道题目&#xff1a; 这个题目先来看看我自己写的错误版本 public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {ListNode tmp1pHead1;ListNode tmp2pHead2;while(pHead1!null&&pHead2!null){ListNode cur…

Axure8.0动态面板使用

Axure动态面板是最常使用的&#xff0c;今天我们就来详细介绍一下。 动态面板是Axure中一个非常强大的高级元件&#xff0c;用于实现多个状态的切换展示&#xff0c;可以将其看成一个容器&#xff0c;可以容纳多种不同状态&#xff0c;通过各种交互触发其状态发生变化。 通过以…

年终盘点丨2022边缘计算大事记

2022年进入尾声了&#xff0c;每年到了年底&#xff0c;边缘计算社区都会盘点过去一年边缘计算领域发生的值得您关注的事情。今年的边缘计算领域发生很多不一样的精彩&#xff1a;加强面向特定场景的边缘计算能力刷屏一整年&#xff0c;安波福43亿美元收购风河&#xff0c;全球…

C++图论 最短路问题总结

目录 最短路问题 图的存储 一、单源最短路 ① 朴素Dijkstra O(n^2) 练习题 代码 ② 堆优化Dijkstra O(mlogn) 练习题 代码 ③ Bellman_ford O(nm) 练习题 代码 ④ Spfa O(n) - O(nm) 练习题 ​代码 二、多源最短路 Floyd O(n^3) 练习题 代码 最短路问题 图…

C# 数据库访问方法

一 访问数据的两种基本方式 1 方式1&#xff1a;DataAdapter及DataSet ① 适合于“离线”处理&#xff1b; ② 自动建立Command对象&#xff1b; 方式2&#xff1a;DataReader ① 适合于只读数据&#xff0c;效率较高 它们都要使用Connection及Command 二 Connection对象…