到目前为止,我只着重阐述了贝叶斯网络的一个方面,即图示和其中的箭头,箭头从因恰当地指向果。事实上,图示就相当于贝叶斯网络的引擎。但与任何引擎一样,它也需要燃料来运行,这种燃料被称为“条件概率表”(conditional probability table,简称为CPT)。
另一种说法是,图示以定性的方式描述了变量间的关系,但如果你想要定量的答案,你就需要定量的输入。在贝叶斯网络中,我们必须具体给出在给定了“父节点”的条件下每个节点的条件概率。(请记住,一个节点的父节点是指向它的所有节点。)这类概率就是前向概率,P(证据|假设)。
举个例子,在A为根节点(root node)时,由于不存在指向它的箭头,我们只需要为A的每个状态指定一个先验概率即可。在我们之前提到的第二个网络,“疾病→检测”中,“疾病”就是一个根节点。因此,我们所做的就是指定了一个人患有这种疾病的先验概率(1/700)和其未患这种疾病的先验概率(699/700)。
我们将A描述为根节点,并不是说A的发生不存在起因。实际上,几乎没有任何变量符合这种描述。我们真正的意思是,A的任何先验的因都可以被适当地概括为先验概率P(A),其中A为真。例如,在“疾病→检测”的例子中,家族病史就可能是一个病因。但是,只要我们确信家族病史不会影响变量“检测”(在已知“疾病”的状态的前提下),我们就不必将它表示为图示中的一个节点。但是,如果“疾病”的一个因也直接地影响了“检测”,那么这个因必须在图示中明确地表示出来。
再举另一个例子,当节点A有父节点时,在决定其自身状态之前,A必须先“听从于”其父节点。在乳房X光检查的例子中,“检测”的父节点是“疾病”。我们可以用一个2×2的表来表示这个“听从”过程(见表3.2)。例如,如果“检测”“听到”D=0(检查者未患病),则它在88%的情况下取值T=0,在12%的情况下取值T=1。请注意,此表的第三列包含的信息与我们先前从乳腺癌监测联合会那里得到的信息相同:假阳性率为12%,检测敏感度为73%。其余两格中所填数字使每行之和为100%。
表3.2 简单的条件概率表
在面对更复杂的网络时,条件概率表会相应地变得更加复杂。例如,如果某个节点有2个父节点,则条件概率表必须考虑到2个父节点的4种可能状态。我们来看一个具体的例子,该例是由贝叶斯实验室(BayesiaLab)的斯蒂芬·康拉迪和莱昂内尔·焦夫提出的。其中涉及了一个所有旅行爱好者都很熟悉的场景,我们可以称这个例子为:“我的行李箱在哪里?”
设想你离开了德国亚琛市,刚刚飞抵非洲的桑给巴尔,现在,你正等着你的行李箱出现在传送带上。其他乘客已经陆续拿到了箱子,而你一直在等,等,等……问题来了:你的行李箱没有被从亚琛运到桑给巴尔的概率有多大?答案显然取决于你等了多久。如果这架航班的旅客的行李箱刚刚开始出现在传送带上,那么也许你应该耐心一点儿,再稍等一会儿。而如果你已经等了很长时间,那么事情看起来就不太妙了。我们可以通过绘制一张因果图来量化你的焦虑(见图3.5)。
图3.5 机场/行李箱例子的因果图
这张图反映了一个直观的想法,即行李箱出现在传送带上有两个因。第一,它必须一开始就跟随你“上”了飞机上,否则它就肯定不会出现在传送带上。第二,只要行李箱的确“上”了飞机,那么随着时间的推移,它出现在传送带上的可能性就会越来越大。
为了将因果图转化为贝叶斯网络,我们必须指定条件概率表。我们假设桑给巴尔机场某架航班的所有行李在10分钟内就能卸载完毕。(桑给巴尔的效率很高!)同时假设你的行李箱跟随你“上”了飞机的可能性,P(行李箱“上”了飞机=真)为50%。(如果这冒犯了亚琛机场的工作人员,我道歉。我只是照搬了康拉迪和焦夫给出的数字。就我个人而言,我更愿意假设一个更高的先验概率,比如95%。)
以下就是为解决“行李箱在传送带上”的概率这一问题创建的条件概率表(见表3.3)。
表3.3 一个更复杂的条件概率表
这张表格虽然包含很多信息,但应该很容易理解。表格数字部分的前11行表示,如果你的行李箱没有“上”飞机(行李箱“上”了飞机=假),那么,无论你等待了多长时间,它都不会出现在传送带上(行李箱在传送带上=假),即P(行李箱在传送带=假|行李箱“上”了飞机=假)为100%。这就是前11行中所有的数字“100”的含义。
表格数字部分的后11行表示,这些箱子从飞机上被工作人员以一个稳定的速度卸下来。如果你的行李箱确实“上”了飞机,那么它在第一分钟被卸下来的概率是10%,在第二分钟被卸下来的概率也是10%,以此类推。因此在等待了5分钟后,你的行李箱有50%的概率已被卸下来,也就是P(行李箱在传送带上=真|行李箱“上”了飞机=真,等待时间=5)为50%。10分钟后,所有的行李箱都被卸下来了,所以P(行李箱在传送带上=真|行李箱“上”了飞机=真,等待时间=10)为100%。因此,我们在表右下端的那个格看到的数字是100。
像大多数贝叶斯网络一样,我们借助它所做的最有趣的事是解决逆概率问题:如果x分钟过去了,我还没有拿到我的行李箱,那么它“上”了飞机的概率是多少?对于这个问题,贝叶斯法则能够自动进行相应的计算,并且其计算结果揭示了一个有趣的模式。在等待了1分钟后,你的行李箱还有47%的概率跟随你“上”了飞机。(请记住,我们在之前的假设中给出的先验概率是50%。)4分钟后,这个概率降到了33%。10分钟后,这个概率降为0。图3.6显示了这一概率随时间的变化趋势,我们可以称之为“放弃希望曲线”。对我来说,比较有趣的一点在于它是一条曲线,而我想在大多数人的设想中它可能是一条直线。因此,它实际上给我们带来了一个非常乐观的消息:不要太早放弃希望!根据这条曲线,在总期限(10分钟)的前半段时间里,你只需要放弃1/3的希望。
图3.6 看到自己的行李箱出现在传送带上的概率一开始下降缓慢,之后则加速下降(资料来源:马雅·哈雷尔绘图,数据来自斯蒂芬·康拉迪和莱昂内尔·焦夫)
我知道,虽然你从这个例子中获得了一项宝贵的人生经验,但你肯定并不想自己动手绘制这张概率表。即使这个例子只是一个有3个节点的小型网络,它仍然包含2×11=22个父状态,且其中的每一个都为子状态的概率做出了贡献。然而,对于计算机来说,这样的计算只是非常初级的运算(在一定意义上我们可以这么说)。当然,如果这种运算不是以系统化的方式完成的,那么过高的运算次数仍然会压垮速度最快的超级计算机。如果一个节点有10个父节点,且每个父节点都有2个状态,则条件概率表将超过1000行。如果10个父节点中的每一个都有10个状态,那么这张表将有100亿行!为此,人们通常会对网络中的连接进行筛选,只保留那些最重要的连接,让网络保持一个相对“稀疏”的状态。在贝叶斯网络的发展过程中,其中一项技术成果就是开发出了一种方法让我们可以利用网络结构的稀疏性实现合理的计算时间。