完成构建概率图模型之后,一个主要任务是我们想给模型提出问题并找出答案。对于联合概率分布的图模型和表示法,有很多使用方式。例如,我们可以研究随机变量之间的交互。我们还可以看到模型是否捕捉到关联关系或因果关系。而且,由于控制随机变量的概率模型已经参数化了,变量的概率分布在已知部分数值参数的情况下变得完全已知。我们还可能在其他参数已知的情况下,对特定参数的取值感兴趣。

本文主要介绍通过使用模型和变量子集的观察结果,来发现另一个变量子集后验概率的算法。我们没有必要观察和查询所有的变量。事实上,本文中我们即将看到的所有算法都可以用在任何被观察的子集和被查询的子集上。

主要有两种类型的查询:

  • 概率查询,其中,我们观察到变量的一个子集E,并选择这些变量的一个实例e,称之为证据。然后我们计算变量集X的子集Y的后验概率分布:P(Y|E=e)。
  • MAP查询,指的是找出对拥有最大概率的变量子集的共同赋值。同时,如果我们把E叫作被观察变量的集合,Z是模型的其他变量,那么MAP赋值可以通过MAP=(Z|E=e)=argmaxzP(z,e)来定义。换句话说,我们要找出未被观察的变量的值,满足如果我们观察到赋值E=e,那么未被观察的变量拥有最大的概率。

本文的目的就是介绍解决精确推断问题的主流算法,即回答上述查询的问题。通常,推断问题可以化解为通过贝叶斯规则找出后验概率的问题。用数学的语言讲,如果我们把X叫作模型的所有变量的集合,E是被观察变量(证据)的集合,Z是隐含变量或非观察变量的集合,那么计算图模型的推断可以使用:

概率图模型之精确推断_概率分布

例如,在医学问题中,给定一个观察到的症状集合,我们想知道所有可能的疾病。在语音识别系统中,我们想知道被记录的声音(即说话者的语音)中最可能的单词序列。在雷达跟踪系统中,我们想从雷达读数中知道跟踪物体位置的概率分布。在推荐系统中,在给出售卖网站上用户最近的点击数据后,我们想知道待售产品的后验概率分布,以便给客户提供最优的5个产品的排序和推荐。

所有这些问题,以及更多的问题,总是需要计算后验概率分布。为了解决这个复杂的问题,我们打算研究一下另一个不同的算法,这个算法以概率图模型作为基础图形来执行高效的计算。但是,在本文的第一部分,为了理解算法如何工作,我们会看到如何执行朴素计算。该计算并不十分高效,但是可以作为基于此改进效率的框架。这叫作变量消解,它会逐步地减少查询中用不到的变量。

接着我们会看到,我们可以重用之前的计算,使用第二个算法——和积算法来改进算法效率。我们会把这个算法应用到不同类型的概率图模型,特别是带有树状层级的图形。这部分将引出最后一个也是最重要的算法——联结树算法。它可以接收任何图形,并把它们转换为树状结构,进而生成高效的计算序列。这个算法可以使用大部分R程序包实现。我们也会在本文中使用。

在本文中,你会学到如何执行简单推断,改进计算效率,并最终使用图模型。这个图模型可以根据现实世界问题的复杂程度的需要而构建。我们会介绍R语言的算法,以及R程序包,例如​​gRain​​​、​​gR​​​和​​rHugin​​中的函数。

在开始所有数学和编程工作之前,我们会在第1节中介绍概率图模型的设计过程,并且介绍几个专家系统的例子。我们还会展示如何把遗产模型表示为图模型,并从中受益。

本文的组织结构如下:

  • 构建图模型。
  • 变量消解。
  • 和积与信念更新。
  • 联结树算法。
  • 概率图模型示例。

1.1 构建图模型

图模型的设计考虑到两个不同的方面。第一个方面,我们需要确定模型中涉及的变量。变量指我们可以观察到或度量到的事实,例如温度、价格、距离、项的数量、时间段或任何其他值。一个变量也可以表示一个或真或假的简单事实。

同时,这也是我们为什么要构建图模型的原因。变量可以捕捉问题的局部,而我们却无法直接度量或者估计这些与问题相关的变量。例如,一个外科大夫能够度量病人的一系列症状。但是,疾病并不是我们可以直接观察到的事实。它们只能通过几个症状的观察结果推论出来。以一般的感冒为例,当我们说一个人得了感冒,每个人都能理解这句话,这很自然。但是,并没有一个叫作感冒的东西。当某种类型的鼻病毒过分增殖时,病人却有严重的上呼吸道(鼻子)病毒感染。这是一个复杂过程,但是这只是一个普通的感冒。

直接推出病人得了感冒几乎不可能,除非医生对粘液采样,并评估样本中鼻病毒的数量足够说明病人得了某种特定的疾病。另一种方法是从简单的症状例如头痛、流鼻涕中得出结论。在这种情况下,表示病人得感冒的变量不能被直接观测到。

第二个方面是图。图表示了不同变量之间的依赖,它们彼此如何关联,如何直接或间接的交互。如果你之前学过统计,你就会使用相关性的概念。在图模型中,对两个变量之间的依赖理解得更加宽泛。事实上,相关性只表示变量之间的线性关系。

例如,表示症状的变量和表示疾病的变量可以连接起来,因为这两个变量之间有直接的关系。

1.1.1 随机变量的类型

在多数情况下,我们要使用的变量都是离散型的。一个原因是我们对或真或假,或取特定数量的事实感兴趣。另一个原因是在许多科学领域使用离散变量进行建模非常常见,而且离散变量的图模型背后的数学逻辑易于理解和实现。

一个离散随机变量X定义在有限样本空间S={v1,v2, … , vn}上。离散随机变量的例子包括:

  • 一个骰子D有样本数据集{1,2,3,4,5,6}。
  • 一枚银币C定义在集合{T,H}上。
  • 一个症状定义在值{true,false}上。
  • 单词中的一个字母定义在集合{a,b,c,d,e, … , z}上。
  • 一个单词定义在一个非常大的英语单词集合{the,at,in,bread, … , computer, … }上,这个集合是有限的。
  • 大小可以定义在有限数据集{0,1,2,3, … ,1000}上。

一个连续随机变量是定义在一个连续的样本空间上,例如

,或者其他区间。当然,我们也可以把随机变量定义在多维空间上,例如

n上,但是要保证每一个维度都有相关的含义。有时,把维度分成n个不同的定义在

上的随机变量也是有意义的。连续型随机变量的例子有:

  • 距离公里数。
  • 温度。
  • 价格。
  • 其他随机变量的平均值。
  • 其他随机变量的方差。

当我们在考虑问题的贝叶斯方案时,最后两个例子很重要,而且可以导出机器学习问题的有用表示。确实,在贝叶斯方法中,所有的数量都看作随机变量。因此,如果我们定义一个服从分布N(μ,σ2)的随机变量,我们可以进一步把μσ2理解为随机变量。

事实上,在图模型中,把许多参数当成随机变量并在图中连接起来通常是很有用的。这些连接可以基于常识、因果交互或者其他存在于两个变量之间的足够强的依赖。

1.1.2 构建图

连接变量的原因有很多,正如我们在本文会看到的,也有许多算法可以自动地从数据集中学习这些连接。如果你读了一些科技文献,你会找到因果关系、稀疏模型或者分解的相关文献。所有这些原因都足以要求图模型中的变量连接。在本节中,我们会构建这样的模型,并介绍当两个变量连接时,模型和信息流会发生什么变化。我们会使用一个重要的概念:d-分离

另一个生成图模型的方法是模块化。这是图模型最吸引人的特点之一,因为你可以通过简单的模块构建复杂的模型,而且可以通过扩展图形来扩展已知的模型。

“学习参数和查询模型可以化解为同样的学习和推断算法应用。”

让我们看一些图模型实际的和理论的例子,以及它们捕捉的问题类型。

概率专家系统

假设我们想进行肺结核医疗诊断。介绍这个例子之前,我们需要为读者声明一下:本书的作者并无任何医疗技术和知识,只关注本书和机器学习领域。因此,下面例子的唯一目的是展示如何构建一个简单的图模型,而不用于任何医疗目的。下列例子出自http://en.wikipedia.org/wiki/Tuberculosis_diagnosis。

肺结核是由结核杆菌引起的。只有临床生物分析检验可以检测出这种病毒,确认是否得了肺结核。然而,物理检验可以揭示一些肺结核的线索,帮助外科医生判断是否需要全面的临床检验以得出病人体内是否存在这种病毒的判断。而且,完整的肺结核医疗评估必须包含医疗历史、物理检验、胸部透视以及微生物检验。因此,如果我们想查看可能的症状和检验,我们也可以确定相应的模型中用到的随机变量:

  • C:超过3周的咳嗽。C可以为真,也可以为假。
  • P:胸部疼痛。可以为真,也可以为假。
  • H:咯血。这也是一个或真或假的二元变量。
  • N:盗汗。这也是一个二元变量。
  • L:饭量减少。这个比较主观。我们可以按照3个值分级:{low,medium,strong},表示饭量减少的程度。
  • 最后,正如我们所说的,只有微生物研究可以断定肺结核,而其他的症状只能假设它的存在。因此我们需要两个随机变量,一个有关微生物研究的二元变量叫作M,表明是否发现病毒,另一个是判断病人是否断定,可能,假设患有肺结核,以及肺结核呈阴性。它是有四个值的随机变量。

为了生成图模型,我们需要做两件事:首先是需要图形连接随机变量,然后评估每个变量相互连接的先验概率,或者是图中的每一个节点。对于第二个任务,评估概率需要医疗专家知识。很显然这已经超出了本书的范围(也超出了作者当时的技能范围)。因此我们简单引入几个概率的名称,例如x1x2x3等。

症状通常是由疾病引起的,反过来则不成立。例如,盗汗并不是肺结核的原因。而反过来讲却是成立的。而且盗汗可能由其他原因引起,例如卧室的大功率加热器。但是,病毒可以引起疾病。事实上,如果病毒确实存在但是量很少,它可能也不会引发疾病。这个简单的推理启发我们设计图形的思路。

让我们首先从二元症状CPHN开始。它们都是由疾病T引起的。变量L也可以按照同样的原则添加到模型中

我们看到变量之间的连接存在某种模式。在图模型中处理原因和结果的时候,这个模式很常见。如果我们把同样的思路用到微生物研究M和疾病T的关系中,我们会得到交互结果。

因此,当我们把之前的两个图形放在一起后,最终的所示。

我们完成的操作是概率图模型非常重要的方面:我们把两个子模型连接在一起得到一个更加复杂,而且可以更有效地捕捉信息的大模型。事实上,我们可以在同一个图中添加更多症状和疾病,以便可以区分诸如肺结核和肺炎以及其他包含类似症状的疾病。通过计算给定症状下每个疾病的后验概率,医生可以判断采取什么医疗方案来应对最可能的疾病。这种形式的概率图模型有时也叫作概率专家系统

概率图模型的基本结构

我们继续研究图模型中的结构和模式,包括结构的类型和属性。我们会通过多个R程序包实现和展示其中的结果和模式,进而结束这一部分。

如果同一个事实有很多原因,这些原因会在图中指向事实。在变量数目不多的情况下这个结构非常常见。确实,假设我们有原因C1Cn,它们都是二元变量,以及事实F,它也是二元变量。

注意到所有的变量都是二元的,我们希望表示成一个带有2n+1个值的表​[1]

。如果n=10,这个值事实上并不大,我们只需要2 048个值!这就需要确定大量的概率。如果我们有31个原因,231+1=232=4 294 967 296!!!

是的,你需要40亿个值表示31个原因和1个事实。使用标准的双精度浮点值,这将会占用计算机34 359 738 368字节的内存,也就是32GB!对于这么小的一个模型,这已经过于庞大了。如果你的变量不仅拥有两个值,而是拥有k个值,你就需要kn+1个值,来辨识之前的条件概率。这个数字太大了!

我们可以进一步在原因上推理,因为其中一些原因并没有直接的与事实关联,而是引起了其他的原因。在这种情况下,我们给出原因的层级

在这个例子中,我们处理了8个原因,但是每一个局部条件概率,例如P(D1|C1,C2,C3)最多只涉及4个变量。这就容易处理了。

当我们查看变量的序列时,我们想到了另一个结构。这个结构不会捕捉因果关系而是捕捉变量在时间上的顺序。这也是一种非常常见的结构。假设我们有一个随机变量来表示系统在时间t上的状态,并假设系统的当前状态可以预测下一刻的状态。因此,我们可以在给定上一个状态P(Xt|Xt-1)的情况下,其中tt-1表示时间,回答当前系统状态的概率分布。

接着,假设在每一个时刻,设想的系统都会生成一个值,或者换句话说,我们可以间接地观察系统。这个观察结果不是系统的状态,而是对其有直接依赖的信息。因此确定概率P(Ot|Xt)也是合理的,其中O是依赖于状态的观察结果。最后,我们把这些讨论放在一起。

根据随机变量XO的类型不同,这个图有几个名字。当变量是离散的,正如之前所述,这个模型也叫作隐马尔可夫模型(Hidden Markov Model),即状态不能被直接观察到(隐藏的)的马尔可夫模型(Markov Model)。马尔可夫模型是这样一种模型,它的当前状态只依赖于之前的状态。在这个图中,Xt只依赖于Xt-1,这一事实清楚地建模了马尔可夫的特性这个属性。当所有的变量服从高斯分布(而且不是离散的),这就是著名的卡尔曼滤波器(Kalman filter)

概率图模型引人注目的地方是遗产模型,这也可以表示成图模型。

你一定还记得这样一个图,边都是有向的(箭头表示),而且有环。从哲学的角度讲,这意味着一个结果可能是原因的原因,这有点矛盾。这也说明你的表示概率分布的分解公式可能不完整,这在数学上是错误的。例如你不能写成P(ABC)=P(A|B)P(B|C)P(C|A)。

在下一节中,我们会看到如何在给定任何图形中其他变量后,计算后验概率。但是在此之前,让我们看最后一幅图,它是之前图形的综合。

这个图形很有意思,它在同一个图中结合了两个隐马尔可夫模型。但是其中一个,Y,也是另一个模型X的状态的原因。这是非常有力的结合。我们可以执行逆向训练和写出这个图形的联合概率分布:

{-:-}P(χ)=P(Yt-2P(Wt-2|Yt-2)

{-:-}P(Yt-1|Yt-2P(Wt-1|Yt-1)

{-:-}P(Yt|Yt-1P(Wt|Yt)

{-:-}P(Xt-2|Yt-2P(Ot-2|Xt-2)

{-:-}P(Xt-1|Yt-1, Xt-2P(Ot-1|Xt-1)

{-:-}P(Xt|Yt, Xt-1P(Ot-1|Xt-1)

1.2 变量消解

之前的例子令人印象深刻,而且似乎有些复杂。在这一节中,我们会看到如何处理复杂的问题,并在任一模型上执行推断。事实上,我们会看到事情并不像想象得那么完美,还是有一些限制。

然而我们有动态编程算法可以在需要推断问题中达到相当高的效率。

回忆一下,推断是指给定模型中变量子集的观测值后,计算其他变量子集的后验概率。解决这个问题通常意味着我们可以选取任一不相交的子集。

设χ是图模型中所有变量的集合,YE是两个不相交的变量子集,Y,E ⊂χ。我们把Y当作查询子集,也就是需要知道其中变量的后验概率,把E作为观测子集,也就是其中的变量都有观测值,也称为证据(所以记作E)。

最后,我们可以定义W=X-Y-E,即图模型中既不是查询变量又不是观测变量的变量子集。然后我们可以计算

W进行边缘化,我们只有P(Y,E

如果使用同样的推理,我们也可以计算证据P(E=e)的概率,例如概率图模型之精确推断_概率分布_02

因此贝叶斯推理的一般机制是沿着不需要的和观测到的变量进行边缘化,只剩下要查询的变量。

这个图模型编码了下列概率分布:

{-:-}P(ABCD)=P(A)·P(B|A)·P(C|B)·P(D|C)

这是一个非常简单的推理链,可以用来展示变量消解算法。正如我们之前看到的,图中的每一个节点都关联了一个潜在的函数,这个函数在类似于此的有向图中就是,给定父节点P(A)、P(B|A)、P(C|B)和P(D|C)情况下的条件概率。如果P(A)可以直接从图中的关联函数中读出,P(B)就需要通过沿A边缘化计算得出:概率图模型之精确推断_后验概率_03

它看起来很简单,但是也可以变得计算量很大(好吧,也许没那么大)。如果概率图模型之精确推断_R_04概率图模型之精确推断_概率分布_05(即,A有k个可能的值,B有m个可能的值),执行之前的求和需要2m·k-m次操作。为了理解这个论断,我们写出求和公式:

概率图模型之精确推断_后验概率_06

{-:-}P(A=1)P(B=1|A=1)+

{-:-}P(A=2)P(B=1|A=2)+

{-:-}…

{-:-}P(A=k)P(B=1|A=k)

这个公式需要计算B的每一个m值。

完成这个操作后,我们边缘化A。我们可以说,得到了一个等价的图模型,如

这里,B的分布已经通过A的信息进行了更新。如果我们想找出C的边缘分布,我们可以使用相同的算法,获取P(C)。同样,我们可以获得P(D)。最终,为了获取P(D),我们所做的一切有下列完整求和形式:

概率图模型之精确推断_后验概率_07

但是,因为每一次求和中我们只需要关注特定的变量,我们可以重写求和公式:

概率图模型之精确推断_R_08

这极大地简化了计算量,因为求和操作只需要使用局部分布。作为练习,我想让读者展示,对于给定的概率图模型,表示k中n个变量的链,然后计算复杂度只有O(kn)。注意,O记号表示,计算时间的上界与括号中的函数成比例(也称作最差时间复杂度)。很明显,这个方案已经很有效。

这个例子中的主要思想是,我们可以对变量求和,并在下一步中重用之前的结果。理想情况下,我们希望对任何图形使用同样的思想,然后通过暂存中间结果来逐步消解变量。这是可以做到的,因为得益于图模型的结构,每一个求和步骤中的表示只依赖少数变量,我们可以把结果沿着图中的路径暂存起来。

1.3 和积与信念更新

在计算一个变量(或者变量子集)的分布时,主要操作是边缘化。边缘化通过在一个变量(或者变量子集)上求和来把变量从表达式中消解出去。如果我们把φ叫作联合概率分布分解中的一个因子,我们可以使用如下属性,像之前文节中看到的,来泛化和优化变量消解算法:

  • 对称律:φ1φ2=φ2φ1
  • 结合律: (φ1·φ2) ·φ3=φ1·(φ2·φ3)。
  • 如果

如果我们再次使用这些属性,处理之前文节中的联合分布P(ABCD),我们有:

概率图模型之精确推断_R_09

最后,反复出现的主要表达式是在一个因子上的和积结果,可以写作概率图模型之精确推断_后验概率_10

因此,通常如果我们可以找到有向图模型中因子或变量的优质顺序,正如之前看到的,我们就可以使用和积公式,逐步消解每一个变量直到得到想要的子集。

顺序必须可以边缘化每一个包含待消除变量的因子,生成可以再次使用的新因子。

一种可能的执行方式是使用下列算法(《概率图模型》(Probabilistic Graphical Models),D. Koller,N. Friedman,2009,MIT出版社),叫作和积变量消解算法(Sum-product Variable Elimination Algorithm)

  • Φ:因子集合。
  • Z:要消解的变量集合。
  • Z上的序。

1.设Z1, …,Zk是Z上的序,满足概率图模型之精确推断_概率图模型_11当且仅当i<j。

2.循环i=1, … ,k。

3.Φ=SumProductEliminateVar(Φ,Zi)。

4.概率图模型之精确推断_概率分布_12

5.返回φ*。

这个算法执行如下:当收到消解变量或因子的顺序后,对每一个变量(或因子)使用算法消解变量并使用这个函数(后面会定义)的结果缩小因子集合。然后乘以剩下的因子并返回结果。

子过程如下,目的是一次消除一个变量:

和积消解算法(Φ:因子集合,Z:要消解的变量):

1.

2.概率图模型之精确推断_概率图模型_13

3.概率图模型之精确推断_概率分布_14

4.概率图模型之精确推断_概率分布_15

5.返回概率图模型之精确推断_后验概率_16

第二个步骤就是完成了我们在之前的例子中逐步消解的行为。这个思想首先乘上变量Z出现时的潜在函数,然后边缘化(第4行)消解变量Z。最后,算法返回因子集合,这集合已经去掉所有包含Z的因子(第2行)。新的和积因子通过对Z的边缘化得到,并添加进来(第5行)。同时注意,第1行选取了包含所有待消解的变量Z的因子。

最后,当这个过程按变量顺序执行,我们可以逐个消解变量直到获得期望的子集。

让我们看看这个过程在下列例子上是如何工作的

这是分解形式:P(ABCD)=P(A)·P(B|A)·P(C|B)·P(D|B)。条件概率分布由如下矩阵定义:

A =<strong>matrix</strong>(c(0.8, 0.2), 2, 1)B =<strong>matrix</strong>(c(0.6, 0.4, 0.3, 0.7), 2, 2)C =<strong>matrix</strong>(c(0.5, 0.5, 0.8, 0.8), 2, 2)D =<strong>matrix</strong>(c(0.3, 0.7, 0.4, 0.6), 2, 2)

条件概率分布用矩阵中的列表示。例如,B是:

[,1]  [,2][1,]   0.6   0.3[2,]   0.4   0.7

要消解的变量集合是{A,B,C},因此最终获得的是D的边缘概率分布。我们可以逐步使用算法:

1.首先消除顺序中的A,获得P(B,C,D),因此我们需要边缘化A:

概率图模型之精确推断_后验概率_17

2.执行同样的过程,复用之前的结果,继续消解B获得P(C,D)。在第一个算法的第3行中,你可以看到通过φ调用SumProductEliminateVar的结果指派给了φ。这里使用了之前步骤的结果:

概率图模型之精确推断_后验概率_18

3.现在,我们只剩下两个变量C和D,我们需要使用第二个算法中的同样步骤消解C:

概率图模型之精确推断_概率分布_19

在R中,你可以使用下列代码,迅速地得到结果:

Bs =t(A) %*%t(B)  Cs =Bs %*%t(C)  Ds =Cs %*%t(D)  Ds        [,1]   [,2]  [1,] 0.3362 0.6638

最后,我们还有3个问题:

  • 如果我们观察到一个变量,该如何计算其他变量子集的后验概率?
  • 是否可能自动找出变量的最优(或者至少非常高效)序列?
  • 如果存在这样的序列,我们是否可以应用到任何类型的图中,特别是带有回路的图中?

第一个问题的答案很简单,我们只需要通过实例化φ[E=e]替换每一个因子φ。但是如果我们使用之前的算法,我们会得到P(Z,e),其中Z是查询子集。所以我们还需要正则化,根据贝叶斯公式,获取期望的后验条件概率。

之前的算法可以扩展成如下形式:

  • φ*=P(Z,e是之前计算的边缘分布。

我们会在本文中,使用一种叫作联结树的算法回答第二和第三个问题。这个算法也是当今概率图模型中最基础的算法。它试图把任何类型的图形转换成具有变量聚类的树中。这样我们就可以使用之前的算法,同时保证最优顺序和最小化的计算成本。

本文摘自《概率图模型 基于R语言》

概率图模型之精确推断_后验概率_20


内容简介

概率图模型结合了概率论与图论的知识,提供了一种简单的可视化概率模型的方法,在人工智能、机器学习和计算机视觉等领域有着广阔的应用前景。本书旨在帮助读者学习使用概率图模型,理解计算机如何通过贝叶斯模型和马尔科夫模型来解决现实世界的问题,同时教会读者选择合适的R语言程序包、合适的算法来准备数据并建立模型。本书适合各行业的数据科学家、机器学习爱好者和工程师等人群阅读、使用。