Advanced Topics in Statistical Machine Learning 笔记03:贝叶斯网络02(Bayesian Network02)

在上一篇笔记中,我们已经对贝叶斯网络 (Bayesian Network) 的结构和一些关键的性质都进行了比较详细的介绍,这一节开始,我们需要结合实际的情况,来看看如何根据针对不同的问题来进行贝叶斯网络建模,以及如何使用贝叶斯网络作为分类器 (Classifier)

查询处理(Query Processing)

贝叶斯网络本质上是一个概率推论框架 (Probabilistic Reasoning Framework),它主要可以回答 4 种查询。

*对于贝叶斯网络的可视化,有一个非常好用的软件叫做 Samlam,这篇笔记中的大部分图都会使用 Samlam 中的效果图

证据概率:Probability Of Evidence

最简单的一种查询就是对某些证据 (Evidence) 变量实例化 e 的概率 P(e) 的查询。比如,在下面这个例子中,我们想要知道一个病人在 X 光测试为阳性,但是没有呼吸困难的概率,即 P(X=True, D=False). 这里的变量 E = {X, D} 就是证据变量 (Evidence Variables)

在这里插入图片描述
当然,证据变量概率的查询也会有其他形式,比如 P(X=True ∨ D=True)。不仅仅是合取 (Conjunction) 形式,也会有析取 (Disjunction) 形式的查询。贝叶斯网络并不直接支持具有任意证据的查询。但是这些概率都可以间接计算得出,比较常用的方法就是辅助节点法 (Auxiliary-node Method)。该方法的思想很简单,我们假设一个辅助节点 (Auxiliary Node) E,我们想要查询的节点 XP 都是它的父节点,因此对点 E,我们能得到如下的 CPT:

在这里插入图片描述
因为我们的条件是 X=True ∨ D=True,所以只有在 XD 都为 False 时,才不满足。可以看到,这个 CPT 中只有 0 和 1 值,是一个确知 CPT (Deterministic CPT)。这个方法仅当证据变量比较少时适用,因为随着证据变量数量的增加,我们需要其他方式使得这个确知 CPT 占用的空间更小且更紧凑。

先验和后验边际:Prior and Posterior Marginals

先验和后验边际查询 (Prior and Posterior Marginals Queries) 是最常见的查询。在介绍这个查询之前,我们要再明确一些概念,我们给定一个联合概率分布 (Joint Probability Distribution) P(x1, x2, …, xn). 那么:

  • 先验边际 (Priori Marginal) 就是边际分布,它可以看作是联合分布在较小变量集上的投影。先验边际 P(x1, x2, …, xm)m ≤ n)就为:

在这里插入图片描述

  • 后验边际 (Posterior Marginal) 就是给定一些证据变量 e,计算边际分布:在这里插入图片描述
    比如,我们对于变量 C (Lung Cancer) 有一个概率分布(先验分布):

在这里插入图片描述
加入一个病人的X光测试结果为阳性,且没有呼吸苦难:𝐵: 𝑋 = 𝑡𝑟𝑢𝑒, 𝐷 = 𝑓𝑎𝑙𝑠𝑒. 那么,此时变量 C 的后验边际 (Posterior Marginal) P(C|X=True, D=False) 即为:

在这里插入图片描述

最大可能解释:Most Probable Explanation (MPE)

MPE 查询的目的是为了找到在给定一些证据 (Evidence) 的情况下,最合适/有可能的实例化。 用符号表示或许会更加直观,即给定一系列变量 X1, X2, X3, …, Xn 以及证据变量 e 的情况下,找到使得概率 P(x1, x2, x3, …, xn|e) 最大化的一组实例化(赋值)。这样的一个实例化 (Instantiation) 被称为已知证据 e 的情况下,最可能的解释 (Most Probable Explanation).

比如,对于一个X光检测结果为阳性且有呼吸苦难的患者,他很有可能“没有造访过亚洲”,“是一名吸烟者”,“有肺癌”,“有支气管炎(brochitis)”且“没有肺结核”。这个结果就是根据下图中的计算结果得来的,我们固定两个 Evidence X=True, D=False,得到了以上 MPE.

在这里插入图片描述
实际上它的计算思想非常简单。我们只需要想象一个包含所有变量 (Variables) 的 Joint Probability Table,然后我们删除所有不符合 Evidence 条件的组合,在剩下的所有实例化/组合中,选取使得联合概率最大的一个。

比如这里我们假设 Evidence 为 X1 = True, X2 = True
这里是引用

这里我们需要特别注意一点,有些人可能会想要使用后验边际 (Posterior Marginal) 来求取 MPE。比如,为每个变量 xi 选取能够使得 P(xi|e) 最大化的值,然后把这些值组合起来,作为 MPE,但事实上,这无法保证给我们正确的答案。

这里我们使用 Samlam 就可以很直观的得到一个例子,我们假设 Evidence 为 X = Positive, D = No。在这个情况下,我们得到的 MPE 中,该患者不是一个烟民(小窗口显示所有变量都为 NO),MPE 概率为 38.75%。但是,如果我们采用后验边际的方法,即为每个变量选择使得后验边际最大化的值时,该患者为烟民的概率更高,这就和 MPE 直接求取产生了矛盾,而且此时最终概率只有 20.03%。

在这里插入图片描述

最大后验假设:Maximum a Posteriori Hypothesis (MAP)

MAP 和 MPE 很相似,最大的区别在于后者会涉及网络中的所有变量 (Variables),但是前者只会涉及一部分变量。用符号定义来看即为:给定 𝑴 ⊆ 𝑿 和一些证据 𝒆,我们的目标是找到变量 𝑴 的实例化 m 使得 P(m|e) 最大,这个实例化 m 就是最大后验假设 (Maximum a Posteriori Hypothesis, MAP),变量 𝑴 就是 MAP 变量

在这里插入图片描述
所以,我们可以把 MAP 看做是 MPE 的一个特例,但是相比之下,后者的计算会更加简单。

我们仍然用一个 Samlam 的例子来展示计算结果。我们假设一个病人X光检测为阳性且没有呼吸困难,MAP 变量为 {A, S},通过计算可得,A= no, S = yes,概率为 50.74%

在这里插入图片描述
我们之前说过,MPE 相比 MAP 计算更加简单,因此,常会选择用 MPE 去近似 MAP,但也仅仅只是近似。从下图的结果我们可以知道,和之前同样的 Evidence,此时用 MPE 得出的结果为 A= no, S = no,概率为 48.09%

在这里插入图片描述

具体情境

接下来我们来看一看如何针对具体的情境进行贝叶斯网络的建模。我们会采用不同的建模方式,要体会它们之间的差异和优劣。

Case 1:专家I的诊断模型(Diagnosis Model from Expert I)

我们考虑如下的情境:

流感 (Flu) 是一种以发烧 (fever),身体不适 (body ache) 和疼痛 (pains) 为特征的急性疾病,可能与发冷 (chilling) 和嗓子疼 (sore throat) 有关。 感冒 (Cold) 是一种普遍与发冷 (chilling) 相关的身体疾病,可能会导致喉咙痛 (sore throat) 。 扁桃体炎 (Tonsillitis) 是扁桃体发炎,导致喉咙痛 (sore throat),并可能与发烧 (fever) 有关


根据上面这段信息,我们能够得到以下变量:
Disease: Flu, Cold, Tonsillitis
Symptoms: body ache and pains, chilling, sore throat, fever


每个变量的取值 (Value) 只有两种:True or False

因此,我们能够得到如下的一个贝叶斯网络模型:

在这里插入图片描述
当然,模型并不是唯一的,有着很多的选择。这里我们介绍一种非常常见的模型,叫做朴素贝叶斯模型 (Naïve Bayes)该模型的结构非常的简单,它仅有一个类节点 (Class) 以及众多的属性节点 (Attributes)。 在当下这个情境中,即表示为:

在这里插入图片描述
这里的类节点我们为其命名为 Condition,它有三个取值 (Cold, Flu, Tonsillitis),我们要找最可能的那一个。但是当我们选择使用朴素贝叶斯模型的时候,实际上也是隐性地加入了一些新的假设,比如:

  • Single-Fault 假设,即一个人只会得一种病。 因为我们说过,Condition 中有三个值,当我们确定哪一个是最有可能的病症时,我们会选择其中一个,所以这种情况下,一个人不会同时患上 Cold 和 Flu。然而,在我们之前创建的模型中,这种情况实际上是可能发生的
  • 在给定 Condition 的前提下,所有 Attributes (Chilling, Cold, …) 是相互独立的。 这意味着如果我们已知 Condition, Attributes 之间不会相互影响。但在当前这个情境中,这实际上也是不成立的,在我们之前创建的模型中,Chilling 和 Sore Throat 不仅和 Cold 相连,也和 Flu 相连。因此,即使 Cold is observed,Chilling 和 Sore Throat 仍不是互相独立
  • 所有 Attributes 都与 Condition 相关。 在当前的情境中,该假设仍不成立,因为根据之前的信息,我们知道只有 Flu 会和所有这四种症状 (Symptom) 相关

因此,当现在这个情境中,选择使用朴素贝叶斯模型并不是一个明智的选择。 所以,我们接下来的讨论还是会继续使用我们在一开始建立的模型。在这个模型之中,我们需要为三种 Diseases 变量和四种 Symptom 变量都创建 CPTs。针对 Diseases (Conditions) 的 CPT 中记录的都是先验概率 (Priori Probability),即一般来说,患者三种病的概率是多少。至于 Symptom 的 CPT,必须在可能的条件的所有可能组合下提供对这种症状的信任,即记录形如 P(chilling|Cold, Flu) 的条件概率。这些概率可能来自于医疗数据或是根据病人的以前的医疗记录进行评估得到。下图就是一个医疗记录的例子,每一行就是一位病人,我们能注意到其中有一些缺失值 (Missing Value),概率图模型对于这些缺失值能进行很好的处理,不管是在训练集还是在测试集中出现的缺失值都能得到比较妥善的处理,我们现在不对此进行详细的介绍。

在这里插入图片描述
如此一来,我们就完成了对模型的建立,在这个模型中,各种症状 (Symptoms) 就是我们所说的证据 (Evidence),也就是我们能够直接观察到的内容,我们根据这些 Evidence (Symptom) 去推断最可能的原因(这里就是病症 Diseases)。即给定 Evidence,计算最有可能的 Condition (Diseases) 的组合。这就是我们用这个模型想要进行的主要任务,为此,我们只需进行 MPE 或者 MAP 查询即可。

Case 2:专家II的诊断模型(Diagnosis Model from Expert II)

现在我们考虑另一个情境,在该情境中,我们根据一些测试来计算怀孕的概率:

在给母牛授精几周后,我们进行了三种可能的测试以确认怀孕。 第一个是扫描测试 (Scanning) ,假阳性为1%,假阴性为10%。 第二种是血液检查 (Blood),可检测出孕酮 (Progesterone) ,假阳性为10%,假阴性为30%。 第三种测试是尿液测试 (Urine) ,该测试还检测到孕激素,其假阳性为10%,假阴性为20%。 孕期可检测到的孕酮水平的概率为90%,未妊娠时为1%。 授精将使一头牛怀孕的可能性为87%


根据这个情境,我们能够得到以下的变量:
查询变量 (Query Variable) 为 Pregnancy (记作 P )。检查是否怀孕,是我们进行这一系列测试的根本原因。
证据变量 (Evidence Variables) 用来表示测试结果:Scanning (记作 S), Blood (记作 B) 和 Urine (记作 U)
一个中间变量 (Intermediary Variable),Progesterone Level (记作 L)


这些变量都为二元变量 (Binary),具体的取值需要根据变量来看

根据以上信息,我们能够建立如下模型:

在这里插入图片描述
在这个模型中,有如下的独立关系:

  • 给定 Progesterone Level, Blood Test 和 Urine Test 相互独立
  • 给定 Pregnancy 的状态时,Scanning Test 会和 Blood Test 与 Urine Test 相互独立
  • 即使 Pregnancy 的状态确知, Blood Test 和 Urine Test 也不会相互独立

在进行具体的查询时,我们可以如此操作:假设我们给一头母牛授精,几个星期后,这三个测试结果都是阴性。即 e : 𝑆 = 𝑓𝑎𝑙𝑠𝑒, 𝐵 = 𝑓𝑎𝑙𝑠𝑒, 𝑈 = 𝑓𝑎𝑙𝑠𝑒。在给定这三个测试的结果下,怀孕的概率为 𝑃(𝑃|𝒆) ≈ 10.21%. 我们可以看到鉴于所有三个测试均得出阴性结果,该比率还是相对较高。

敏感度分析(Sensitive Analysis)

假如农场主对这样的结果并不满意,他认为三个测试如果都是阴性结果的话,怀孕概率不应该高于 5%,因此需要对此进行改进,这就涉及到敏感度分析 (Sensitivity Analysis)。我们需要修正/替换一部分测试,这就需要提供新的假阳性和假阴性检测率。因此,修改哪些网络参数,该如何修改才能使得三个测试都为阴性时,怀孕概率不高于 5% 就是最核心的问题。而这也正是敏感度分析需要解决的问题。这里我们用 Samlam 直接求取结果。

在这里插入图片描述
在这张图里,可以看到,我们把三个测试的结果都设为阴性,此时怀孕的概率正如我们之前的计算为 10.21%,针对这个结果,我们加上限制,希望其低于5%。运行结果给了我们三个建议,但是其中有两个并不满足我们的要求:

  1. 第一个建议是将怀孕 (Pregnancy) 的概率改为 75.6%。但是这属于先验概率,不是我们能够改变的
  2. 第三个建议我们将怀孕 (Pregnancy = yes) 时,可检测到的孕酮水平 (Progesterone Level = detectable) 改为 99%。但这个概率也是无法被人为控制的

所以我们能做的只有改变 Scanning Test 的检测率,使其在母牛怀孕的情况下,检测为阳性的概率提升到 95.37%,也就是将假阴性的概率变为 4.63%。我们可以用过运行的结果看到,Urine Test 和 Blood Test 对此难以有所帮助。

网络粒度(Network Granularity)

在本例子中,很多人或许会有一个疑问,那就是中间变量 (Intermediate Variable) Progesterone Level (L) 能否被去除?因为该变量既不是我们能够观察到的 Evidence,也不是作为查询目标的 Query Variable,我们真的需要它们吗?答案是肯定的,在大多数情况下,我们都不能删除这些变量。

我们可以设想一下,在本例中,将中间变量 Progesterone Level (L) 删除后,会有怎样的后果:

在这里插入图片描述
在这里插入图片描述
很显然的是,这个更简单的模型在结构上已经和原模型产生了差异,但真正决定性的差异,在计算之中。在这个更简单的模型之中,阴性的 Blood Test 和 Urine Test 对于排除怀孕的重要性上升了。或许用式子会更好说明:

在原模型中,P(¬ P| ¬ B, ¬ U) = 45.09%
在这个去掉中间变量的简单模型中,P(¬ P| ¬ B, ¬ U) = 52.96%

这很好理解,因为现在 Blood Test 和 Urine Test 与 Pregnancy 直接相连,因此对它的影响会更为明显。因此,在这个例子中,中间变量是绝对不能删去的,但是,如果能够满足以下情况的话,就可以绕过中间变量而不影响模型的准确率:

对于 Query Variables Q 和 Evidence Variables E 的所有实例化 qe 都有 P(q|e) = P’(q|e)

要满足这个情况,那么该中间变量 X (记住,中间变量意味着它既不是 Evidence Variable,也不是 Query Variable)就只能有一个子结点 Y。

在这里插入图片描述
在删去中间节点 X 之后,变量 Y 所维护的 CPT 也必须得到更新:

在这里插入图片描述
但是,我们也能看到,这样的操作会使得变量 Y 的父节点数量增多,从而导致其会维护一个更大更复杂的 CPT,使得模型效率降低。所以,一般情况下,我们不会选择去删除中间节点,即使它产生的更大的 CPT 不会影响准确率,但我们依然不愿意去花费额外的代价维护一个更大的 CPT。

Case 3:Diagnosis Model from Design

在这个新的情境中,我们给与以下信息:

考虑这个数字电路。 给定电路的一些主要输入和输出值,我们的目标是确定电路是否正常运行。 如果不是,请确定其组件 (每个门) 最可能的健康状态
在这里插入图片描述


该情境中,我们有以下变量:
Evidence Variables:该电路的输入和输出 A, B, E
Query Variables: X, Y, Z
Intermediate Variables: 内部电线 C, D


这些变量的取值为:
对于 A, B, C, D, E,它们的取值为 High/Low
对于 X, Y, Z,它们的取值为 OK/Faulty (对于Faulty,可以更具体一些,比如:永远置为1/永远置为0)


我们要知道,对于较大的电路,在不表示内部状态的情况下对电路建模是不可行的。同时,对于这个电路图,我们还有一点需要格外注意,所有的输出均取决于输入以及每个组件的健康状态。比如,只有当 X 为 OK,A 为 High, C 才会为 Low。组件 (门) X 和输入 A 都会影响输出 C。因此 X 和 A 都是 C 的父节点

因此,我们可以建立一个如下的模型:

在这里插入图片描述
可以看到,这个模型汇总,门 X, Y, Z 都没有父节点,因为门的健康状态不受任何变量影响,属于先验概率。对于这些表示门的变量,它们的 CPT 有两种选择,只分为 OK/Faulty 或者更详细地分类。这也可能使得中间变量 C, D 成为确知变量:

在这里插入图片描述
这很好理解,因为 A = High, X = stuckat0,所以 C 一定会是 Low,因此,P(C = High|A = High, X=stuckat0) = 0。

接下来我们来看如何使用这个模型来检查哪个部分出现问题。首先我们给出一个测试向量 (Evidence Variables), 𝒆: 𝐴 = ℎ𝑖𝑔ℎ, 𝐵 = ℎ𝑖𝑔ℎ, 𝐸 = 𝑙𝑜𝑤. 很显然,这个测试向量能够告诉我们,目前该电路一定有一部分出现了问题,因为如果没有问题的话,应给得到 𝐸 = ℎ𝑖𝑔ℎ。因此,接下来我们要做的就是找出哪个部分出现了问题。为此,我们只需要进行 MAP 查询。

我们在这里再来回顾一下 MAP 查询的概念,如果我们把整个网络转换为一个包含所有变量的 Joint Probability Table,该 Table 将所有可能的 Combination 全部列出来,排除不满足 Evidence 的组合,在剩下的所有组合中,选择概率最高的组合。这就是 MAP 查询的基本思想,因此,我们能够得到以下结果:

在这里插入图片描述
这里我们给出两种建模的答案,可以看到,在给定当前测试向量的情况下,最有可能出问题的就是 Y 和 Z,再具体一些就是很大可能是 Y 永置为 0 或者 Z 永置为 0. 我们不妨把这个结果带入原图检查一下,如果 Y 永置为 0,那么最终结果 E 就为 Low or Low,所以一定为 Low,而 Z 永置为 0 同理。

接下来我们考虑如果测试向量有两个会怎么样,即我们增加一组输入输出 (A’, B’, E’) 。增加测试向量能够进一步缩减可能的错误范围,但这也需要我们建立一个新的模型。比较可能的新模型如下图所示:

在这里插入图片描述
这两个模型的区别在于前者中,我们认为门 (X, Y, Z) 的健康状态会随着时间的变化而改变,可能前一刻还是 OK,下一次就变为 stuckat0. 而后一个模型中,我们不考虑这种变化,认为门的状态不会改变。我们这里用第一个模型来具体看一下:

给定两个测试向量:
𝒆: 𝐴 = ℎ𝑖𝑔ℎ, 𝐵 = ℎ𝑖𝑔ℎ, 𝐸 = 𝑙𝑜𝑤
𝒆’: 𝐴 = 𝑙𝑜𝑤, 𝐵 = 𝑙𝑜𝑤, 𝐸 = 𝑙𝑜𝑤

由于第一个模型中,门的状态是会改变的,因此,我们需要维护额外的 CPT (Additional CPT) 来表示这种转换概率 (Transition Probability),比如:

在这里插入图片描述
此时我们仍进行 MAP 查询,只是在这个例子中,我们考虑的变量更多了,这时候构建联合概率表的话会更大,不仅包含 X,Y,…E,还要包含 X’,Y’,…E’,然后在这个更大的表中进行同样的操作。我们能够得到如下结果:

在这里插入图片描述
我们所用的这个模型也别称为动态贝叶斯网络 (Dynamic Bayesian network, DBN) ,它包含了相同变量的多个拷贝,不同的拷贝表示该变量随着时间的不同状态。

Case 4:Reliability Model from Design

接下来我们来看最后一个情境:

下图描绘了计算机系统的可靠性框图(Reliability Block Diagram, RBD),揭示了保证系统在正常条件下(可用)的状态。 自首次运行以来的1,000天,不同组件的可靠性如下:电源为99%,风扇为90%,处理器为96%,硬盘为98%。 投入运行后1,000天的整体系统可靠性是多少?

在这里插入图片描述
为了更好地理解这个情景,我们需要对 RDB 进行一定的解释:

  • 每个节点代表一个模块 (Block)
  • 模块 (Block) B 表示一个包含元素 B 本身以及喂向 (Feed to) 该元素的子系统的新的子系统。
  • 如果模块 B 是可用的,那么喂向 B 的所有子系统中至少有一个可用

我们用具体的例子来看一下:

比如上图的 Fan 1 模块,它包含 Fan 1 和 Power Supply 组成的子系统,如果Fan 1是Available,那么Power Supply 一定 Available


再比如,这里的 Processor 1 模块,它的子系统包含 Fan 1,Fan 2 和 Power Supply。如果 Processor 1 是 Available,那么Power Supply - Fan 1为 Available 或者 Power Supply - Fan 2 为 Available

在了解了 RBD 的结构之后,我们再来看这个情境中提供了哪些变量,该如何搭建贝叶斯网络:

变量:
表示每个元素的可用性的变量,E, F1, F2, P1, P2, D
表示整个系统的可用性的变量,S
中间变量,一系列表示逻辑的与 (AND) 和或 (OR)

我们能够构筑如下贝叶斯网络:

在这里插入图片描述
在这个网络中,所有的叶节点都是原 RBD 中的元素,Ai 和Oi 表示与门和或门,需要注意的是,这里的 System (S) 也是一个与门。

有了这个网络之后,我们就能够进行需要的查询,比如我们想查询系统的可用性,其实就是查询 P(S=Availability) = ? 即 P(S=Availability) 的边际 (Marginal),这里我们给出一个答案,约为 95.9%. 在此基础上,我们也能够进行之前说过的敏感度分析 (Sensitivity Analysis) 去考虑能够改变哪些部分去提升整体系统的可用性。比如想要提升到 96.5%,可能会有以下结果:

  • 将 Hard Drive 的可用性提高到 98.6%
  • 将 Power Supply 的可用性提高到 99.6%
  • 将任意 Fan 的可用性提高到 96.2%

我们同样也能用该模型来找到那个部分导致系统整体不可用,还是使用 MAP 查询,它会给出最有可能的解答,比如:

在这里插入图片描述
这时我们可以知道,最有可能就是 Hard Drive 出现问题。如果想进一步进行排查,也可以看看仅次于它的查询结果:

在这里插入图片描述

处理大尺寸的 CPTs (Dealing with Large CPTs)

在之前介绍的多个具体情境中,我们不可避免地会遇到一个问题。那就是如果一个变量的父节点过多,那么该变量就需要维护一个相当大的 CPT,该 CPT 的尺寸随着父节点的数量指数级增长。这就会导致建模和计算上的困难。

在这里插入图片描述
我们需要格外注意的是,贝叶斯网络不仅仅需要数据存储,它最重要的性质是用概率去量化了变量之间的关系。如果只是 1024 个变量,对于存储的压力并不大,但是确定 1024 个概率去量化关系是很难的。

Micro Models: Noisy-or

第一个解决方法是用微模型 (Micro Models)。这种模型规定了父母 (Parents) 与共有子节点 (Common Child) 之间的关系,但是它的参数数量小于 2n

最常用的微模型就是 Noisy-or

在这里插入图片描述
在因果解释中,每个因果 Ci 都能自行建立影响 E,这就是为什么在最下方会是一个 OR Gate,而每个变量 Ci 都会有一个抑制变量 (Suppressor Variable) Qi,它被激活时会消除变量 Ci 对最终结果的影响,最后就是 Leak Variable L,它表示其他所有可能的原因。我们可以用一个比较具体的例子来理解,我们可以把 E 看做是流感 (Flu),它有很多的症状,比如发热 (Fever),疼痛 (Pain) 等,这些就是 Ci,在 Noisy-OR 想表达的意思就是,任意一个症状的出现,我们就能判断病人确实患上了流感,但是我们也知道,发热并不一定就是流感导致的,可能95%的发热病人患有流感,但仍有5%是例外,因此就有了这里的抑制变量,它就是这5%,一旦它激活,就会消除发热对诊断的影响,因此我们就无法直接通过发热判断出患有流感,而 Leak Variable 就可以用来表示那些不常见的症状,可能具备这些症状的患者只有 2% 患有流感。

Noisy-OR 模型只需要 n+1 个参数:

  • P(Qi = Active),用以表示 Ci 的抑制变量 Qi 被激活的概率
  • P(L = Active),用以表示 Leak Variable 被激活的概率

假设我们现在有:

𝛼: 𝐶1 = active, 𝐶2 = active, 𝐶3 = passive, 𝐶4 = passive, 𝐶5 = active

我们用 Iα 表示 α 中所有被激活的原因,即 Iα = {1, 2, 5}。那么我们就有:

在这里插入图片描述
我们用具体一些的例子来看:喉咙痛(𝑆)有三种不同的原因导致感冒(𝐶),流感(𝐹)和扁桃体炎(𝑇),对于这三个变量的抑制变量的激活概率为 𝐶: 0.15, 𝐹: 0.01, 𝑇: 0.05,Leak Probability 为 0.02

在这里插入图片描述

其他表示方式

我们也有可能会遇到一种情况,那就是 CPT 中的变量满足一定的局部性质,但不符合微模型结构,因此需要用其它方式表示

在这里插入图片描述
比如在该表中,只要 C1 = 1,P = 0;只要 C2 = 1,P = 0.9。可以看到这些变量具备一定的局部结构,但我们无法用微模型表示

Decision Trees and Graphs

一种常用的手段就是使用决策树

在这里插入图片描述
如果结构足够清晰,它的大小可以与父母数量成线性关系。但如果缺少类似的结构,其尺寸仍可能会是指数级的。

If-then Rules

对于变量 E 的 CPT 也可以用一系列的 If-then 规则进行表述:

在这里插入图片描述
这里的前提条件 αi 是用 E 的父变量组成的命题语句,它必须互斥且穷举,以避免规则冲突并覆盖每个 CPT 参数。该方式和决策树类似,如果缺少类似的结构,其尺寸仍可能会是指数级的。

Deterministic CPTs

一个确知 CPT 只会有 0 和 1。如果一个节点维护的是一个确知 CPT,则表明该变量在功能上被其父节点确定

在这里插入图片描述
确知 CPT 可以用命题逻辑语句 (Propositional Sentences
) 进行表示:

Γ~i~ ⟺ 𝐸 = 𝑒~i~
  • 我们对于变量 E 的每个取值 ei 都有一条规则
  • 前提条件 Γi 同样必须互斥且穷极

在这里插入图片描述

用python写的一段贝叶斯网络的程序 This file describes a Bayes Net Toolkit that we will refer to now as BNT. This version is 0.1. Let's consider this code an "alpha" version that contains some useful functionality, but is not complete, and is not a ready-to-use "application". The purpose of the toolkit is to facilitate creating experimental Bayes nets that analyze sequences of events. The toolkit provides code to help with the following: (a) creating Bayes nets. There are three classes of nodes defined, and to construct a Bayes net, you can write code that calls the constructors of these classes, and then you can create links among them. (b) displaying Bayes nets. There is code to create new windows and to draw Bayes nets in them. This includes drawing the nodes, the arcs, the labels, and various properties of nodes. (c) propagating a-posteriori probabilities. When one node's probability changes, the posterior probabilities of nodes downstream from it may need to change, too, depending on firing thresholds, etc. There is code in the toolkit to support that. (d) simulating events ("playing" event sequences) and having the Bayes net respond to them. This functionality is split over several files. Here are the files and the functionality that they represent. BayesNetNode.py: class definition for the basic node in a Bayes net. BayesUpdating.py: computing the a-posteriori probability of a node given the probabilities of its parents. InputNode.py: class definition for "input nodes". InputNode is a subclass of BayesNetNode. Input nodes have special features that allow them to recognize evidence items (using regular-expression pattern matching of the string descriptions of events). OutputNode.py: class definition for "output nodes". OutputBode is a subclass of BayesNetNode. An output node can have a list of actions to be performed when the node's posterior probability exceeds a threshold ReadWriteSigmaFiles.py: Functionality for loading and saving Bayes nets in an XML format. SampleNets.py: Some code that constructs a sample Bayes net. This is called when SIGMAEditor.py is started up. SIGMAEditor.py: A main program that can be turned into an experimental application by adding menus, more code, etc. It has some facilities already for loading event sequence files and playing them. sample-event-file.txt: A sequence of events that exemplifies the format for these events. gma-mona.igm: A sample Bayes net in the form of an XML file. The SIGMAEditor program can read this type of file. Here are some limitations of the toolkit as of 23 February 2009: 1. Users cannot yet edit Bayes nets directly in the SIGMAEditor. Code has to be written to create new Bayes nets, at this time. 2. If you select the File menu's option to load a new Bayes net file, you get a fixed example: gma-mona.igm. This should be changed in the future to bring up a file dialog box so that the user can select the file. 3. When you "run" an event sequence in the SIGMAEditor, the program will present each event to each input node and find out if the input node's filter matches the evidence. If it does match, that fact is printed to standard output, but nothing else is done. What should then happen is that the node's probability is updated according to its response method, and if the new probability exceeds the node's threshold, then its successor ("children") get their probabilities updated, too. 4. No animation of the Bayes net is performed when an event sequence is run. Ideally, the diagram would be updated dynamically to show the activity, especially when posterior probabilities of nodes change and thresholds are exceeded. To use the BNT, do three kinds of development: A. create your own Bayes net whose input nodes correspond to pieces of evidence that might be presented and that might be relevant to drawing inferences about what's going on in the situation or process that you are analyzing. You do this by writing Python code that calls constructors etc. See the example in SampleNets.py. B. create a sample event stream that represents a plausible sequence of events that your system should be able to analyze. Put this in a file in the same format as used in sample-event-sequence.txt. C. modify the code of BNT or add new modules as necessary to obtain the functionality you want in your system. This could include code to perform actions whenever an output node's threshold is exceeded. It could include code to generate events (rather than read them from a file). And it could include code to describe more clearly what is going on whenever a node's probability is updated (e.g., what the significance of the update is -- more certainty about something, an indication that the weight of evidence is becoming strong, etc.)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值