当前位置: 首页 > news >正文

因果系列文章(3)——有向无环图

Pearl教授被称为“贝叶斯网络之父”,足以显示他对贝叶斯网络研究的贡献(虽然他好像并不是贝叶斯网络的最初提出者)。但正如他自己所说,他曾经一度认为贝叶斯网络是开启人工智能大门的金钥匙,直到他发现自己错了,于是提出了更加符合因果关系研究的因果图模型。尽管如此,贝叶斯网络仍然是人工智能领域的重要工具,仍然在各行各业成功地应用,其中的数学基础也与因果图一脉相承。因此,在介绍因果图之前,本文先介绍贝叶斯网络这种有用的工具,并指出它为什么不能反应因果关系的原因。

392f953627ace8fa3371eb719a2bd2b2.png

 

贝叶斯网络

贝叶斯网络(Bayesian Network),也被称为信念网络(Belief Network),是一种典型的“概率图模型”(Probabilistic Graphical Model, PGM),是一种用图形化的方式来表达事件之间的相互依赖关系的方法(注意,这里没有说因果关系!)。

贝叶斯网络的基本结构是一个有向无环图(Directed Acyclic Graph, DAG),由节点(nodes)和节点之间带有单向箭头的连线组成。下图给出了一个两个变量组成的最简单的有向无环图。为了后续描述方便,这里先定义一些基本的术语:

  • 节点(nodes/vertices/variables):就是图中的变量 A 和 B 。
  • 边(link/edge):就是图中单方向的箭头,这表明变量 A 和 B 之间存在方向。
  • 路径(path):就是从一个变量沿着箭头的方向抵达另一个变量的经过。图1中只有一条路径就是 A→B 。

图1:两节点的有向无环图

这些概念很好理解。图中每一个节点都代表一个变量。从节点 A 指向节点 B 的箭头表示变量 B 依赖于变量 A ,且变量A是变量B的父节点(parent node),变量B是变量 A 的子节点(child node)。这里的变量既可以是离散的,也可以是连续的。对于离散的情况,可以把变量想成事件,变量可以取的几种值就是事件发生的几种情况。对于连续的情况,可以想象成某个事件发生的程度,或者某个特征的定量描述。

从任意起点开始,沿着箭头的方向转移到下一节点,以此类推下去,一定不会回到起始节点,这就是有向但无环的含义。下图给出了一种由四个变量构成的有向无环图的例子。在这个例子中, x1 和 x3 是 x2 的父节点, x4 是 x3 和 x2 的子节点。从 x3 到 x4 有两条路径,分别是 x3→x4 和 x3→x2→x4 。

图2:四个节点的有向无环图

当然,准确的说,贝叶斯网络不仅包含有向无环图的结构,还包括图中的参数。这里的参数指的就是各节点或者说各变量的概率分布。

对于根节点(也就是没有父节点的节点),比如图2中的 x1 和 x3,我们需要知道它们的边缘概率分布,对于非根节点,比如图1中的 x2 和 x4 ,我们需要知道它们的条件概率分布。然后我们就可以求出四个变量的联合概率分布

P(x1,x2,x3,x4)=P(x1)P(x3)P(x2|x1,x3)P(x4|x2,x3)更一般地,一个用 G 表示的、参数为 θ 的贝叶斯网络为 (G,θ) ,其中 G 表示有向无环图,可定义为 G=(N,E) , N 是该有向无环图中的节点集, E 是节点之间的边集。图中每一个节点 i 都代表一个变量 xi 。给出贝叶斯网络中的变量集 X={x1,x2,...,xn} ,该网络的联合概率分布为

P(X)=∏i=1nP(xi|πi)

其中 n 是贝叶斯网络中节点的个数, πi 是节点 xi 的父节点集。参数集 θ 中定义了贝叶斯网络中每个节点的概率分布。如果一个节点没有父节点,那么它的先验概率(边缘概率)需要指定。如果一个节点有一个或多个父节点,那么它的条件概率分布需要被给出。

这里补充一个重要的基本公式,贝叶斯公式:

P(A|B)=P(B|A)P(A)P(B)这是根据条件概率的定义推导出的:

P(A,B)=P(A)P(B|A)=P(B)P(A|B)

回到刚才,给出观测的数据和贝叶斯网络的结构,每个节点的概率分布便可被估计出,这便是贝叶斯网络的参数估计或参数学习。如果网络的结构也是未知的,那么网络的结构也是可以通过观测数据学到的,这便是贝叶斯网络的结构学习。根据历史数据或经验给定贝叶斯网络的参数表和结构之后,贝叶斯网络便得到了完全的学习,并可进一步根据某事件实际发生的情况推断未发生事件的概率,也即贝叶斯网络的推理。当贝叶斯网络结构复杂时,计算边缘概率分布的计算量可能会很大,因此通常使用一些近似逼近的方法来求解。

就借助图2的模型,我们可以具体用一个实际的例子来更好地说明。图2给出了一个上班到岗是否迟到与交通、天气和起床关系的贝叶斯网络。我们根据经验常识建立了这样的网络结构,我们知道:

  • 上班是否迟到取决于交通是否堵车和起床早晚
  • 交通也取决于起床时间(起床太晚容易堵车)
  • 交通还取决于天气(天气下雨容易堵车)

当然,为了简化分析,所有四个变量都是离散且二元的,也即每个变量的取值都只有两种情况。

图3:一个贝叶斯网络的例子

图3给出了“天气”和“起床”两个事件的边缘分布,也给出了“交通”这个事件与“天气”和“起床”之间关系的条件概率分布表(Conditional Probabilistic Table, CPT)。当然,“到岗”与“交通”和“起床”也应该有一个条件概率表,这里不往下继续编了。这个表格的获取可以从历史的数据中归纳得出,也就是说我们可以记录100次历史上班的这些数据,然后简单的数出这些概率值,填进表格里。比如我们从历史数据中得知,天气为晴天的概率是0.2,为雨天的概率是0.8,并且某人起床早的概率是0.95,起床晚的概率是0.05。当天气为下雨且起床晚时,交通堵塞的概率为0.9,当天气为晴天且起床早时,交通堵塞的概率为0.05,等等。

有了结构,有了参数,我们就可以进行推理了。贝叶斯网络的最大魅力也在于此,任意已知某一个或多个事件的发生概率,我们就可以更新其它节点发生的概率。比如,我们可以:

  • 根据当天的天气或起床的早晚,来估计今天上班迟到的概率
  • 根据今天上班是否迟到,来反向推断当天的天气或交通情况

假如我知道今天迟到了,那么按照条件概率表,交通堵塞和起床晚的概率是确定的。但是,一旦我得知,今天的天气很糟糕,那么迟到的原因则更可能是因为交通,而不是起床晚。也就是说我们可以根据已知的事件更新其它节点发生的概率。当然,这种推理在节点数很多的时候,是计算量非常大的。在此不作展开。

当然,以上的贝叶斯网络,结构和参数都是给定的。但实际应用中,贝叶斯网络的结构和参数可能并不知道。通过经验人为指定是一种方式,但并不一定准确。能否通过数据学习出网络的结构和参数,一直也是一个难解的问题。相关文献已经有较多关于这方面的研究,但实际效果并不好,特别是贝叶斯网络的结构,因为箭头的方向总容易学习错,这根本原因还是贝叶斯网络并没有真正解决因果的问题,所以箭头的方向是假的因果方向,学习的效果总不对也是必然的

即便如此,贝叶斯网络也被广泛地应用于疾病诊断、市场预测、故障排除等方面。有兴趣的读者可以阅读相关书籍和博文。但在此需要必须再次强调的一点是,贝叶斯网络仍然没有因果的关系,说到底,贝叶斯网络也只是一张“巨大的概率表的简洁形式”。但贝叶斯网络所使用的有向无环图,仍然是因果图的重要组成部分。同时,贝叶斯网络中的概率公式也适用于因果图。在进入因果图的分析之前,还需要弄清楚这种图模型的结构和所预示的概率分布的关系。

有向无环图及概率分布

有向无环图拥有非常丰富的内涵。我们可以通过这种图的形式洞悉变量之间的相互独立关系或者条件独立关系。下面,以图4的三个有向无环图为例,介绍如何分析节点背后的相互独立性。

图4:三个DAG的例子

从图4(1)的有向无环图中我们可以知道:

  • P(C|A,B,D)=P(C) ,也即 C 和其它所有节点都不相关(独立)
  • P(B|A,C,D)=P(B|A) ,即 B⊥⊥D,C|A ,也即 B 只与 A 相关,与 C 和 D 都不相关。
  • P(D|A,B,C)=P(D|A)

从图4(2)的有向无环图中我们可以知道:

  • P(A|B,C,D)=P(A|D) ,也即 A⊥⊥B,C|D
  • P(D|A,B,C)=P(D|A,B) ,即 D⊥⊥C|B

从图4(3)的有向无环图中我们可以知道:

  • P(A|B,C,D)=P(A|C,D) ,也即 A⊥⊥B|C,D
  • P(D|A,B,C)=P(D|A,B) ,也即 D⊥⊥C|A,B

三种路径结构

在本篇最后,再介绍三种路径结构:链式(chain)、叉式(fork)、反叉式/对撞(inverted fork/collider)以及它们背后表达的相关关系。在Pearl的书中,这种三个节点的网络结构也被称之为“接合”(junction)。研究这三种接合具有重要的意义,因为所有的贝叶斯网络(或者因果图)都可以拆解为不同接合模块的组合。

图5:三种路径结构

第一种结构链接合(也被称为head-to-tail),顾名思义,像一条链子一样,让信息从一端流到另一端。第二种,叉接合(也被称为tail-to-tail),这么画可能看不出来,但是把中间的节点画高一点,就可以看出两个腿儿像一个叉子一样。最重要的是第三种,反叉式,也叫对撞接合(也被称为head-to-head),像两个对撞的小行星一样,信息流入中间的节点。

在这三种路径中,哪些节点之间是有相关性的呢?如果两个节点分别位于路径的两端,那么如果:

  • 有信息流向这两个节点
  • 或者有信息从一个节点流向另一个节点

那么这两个节点就是相关的。

例如,图5中的链接合,信息从 A 经过 B 流向 C ,因此 A 和 C 是相关的(即不是独立的)。考虑一个更复杂的链结构: A→C→D→E→B ,虽然变长了,但是信息还是能够从 A 流向 B ,因此 A 和 B 仍然是相关的。

再看图5中的叉接合,信息从 B 流向 A ,也从 B 流向 C ,那么 A 和 C 就不是独立的。考虑一个更复杂的叉结构: A←C←D←E→G→B ,信息从 E 流向 A ,也流向 B ,那么 A 和 B 就不是独立的。

最后一种,对撞接合,信息从 A 和 C 分别流向 B ,并且在 B 对撞。所以 B 也被称为对撞子(collider)。此时, A 和 C 都影响 B ,但是信息没有从 B 流向 A 或者 C ,因此 A 和 C 是相互独立的。

更一般地,如果一条从 A 到 B 的路径中出现了对撞接合,那么 A 和 B 就不可能是相关的(至少针对这条路径而言,如果有别的路径那再另说)。所以,对于路径 A→C←D←B ,信息分别从 A 和 B 流入 C ,并在此对撞。因此 A 和 B 仍然是不相关或者说相互独立的。

这三种接合结构在下一篇分析混杂和去混杂时,还会继续进行深入的探讨。

本节仅作简要介绍。

本节中部分示例来源Pearl的新书《为什么》[2],以及Coursera上宾夕法尼亚大学的因果课[3]。本节封面图片来源于《为什么》一书英文简装版的封面。有关贝叶斯网络的内容,读者也可参考贝叶斯网络Matlab工具箱的教程[4],上面不仅介绍了工具箱怎么使用,也有足够多有关贝叶斯网络的介绍。

参考

  1. 系统参考:关河因果分析系统新型数据分析产品_因果分析_关河因果【官网】 (grandhoo.com)
  2. ^朱迪亚·珀尔,达纳·麦肯齐 著,江生,于华 译,“为什么:关于因果关系的新科学”,中信出版集团,2019.
  3. ^Jason A. Roy, "A Crash Course in Causality: Inferring Causal Effects from Observational Data", Coursera A Crash Course in Causality: Inferring Causal Effects from Observational Data | Coursera
  4. ^How to use the Bayes Net Toolbox How to use the Bayes Net Toolbox

相关文章:

  • 02 数据库语言SQL
  • [简化开发] mybatis plus自动填充 INSERT 与 INSERT_UPDATE 坑(记录)
  • 如何构建一款自定义的开源微服务架构?
  • SNMP工具
  • Python学习:函数中定义参数的四种方式
  • 4个非常实用的Java项目,快用起来
  • 基于Sentry打造前端性能监控平台
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • 强化学习(ICML2022)
  • CS5181E 单节锂电池充电管理IC特点及应用
  • 计算机毕业论文基于springboot的社区物业服务管理项目源码
  • Hbase大批量数据迁移之BulkLoad
  • java计算机毕业设计外贸服装订单管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • C#基于asp.net的社区团购网站
  • Spring Boot + Netty + WebSocket 消息推送
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • download使用浅析
  • HTTP那些事
  • input实现文字超出省略号功能
  • isset在php5.6-和php7.0+的一些差异
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode18.四数之和 JavaScript
  • Mac转Windows的拯救指南
  • MySQL-事务管理(基础)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • php ci框架整合银盛支付
  • Python中eval与exec的使用及区别
  • React as a UI Runtime(五、列表)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue全家桶实现一个Web App
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聚簇索引和非聚簇索引
  • 网页视频流m3u8/ts视频下载
  • 在Unity中实现一个简单的消息管理器
  • Java数据解析之JSON
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #define与typedef区别
  • ${ }的特别功能
  • (14)Hive调优——合并小文件
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • .gitignore文件---让git自动忽略指定文件
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET多线程执行函数
  • .net专家(张羿专栏)
  • @RequestMapping 的作用是什么?
  • [20190416]完善shared latch测试脚本2.txt
  • [22]. 括号生成
  • [Android View] 可绘制形状 (Shape Xml)
  • [android] 看博客学习hashCode()和equals()
  • [CDOJ 1343] 卿学姐失恋了