|
|
|
|
移动端

1.1.4 概率编程系统:用编程语言表达的概率推理系统

《概率编程实战》第1章概率编程简介,本章中,您将学习如何使用概率推理系统的两个主要组成部分做出日常决策,还将了解现代概率编程语言是如何比Java或Python等通用语言更轻松地创建这种推理系统的。本章还将介绍Figaro,这是本书自始至终使用的基于Scala的概率编程语言。本节为大家介绍概率编程系统:用编程语言表达的概率推理系统。

作者:姚军 译来源:人民邮电出版社|2018-01-20 17:08

【新品产上线啦】51CTO播客,随时随地,碎片化学习

1.1.4 概率编程系统:用编程语言表达的概率推理系统

每个概率推理系统都使用某种表示语言表达其概率模型。表示语言有许多种,您可能已经听说了其中一些,如贝叶斯网络(也称作置信网络)和隐含马尔科夫模型。表示语言控制系统可处理的模型以及模型的情况。语言所能表示的一组模型称作语言的表达能力。对于实际应用,您肯定希望表达能力尽可能强。

简单地说,概率编程系统是以编程语言作为表示语言的概率推理系统。我所说的编程语言是指具有编程语言所有预期特征(如变量、丰富的数据类型、控制流、函数等)的语言。正如您将要看到的,概率编程语言可以表达极其广泛的概率模型,超越传统的概率推理框架。概率编程语言有极强的表达能力。

图1-7说明了概率编程系统与概率推理系统的关系。可以将该图与图1-3比较,以凸显两种系统之间的差别。主要的变化是,模型以编程语言编写的程序表达,而不使用贝叶斯网络等数学结构。由于这种变化,证据、查询和答案都应用到程序中的变量。证据可能指定程序变量的特定值,查询询问程序变量的值,答案是不同查询变量值的概率。此外,概率编程系统通常带有一套推理算法。这些算法适用于以该语言编写的程序。


尽管存在许多类概率编程系统(参见附录B),本书的重点是函数式的图灵完备系统。函数式意味着它们基于函数式编程,但是不要被它吓住——使用函数式概率编程系统并不需要知道λ函数(lambda)等概念。这一切只意味着,函数式编程提供了这些语言表示概率模型的理论基础。同时,图灵完备是一句行话,表示编程语言可以编写任何能在数字计算机上完成的计算。如果某一运算可以在数字计算机上完成,就可以由任何图灵完备语言实现。您所熟悉的大部分编程语言,如C、Java和Python,都是图灵完备的。因为概率编程语言构建于图灵完备编程语言基础上,它们可以构建的模型类型极其灵活。

关键定义

表示语言——用于编码关于模型领域知识的语言。

表达能力——表示语言编码模型中不同类型知识的能力。

图灵完备——能够表示可在数字计算机完成的任何计算的语言。

概率编程语言——使用图灵完备编程语言表示知识的概率表示语言。

附录B论述了除本书使用的Figaro之外的一些概率编程系统。这些系统大部分都使用图灵完备语言。有一些系统(包括BUGS和Dimple)没有使用图灵完备语言,但是它们对目标应用很实用。本书主要关注图灵完备概率编程语言的能力。

将概率模型表示为程序

但是,编程语言如何成为概率建模语言?如何将概率模型表示为程序?我将在这里提出回答这一问题的一些线索,将更深入的讨论放在稍后的章节,那时您已经对概率程序有所了解。

编程语言的核心思路之一是执行。您执行一个程序以产生输出。概率程序也类似,但是它可以有许多执行路径,每个路径产生不同的输出。在程序中随机选择执行路径,每个随机的选择有许多可能的结果,程序编码每种结果的概率。因此,概率程序可以视为随机执行以产生输出的一个程序。

图1-8说明了上述概念。在图中,概率编程系统包含了一个角球程序。这个程序描述生成角球结果的随机过程,它取得一些输入;在我们的例子中,这些输入是中锋的身高、守门员的经验和风力。根据这些输入,程序随机执行以生成输出。每次随机执行产生特定的输出。因为每个随机选择都有多种可能结果,存在许多可能的执行路径,造成不同的输出。任何给定输出(如进球)可能由多个执行路径产生。

让我们来看看,这种程序如何定义概率模型。从一系列随机选择形成的任何特定执行路径都有特定的结果。每个随机选择都有发生的概率。如果将这些概率相乘,就可以得到执行路径的概率。这样,程序定义了每个执行路径的概率。想象一下,如果将该程序运行许多次,生成任何给定执行路径的次数比例等于其概率。输出的概率就是产生该输出的程序运行次数比例。在图1-8中,1/4的运行产生进球的结果,所以进球概率为1/4。

注意:

您可能疑惑于为什么图1-8中的块标签为“随机执行”而不是其他插图中的推理算法。图1-8展示了概率程序的含义——定义一个随机执行过程,而不是使用概率编程系统的方式——使用推理算法根据证据回答查询。所以,尽管上述插图的结构类似,但是表达了不同的概念。事实上,随机执行形成了某些推理算法的基础,但是许多算法并不基于简单的随机执行。

利用概率编程决策

使用概率编程预测未来很容易理解。只要随机多次执行程序,使用当前已知的信息作为输入,并观察每个输出的出现次数。在图1-8的角球示例中,多次执行该程序,以高中锋、缺乏经验的守门员和强风作为输入。因为1/4的运行得出进球的结果,您可以认定在这些输入条件下,进球概率为25%。

但是,概率编程的魔法在于,它还可以用于1.3.1小节中描述的各类概率推理。概率编程不仅可用于预测未来,还可以推断导致特定结果的事实;您可以“展开”程序,发现结果的根源,还可以在某种情况下应用程序,从结果中学习,在未来使用学习到的信息做出更好的决策。可以使用概率编程做出所有通过概率思想得到的决策。

概率编程是如何工作的?当人们意识到,在较简单的表示语言(如贝叶斯网络)上有效的推理算法可以扩展到程序上时,概率编程就变得实用了。本书的第3部分介绍实现这一扩展的各种推理算法。幸运的是,概率编程系统自带一些内建的推理算法,这些算法可以自动地应用到您的程序中。您所需要做的是以概率程序的形式提供领域知识并指明证据,系统负责推断和学习。

在本书中,您将学习通过概率编程进行概率推理。首先,您将学习概率模型的概念以及使用它得出结论的方法。您还将学习一些从简单组件构成的模型中得出那些结论所需进行的操作。您将学习各种建模技术,以及使用概率编程实现它们的方法,还将了解概率推理算法的工作原理,以便有效地设计和使用自己的模型。在阅读完本书之后,您将能够自信地使用概率编程得出有益的结论,帮助您在面对不确定性时做出决策。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C#和.NET核心技术

本书重点讲解如何用实用的代码来解决具体的实际问题。本书的内容覆盖面很广,从新的C#范型到Web服务,从反射到安全等都有涉及。系统地介绍...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊