用一句话归纳贝叶斯方法创始人Thomas Bayes的观点就是:任什么时候候,我对世界总有一个主观的先验判断,可是这个判断会随着世界的真实变化而随机修正,我对世界永远保持开放的态度。html
1763年,民间科学家Thomas Bayes发表了一篇名为《An essay towards solving a problem in the doctrine of chances》的论文,node
这篇论文发表后,在当时并未产生多少影响,可是在20世纪后,这篇论文逐渐被人们所重视。人们逐渐发现,贝叶斯方法既符合人们平常生活的思考方式,也符合人们认识天然的规律,通过不断的发展,最终占据统计学领域的半壁江山,与经典统计学平起平坐。python
让咱们暂时回到Thomas Bayes所处的学术时代18世纪,来一块儿体会下贝叶斯的思想。git
当时数理统计的主流思想是“频率学派”。所谓频率学派,举个例子来讲:“有一个袋子,里面装着若干个白球和黑球(例如3黑2白),请问从袋子中取得白球的几率θ是多少?github
频率派把须要推断的参数θ看作是固定的未知常数,即几率虽然是未知的,但最起码是肯定的一个值。同时,样本X是随机的,因此频率派重点研究样本空间,大部分的几率计算都是针对样本X的分布。算法
这种观点看起来确实没有什么问题,也很合理。可是咱们仔细深度思考一下就会发现一个重大问题。网络
频率学派之因此可以获得这种肯定性,是由于研究的对象是“简单可数事件”,例如装有固定数量球的袋子、只有正反两面的硬币、只有6面的标准筛子。可是当研究的问题变得复杂以后,频率理论就没法处理了。数据结构
例如一个朋友创业,你如今须要估计他创业成功的概率有多大?dom
这个时候你就没法逐一枚举出致使他成功或者失败的因此子缘由了(作法有方法?思路清晰?有毅力?能团结周围的人?和其余竞争对手相比,好多少?....),这是一个连续且不可数的事件空间。机器学习
“贝叶斯学派”的观点和频率学派则截然相反,贝叶斯学派认为参数是随机变量,是未知的。而样本X是固定的,因为样本是固定的,因此他们重点研究的是参数
的分布。
用贝叶斯学派的理论来回答上面创业者评估问题,假如你对这个创业者为人比较了解,你会情不自禁的估计他创业成功的概率可能在80%以上,这是一个先验的几率估计。随着公司的运营,你发现公司被运营的很是差,业绩也不行,随即,你对这个创业者的成功估计由80%下调到40%,这是一个后验几率估计。贝叶斯学派的这种动态的几率估计思惟,就是贝叶斯方法。
为了可以动态地对真实世界进行几率估计,贝叶斯及贝叶斯派提出了一个思考问题的固定模式:
先验分布 + 样本信息(观测结果)
后验分布
上述思考模式意味着,新观察到的样本信息将修正人们之前对事物的认知。换言之,在获得新的样本信息以前,人们对的认知是先验分布
,在获得新的样本信息
后,人们对
的认知为
后验估计
。
笔者思考:
写到这里的时候,笔者联想到牛顿宏观第必定律和爱因斯坦的相对论之间的关系,在宏观世界,牛顿第必定律是有效的,可是进入高速微观世界,就只能用更抽象的相对论来归纳了。牛顿第必定律只是相对论在宏观低速世界的一个特例。
一样,对简单问题来讲,由于事件空间有限可数,因此频率理论是成立的,可是对于真实世界的复杂问题,事件空间是连续不可数的,就须要用到贝叶斯理论来归纳描述了。
Relevant Link:
《几率图模型:原理与技术》DaphneKoller https://github.com/memect/hao/blob/master/awesome/bayesian-network-python.md
在本章中,咱们回顾一些重要的背景材料,这些材料源自几率论、信息论和图论中的一些关键知识,它们都是贝叶斯网的重要概念组成部分。
条件几率(又称后验几率)就是事件A在另一个事件B已经发生条件下的发生几率。条件几率表示为P(A|B),读做“在B条件下A的几率”,
基于条件几率公式,咱们能够继续推导出贝叶斯公式。关于这个话题,笔者在另外一个文章中进行了详细的总结,这里再也不赘述,为了保持文章自包含性,这里摘取部分笔者认为关键的部分。
全几率公式
贝叶斯公式
将其和全几率公式进行对比。会发现如下几点:
笔者认为,贝叶斯公式能够这么理解:贝叶斯公式表达了一个思想,根据某个出现的结果B能够反推全部可能致使该结果的子缘由Ai,而具体根据结果B逆推出每一个子缘由的条件几率比重,则取决于这个子缘由和结果B的联合几率 ,这是从结果推缘由的逆几率计算问题。
根据条件几率的定义,咱们有:
更通常地,若是a1,....,ak是事件,那么有以下链式分解式,
这个等式称为条件几率的链式法则(chain rule)。 换句话说,咱们能够将几个事件组合的几率表示为关于事件之间的递归式依赖关系的乘积。值得注意的是,咱们能够用事件的任意顺序来扩展这个表达式而保持结果不变。
链式法则是一个很是有用的定理,它是贝叶斯网中的核心概念,由于贝叶斯网面对和描述的都是复琐事件。一个复琐事件每每是由大量子事件组成的,不一样的子事件间既存在独立关系,也存在关联依赖关系。链式法则提供了一个理解复琐事件的世界观,即复琐事件是能够分解的。
关于独立性,有一个很形象直观的例子。假设一个思想实验:若是一个社会中存在一种普遍的思潮,即重男轻女思潮,90%的家庭都认为生男孩比生女孩好,只要生的不是男孩就是继续生,直到生了一个女孩为止。 以上为背景,通过10年后,请问社会中男女比率会失衡吗?
这个问题答案可能有些反直觉,答案是:无论通过多少年,社会中男女比例都保持50%的平衡比例。出现这个现象的缘由是,每一胎生男生女都是等几率的,不以父母的意志为转移。
下面咱们定义随机变量的独立性概念,
假如或者
,则称事件α和事件β,则称事件α和事件β在P中独立,记为
。
咱们须要明白的是,在大多数实际的应用中,随机变量并非边缘独立的,尽管如此,这种方法的通常形式将是咱们求解的基础。
关于条件独立性,笔者经过一个具体的例子来直观说明。咱们假定学生的GPA成绩为随机变量G,被Stanford录入为随机变量S,被MIT录取为随机变量M。很显然,咱们会获得下列几个分布判断:
下面咱们形式化地定义事件之间条件独立性的概念,
假如,或者
,则称事件α在给定事件Υ时,在分布P中条件独立于事件β,记做
。
进一步地有,P知足当且仅当
。
如今咱们将概念引伸到随机变量的范畴内,关注随机变量间的条件独立性。
令X,Y,Z表示随机变量,若是P知足,则称集合X与Y在分布P中条件独立,集合Z中的变量称为观测(observed)变量。观测(observation)这个词很能引发咱们的思考,咱们看到,在不一样的观测下,随机变量的条件独立性发生了改变,这正是体现了贝叶斯思想的精髓。
特别的,若是集合Z是空集,能够把记做
,而且称X与Y是边缘独立的(marginally independent)。
咱们基于贝叶斯网进行的一个常见应用是,利用多维随机变量的联合几率分布来完成推理查询。
几率查询是最多见的查询,查询由两部分组成,
几率查询的任务是计算下式:
即,Y的值y上的后验几率分布取决于E=e,这个表达式也能够看做是以e为条件做用得到的分布中Y上的边缘。
第二类重要任务是对变量的一些子集找到一个高几率的联合赋值。这类任务的最简单变形是MAP查询(最可能解释MPE),其目的是找到对全部(非证据)变量最可能的赋值。
若是令,那么在给定证据
的条件下,咱们的任务是为W中的变量找到最可能的赋值:
其中的表示使得
最大的值。
把图做为一种数据结构来表示几率分布在贝叶斯网的一个重要概念,咱们这节讨论一些图的基本概念。
图是一个包含节点(node)集与边(edge)的数据结构。
假定节点集为,节点对 Xi 与 Xj 由一条有向边(directed edge)Xi -> Xj 或者一条无向边(undirected edge)Xi - Xj 链接。所以,边集
是成对节点的集合,图经过二元关系来存全部边的链接关系。
所以,图按照边集的类型,能够分为:
咱们用来表示 Xi 与 Xj 经由某种边链接的情形,这条边或者是有向的,或者是无向的。
下图是部分有向图的一个例子,
其中,
不少时候,咱们但愿只考虑与节点的特定子集相关的部分图。
令,且令
,导出子图(induced subgraph)
定义为图
,其中,
表示使得
的全部边
。例以下图表示的是导出子图
,
若是X中的任意两个节点均由一条边链接,那么X上的子图是彻底子图(complete subgraph)。集合X一般称为团(clique)。对于节点的任意超集,若是Y不是团,那么X称为最大团(maximal clique)。
尽管理论上说,节点子集X能够是任意的,但咱们通常只对可以保持图结构的特定性质的节点集感兴趣。
利用边的基本符号,能够在图中对不一样类型的长范围链接进行定义。
对每个 i=1,...,k-1,若是 Xi -> Xi+1,或者 Xi - Xi+1,那么 X1,....,Xi 在图中造成了一条路径(path)。若是一条路径中至少存在一个 i,使得 Xi -> Xi+1,则称该路径是有向的。
对于每一个 i=1,...,k-1,若是,那么 X1,....,Xi 在图
中造成一条迹(trail)。
迹是比路径更弱的约束条件,迹一定是路径,但路径不必定成为迹。
例以下图中,
对于图中的任意节点 Xi,Xj,若是 Xi 和 Xj 之间存在一条迹,那么该图是连通图。
图中的一个圈是一条有向路径 X1,....,Xk,其中 X1 = Xk。若是一个图不包含圈,那么这个图是无圈图(acyclic graph)。须要注意的是,在存在有向圈的图上定义一个一致的几率模型十分困难,所以机器学习中大部分的图算法都是假设图是无圈的。
有向无圈图(directed acyclic graph,DAG)是构成贝叶斯网的基本图表示。
下图是一个无圈图,
可是只要为图中添加一条无向边 A-E,就能够得到一条从A到自身的路径A,C,D,E,A。
注意,圈是针对路径的概念而言的,无圈并不表明从节点到自身不会有迹,例如上图中,包含了 C,D,E,I,C 和 C,D,G,F,C 这两条迹。
一个包含有向边和无向边的无圈图称为部分有向无圈图,PDAG上无圈的要求意味着图能够被分解为一些链分支(chain component)的有向图,其中,每条链分支内的节点相互之间仅经过无向边连接。
PDAG的无圈性保证咱们能够对分支进行排序,进而使得全部的边由数值低的分支指向数值高的分支。
令是
上的PDAG,K1,....,Ki 是
的知足以下条件的不相交划分:
知足以上条件时,每个分支 Ki 称为一个链分支。同时因为其链结构,PDAG也称为链图(chain graph)。
仍是对上面的图例子,咱们来看一下链分支分解结果,
上图中共有六个链分支:
特别的,当PDAG是一个无向图时,整个图造成了一个单链分支。相反地,若是PDAG是一个有向图(无圈的),那么图中的每个节点就是其自己的一个链分支。
笔者提醒:
链图这个概念很是重要,它和随机变量独立性原理一块儿,构成了贝叶斯网因子分解和局部独立性原理,也是贝叶斯网可以从原始的链式分解公式获得紧凑结构的理论基础。
环是一个比圈更弱约束的结构,中的一个环是一条迹 X1,....,Xk,其中 X1 = Xk。若是一个图不包含任何环,那么这个图是单连通(singly connected)。若是一个节点在单连通图中只有一个相邻的节点,那么该节点是一个叶(leaf)节点。
若是有向图的每一个节点至多只有一个父节点,那么这个有向图是森林。
若是有向图的每一个节点至多只有一个父节点,且这个有向森林是连通的,那么它是一棵树。
一个单连通的有向图也称为一棵多重树(polytree)。注意,多重树与树很是不一样,例以下图是多重树但不是树,由于有一些节点有不止一个父节点。
多重树例子
弦的定义在基于图结构的推理代价估计中扮演者很是重要的角色。
令 X1 - X2 - .... - Xk - X1 是图中的一个环。环中的一条弦(chord)是链接两个不连贯节点 Xi 与 Xj 的一条边。对 k>=4,若是任意环 X1 - X2 - .... - Xk - X1 有一条弦,那么无向图称为弦图(chordal graph)。
值得注意的是,在一个通弦的图中,最长的”最小环(一个没有捷径的环)“是一个三角形。所以,弦图一般也称为三角剖分图(triangulated graph)。
进一步的,若是图的基础无向图是通弦的,则称图
是通弦的。
Relevant Link:
《几率图模型:原理与技术》DaphneKoller
在开始介绍贝叶斯网概念以前,咱们先来一个讨论一下学者们提出贝叶斯网的学术动机,笔者将其总结为下面几句话:
所谓不肯定性推理,是指基于几率论对真实世界进行抽象建模以及数值分析,使用几率分布而不是精确数值的方式进行有效预测。常规的不肯定性推理过程以下,
根据全几率公式和链式法则咱们知道,每一个随机事件均可以分解为大量的子事件缘由的累乘,且子事件缘由之间还存在大量的递归依赖,
这样,假设咱们的目标是在某个随机变量的集合上表示联合分布P,即便在变量为二值(binary-valued)这样最简单的状况下,n个变量的联合分布也须要
个不一样赋值的几率。当n较大时,这种联合分布的显示表示和样本学习都会变得很是难处理。
可是实际上,正如咱们前面介绍举例的,对于一个好学生来讲,考上Stanford和考上MIT这两件事之间是独立的,条件几率和边缘几率是相同的。所以,贝叶斯网络基于随机变量间独立性原理,对去全几率公式进行了有效的化简,获得了一个更紧凑的高维分布。这对咱们建模复杂性事件提供了条件,例以下图,
学生示例的贝叶斯网图
能够以两种不一样的方式来看待这个图:
在严格意义上,这两种观点是等价的。
注意到,贝叶斯网用边表示直接依赖关系,若是在真实世界中A只依赖于B,则只应该存在一条从B通向A的有向边。节点只直接依赖其父节点,是贝叶斯网语义的核心。
为了说明这个概念,咱们继续引用学生示例,
这个问题包含五个随机变量:
咱们知道,贝叶斯网能够用有向图来表示,其节点表示随机变量,而边则表示一个变量对另外一个变量的直接影响(现实世界运行方法的直观假设)。咱们能够将这个图当作是对一个由天然执行的生成式采样过程进行编码,其中,每一个变量的值指取决于其父节点的分布天然选择。换句话说,每一个变量是其父节点的一个随机函数(局部条件几率性质)。
换句话来讲,局部条件几率性质来源于问题域自己的:
咱们将贝叶斯网中包含的这种局部的条件几率结构称之为局部几率模型(local probability model),用于表示每一个变量对其父节点依赖的本质。
对于这个问题,条件几率分布的一个可能选择以下图所示,这个网络结构与条件几率分布一块儿组成了贝叶斯网,
带有条件几率分布的学生示例的贝叶斯网
具体的,考虑空间中的一些特定状态,好比,直观上,这个事件的几率能够经过计算构成它的基本事件的条件几率乘积得到,即:
通常地,对于联合几率空间中的任何状态,能够采用相同的过程,即:
上述本质上是一个几率查询(推理)过程。
所谓的“推理”,顾名思义是一个根据当前得到的证据动态变化条件几率的过程。如今考虑贝叶斯网,而且观察当证据得到时各类事情的几率如何动态地发生变化。
以某个学生George为例,用得到的模型对George进行推理。咱们可能想要询问George有多大可能从教授Econ101的教授那里得到一封好的推荐信(l1)。如今咱们开始动态贝叶斯推理:
如今咱们进一步得知Econ101是一门简单的课程(d0),此时,George从教授那里得到一封好的推荐信的几率是。
注意到上面两步的动态推理,都是基于咱们不知道George的成绩Grade前提下,即head-to-head的关键节点未知,若是Grade已知,智商和课程难度就会独立,互不影响。
这类能够预测各类因素(如George的智商)“顺流而下”影响的几率查询,咱们称之为因果推理(causal reasoning)或者预测(prediction)。
如今考虑Acme咨询公司的一个招聘官,他试图贝叶斯网决定是否雇佣George,咱们开始动态贝叶斯推理:
如今,假定招聘官不当心丢失了George的成绩单,关于George的信息只剩下来自其Econ101课程教授的推荐信,不过这封信不是一个好的推荐信,此时,George有高智商的几率依然会下降,但只降至14%,即。咱们看到,节点距离越近,信息传递的影响就越大,这也符合马尔科夫过程的熵传递原理。
同时咱们注意到,若是招聘官既有成绩单又有推荐信,George有高智商的几率与招聘官只有成绩单时的几率是同样的,。缘由是在head-to-tail结构下,若是关键节点已知,则head与tail之间是条件独立的。
这类从结果推理缘由的“逆流而上”的几率查询,咱们称之为证据推理(evidential reasoning)或解释(explanation)。
咱们知道,课程难度D,课程成绩G,智商I,它们之间是head-to-head的拓朴结构。
若是George在Econ101中获得的成绩是B,那么。另外一方面,若是Econ101比较难,那么
。
实际上咱们已经经过课程的难度解释消除(explaining away)了成绩低这一事件带来的影响。解释消除是称为因果间推理(intercausal reasoning)的通常推理模式的一个示例。其中相同结果的不一样缘由之间能够相互影响。 在这里,由于Grade已知,因此D和I之间的信息影响流是通的,影响力能够沿着迹传递。
这类推理在人类平常的推理中是很是广泛的,例如,当发烧、咽喉痛,而且担忧可能有单核细胞增多症时,若是告知只是得了流感,那么得单核细胞增多症的几率就会被消解降低。由于,患有流感为出现的针状提供了另外一种解释,从而很大程度上下降了患有单核细胞增多症的几率。
笔者思考:
对上述这个理论能够有一个更加形象的理解方式,即河流类比,咱们将新的证据带来的信息熵比做河流里的水,学生在某门课程上取得了很差的成绩就是一个有效信息熵,这个信息顺着G-I之间流动,使得高智商的后验几率降低。如今加入一个新的信息源是Econ101课程比较难,这个新的信息源就至关于一个新的水源,沿着D-G-I这个河道传播,和原来的G-I一块儿,共同综合决定了I的后验几率。
一样的,若是G是未知的,那就至关于这个河流中间是断开的,不管D如何都没法影响到I,I的后验几率只取决于G。
另一方面,贝叶斯网必须是有向无圈图。其中节点表明随机变量,节点间的边表明变量之间的直接依赖关系。
本质上由于贝叶斯网是对真实世界复杂性事件的抽象建模,因此不容许出现圈(即循环递归依赖)。简单来讲就是不容许出现下列这种场景,
若是出现循环依赖,因果分解链式公式就会无限膨胀,也就没法用计算机处理。
贝叶斯网络的有向无环图中的节点表示随机变量,它们能够是可观察到的变量,或隐变量、未知参数等。
有因果关系(或非条件独立)的变量或命题,用箭头来链接。若两个节点间以一个单箭头链接在一块儿,表示其中一个节点是“因(parents)”,另外一个是“果(children)”,两节点就会产生一个条件几率值。
例如,假设节点E直接影响到节点H,即E->H,则用从E指向H的箭头创建结点E到结点H的有向弧(E,H),权值(即链接强度)用条件几率P(H|E)来表示,以下图所示:
通常地,贝叶斯网结构是其节点表明随机变量X1,....,Xn的一个有向无圈图(DAG)。令
表示Xi在
中的父节点,
表示Xi在图中的非后代节点变量。所以
表示了以下称为局部独立性(local independencies)的条件独立性假设,而且记为
。
对每一个变量Xi,都有:
换句话说,局部独立性代表,在给定父节点条件下,每一个节点Xi与其非后代节点条件独立。贝叶斯网图的形式化语义是一系列独立性断言。
以下图所示,即是一个简单的贝叶斯网络:
由于a致使b,a和b致使c,因此有下面累乘公式,
3节点对应的三角结构是贝叶斯网信息流动的最基本结构,这节咱们来介绍几种经典的信息流动结构。
根据上图咱们有:P(a,b,c) = P(a) * P(b) * P(c|a,b)成立,化简后可得:
这种结构表明的意思是:
咱们能够形象地理解为,将abc想象成河流,两条小河(a、b)流入一条大河(c),当c是未知时,a->c<-b之间的流动是阻断的,那么影响将没法沿着“a->c<-b”流动。形如“a->c<-b”的这种结构也称为一个v-结构(v-structure)。
这种结构表明的意思是:
咱们能够形象地理解为,一条大河到某处分叉成两条支流,在c给定的条件下,a,b是两条独立的支流,彼此是独立的。
这种结构表明的意思是:
这种结构表明的意思是:
咱们知道,贝叶斯网的形式化语义是一系列独立性断言,另外一方面,贝叶斯网也是由一系列条件几率分布所组成的图,这个图经过链式法则为贝叶斯网定义了一个联合分布。
在本节中,咱们将讨论它们两者的等价性。分布P知足于图相关的局部独立性,当且仅当P能够由与图
相关的一系列条件几率分布表示。
咱们从形式化基本概念开始。
首先咱们定义与分布P相关的独立性的集合。
令P是上的分布,
定义为在P中成立的形如
的独立性断言的集合。
如今能够将陈述“P知足与相关的局部独立性”简写为
。在这种状况下,能够称
是P的一个I-map(独立图)。
更通常的定义以下:
令是与独立性集合
相关联的任意一个图对象,若是对独立性集合
,
,则称
是一个I-map。
一个贝叶斯网蕴含了一系列条件独立性假设,这是咱们可以用紧凑因子分解表示贝叶斯网的关键。一个特殊的例子就是朴素贝叶斯分解公式。
考虑学生贝叶斯网的例子,
先考虑任意分布P,咱们将对联合分布进行分解而且将其分解成一些局部几率模型:
这种转换不依赖任何假设,它对任何联合分布P都适用。然而,由于等式右边的因子分解中的条件几率没有充分利用咱们已知的独立依赖性信息,所以很是不紧凑。
如今,咱们应用由贝叶斯网导出的条件独立性假设,假定关于分布P是一个I-map,咱们获得下式:
综上,联合分布可化简为:
从上式能够看出,联合分布中的任何表值均可以经过每一个变量所对应的因子的乘积来计算。每一个因子表示表示一个变量在网络中给定父节点时的条件几率。在是I-map的条件下,这种因子分解能够应用于任何分布P。
用形式化的语言来表达就是:
令未定义在变量X1,...,Xn上的一个贝叶斯网,假如P能够表示为以下乘积:
则称分布P是关于图的在同一空间上的因子分解。这个等式称为贝叶斯网的链式法则。单个因子
称为条件几率分布(CPD)或局部几率模型。
贝叶斯网结构所蕴含的条件独立性假设容许咱们将
是一个I-map的分布P分解成一系列较小的条件几率分布。
上一节咱们讨论了联合分布的因子分解和局部独立性的统计概念。这个小节咱们将其推广到整个贝叶斯网中,首先咱们定义有效迹的概念。
考虑迹比较长的通常状况。直观上,对于从X1流动到Xn的影响,它须要流经这条迹上的单个节点。换句话说,若是每条双边迹
都容许影响流过,那么X1能够影响到Xn。
对这一直观认识形式化定义以下:
令是一个贝叶斯网结构,且
是
中的一条迹。令Z是观测变量的一个子集,在给定Z的条件下,若是知足下列条件:
那么称迹是有效迹。
通常的,若是节点之间存在任何容许影响流过的迹,那么一个节点能够影响另外一个节点。基于这个直观认识,能够定义d-分离的概念,这个概念为咱们提供了在有向图的节点之间实现分离的能力。
形式化定义以下:
令X,Y,Z是图的三个节点集,在给定Z的的条件下,加入任意节点
与
之间不存在有效迹,那么X与Y在给定Z时是d-分离的,记做
。与d-分离相对应的独立性的集合用
表示:
这个集合也称为全局马尔科夫独立性(global Markov independencies)集。中的独立性刚好是那些能够保证在
的每一个分布中都成立的独立性。
从上一章的条件几率链式公式化简过程咱们能够看到,对于同一个独立性集合,与其相符的结构有不少。一个好的方法是选择可以反映真实世界的因果序列和依赖关系的结构,目的是使缘由成为结果的父节点。
例如,在对汽车保险相关的贝叶斯网构建中,之前的事故(A)每每是好司机(G)的父节点,即“A->G”,这与保险公司对汽车保险这一问题的认知一致。同时,因为司机很差(B)才形成了之前(以及未来的)事故,即“B->A”。
通常来讲,建模时咱们可能会选择不少比较弱的影响,但若是将它们所有考虑进去,网络会变得很是复杂。这样的网络从表示的角度看是有问题的,它们难于理解、难于修正和学习。此外,因为贝叶斯网中的推理很是强地依赖于它们的链接功能,所以,增长这样的边无疑会使网络训练和预测的代价变得很高。
贝叶斯网的学习过程分为两部分:
从数据中学习贝叶斯网络
所谓推理,就是要根据咱们已知的信息作出预测。咱们可使用推理来解答一些问题:
寻找一个特定变量的几率分布。好比,给定一个带有变量 A、B、C 和 D 的图,其中 A 取值 一、2 和 3,求 p(A=1)、p(A=2) 和 p(A=3)。
给定某些显变量 v_E(E 表示证据(evidence)),其取值为 e,求某些隐藏变量 v_H 的后验分布 p(v_H|v_E=e)。
给定某些显变量 v_E,其取值为 e,求使其它变量 v_H 有最高几率的配置。
Relevant Link:
《几率图模型:原理与技术》DaphneKoller http://staff.ustc.edu.cn/~jianmin/lecture/ai/bnet_slides.pdf https://zhuanlan.zhihu.com/p/30139208 https://www.zhihu.com/question/28006799 https://blog.csdn.net/v_JULY_v/article/details/40984699 http://staff.ustc.edu.cn/~jianmin/lecture/ai/bnet_slides.pdf
关于马尔柯夫链,笔者在另外一篇文章有详细的讨论。简单来讲,马尔柯夫链是一种基于“马尔科夫假设(marko assumption)”的动态贝叶斯网。
从网络结构的角度来讲,马尔柯夫链是一个head-to-tail链式网络,以下图所示:
咱们已经知道,在xi给定的条件下,xi+1的分布和x1,x2…xi-1条件独立。这意味着:xi+1的分布状态只和xi有关,和其余变量条件独立。
通俗地说,当前状态只跟上一状态有关,跟上上或上上以前的状态无关。这种顺次演变的随机过程,就叫作马尔科夫链(Markov chain)。且有:
能够看到,马尔柯夫链是一个特殊的贝叶斯网结构。
Relevant Link:
https://www.cnblogs.com/LittleHann/p/7609060.html#_lab2_2_1
这章咱们来描述一个最简单的例子,在这里例子中,条件参数化与条件独立性假设被结合在一块儿,目的是对高维几率分布产生很是紧凑的表示。
仍是前面公司雇佣大学毕业生的例子,如今假定公司除了智商I和SAT成绩S以外,同时还知道学生某些课程的成绩G,在这种状况下,几率空间是定义在三个相关随机变量 I、S、G 上的联合分布。假定 I 与 S 如前所述,而且G可能取三个值g1,g2,g3,分别表明成绩A,B和C,那么联合分布有12个表值。
可是在这个例子中,咱们发现了潜在的冗余结构,分布P知足条件独立性执行,即若是咱们知道一个学生是高智商的,那么他在SAT考试中得到的高分并不能为咱们带来任何有关他课程成绩的信息,形式化的表达为:
更通常的状况下,能够表达为:
注意到,这种独立性声明只有当假定学生的智商是其课程与SAT得分的惟一缘由时才成立(tail-to-tail结构)。
基于条件独立性假设,咱们能够获得一种更加紧凑的因果推理表达方式,
这样,联合分布P(I,S,G)能够分解为三个条件几率分布(CPD)的乘积。
做为一个总体,这3个条件几率分布详细说明了联合分布在条件独立性假设下的因果表示,例如:
咱们注意到,除了更紧凑的表达方式以外,基于条件独立性的因果表达方法的另外一个好处是,模块性。当增长一个新的变量G时,联合分布在总体上会发生变化。而在因子表示中,咱们能够重复使用变量I和S的局部几率模型,而且只需增长对新变量的条件几率P(G|I)便可。这个性质对于模拟真实系统很是有价值。
上个小节讨论的例子被称之为朴素贝叶斯模型。
朴素贝叶斯模型假设全部的实例属于若干两两互斥且包含全部事例状况的类(class)中的一个。所以,存在一个在某个集合{c1,...,ck}中取值的类变量C。在这个例子中,类变量是学生的智商I,而且存在且只存在事例的两个类(高智商和低智商)的学生。
模型还包括必定数量的、能够观测到其值的特征(feature)X1,....,Xk。朴素贝叶斯假设(naive Bayes assumption)是在给定事例的类的条件下,这些特征条件独立。换言之,在事例的每一个类内,不一样的性质能够独立地肯定,形式化的表达为。
从网络结构上来讲,朴素贝叶斯是一种典型的tail-to-tail的贝叶斯网结构,整个贝叶斯网都是由这种结构组成,
朴素贝叶斯模型的贝叶斯网
基于这些独立性假设,朴素贝叶斯模型的因子分解(factorization)能够表示以下,
尽管具备很强的假设,因为简单而且只须要少许参数,朴素贝叶斯模型常常在实践中做为“分类器”得以应用,例如基于朴素贝叶斯模型的垃圾邮件分类器。
这个模型最先被应用于医疗诊断,其中,类变量的不一样值用于表示患者可能患的不一样疾病。证据变量用于表示不一样症状、化验结果等。在简单的疾病诊断上,朴素贝叶斯模型确实发挥了很好的做用,甚至比人类专家的诊断结果都要好。可是在更深度的应用中,医生发现,对于更复杂(由多种致病缘由和症状共同表现)的疾病,模型表现的并很差。
数据科学家通过分析认为,出现这种现象的缘由在于:模型作了集中一般并不真实的强假设,例如:
一个患者至多可能患一种疾病
在已知患者的疾病条件下,不一样症状的出现与否,不一样化验结果,之间是互相独立的
这种模型可用于医学诊断是由于少许可解释的参数易于由专家得到,早期的机器辅助医疗诊断系统正式创建在这一技术之上。
可是,以后更加深刻的实践代表,构建这种模型的强假设下降了模型诊断的准确性,尤为是“过分计算”某些特定的证据,该模型很容易太高估计某些方面特征的影响。
例如,“高血压”和“肥胖症”是心脏病的两个硬指标,可是,这两个症状之间相关度很高,高血压通常就伴随着肥胖症。在使用朴素贝叶斯公式计算的时候,因为乘法项的缘故,关于这方面的证据因子就会被重复计算,以下式:
P(心脏病 | 高血压,肥胖症) = P(高血压 | 心脏病) * P(高血压 | 肥胖症) / P(高血压,肥胖症)
因为“高血压”和“肥胖症”之间存在较强相关性的缘故,咱们能够很容易想象,分子乘积增长的比率是大于分母联合分布增长的比率的。所以,当分子项继续增长的时候,最终的后验几率就会不断增大。可是由于新增的特征项并无提供新的信息,后验几率的这种增大变化反而下降了模型的预测性能。
实际上,在实践中人们发现,朴素贝叶斯模型的诊断性能会随着特征的增长而下降,这种下降经常归因于违背了强条件独立性假设。
Relevant Link:
https://www.cnblogs.com/LittleHann/p/7199242.html#_label6
本章来自云栖社区一篇很棒的文章。
主持人会向挑战者展现三扇关着的门,其中一扇门以后有一辆车,其它门后则有一些无价值的东西。挑战者并不知道哪扇门背后是车。
如今挑战者能够先选择一扇门。而后,主持人会打开剩下的两扇门中没有车的一扇。如今,挑战者能够选择是否更换选择的门,可是问题来了,咱们应该更换吗?
直觉上看,主持人彷佛并无透露任何信息。事实证实这种直觉并不彻底正确。让咱们使用咱们的新工具"贝叶斯网"来分析这个问题。
咱们首先先定义一些随机变量:
咱们创建初始状态贝叶斯网结构(即挑战者作出的选择,可是主持人还未打开一扇门):
注意到:
如今,主持人选择了门 H 并打开了它。因此如今 H 已被观察到。
如今贝叶斯网的条件几率状况发生了变化:
也就是说,当支持人打开了剩下的两扇门中没有车的一扇后,挑战者理性的作法是改变本身最初的决策。
下面用CPD表格来形式化地分析这个游戏过程:
如今,让咱们假设咱们已经选择了一扇门。也就是说如今已经观察到 F,假设 F=1。那么给定 F 时,I 和 D 的条件几率是多少?
基于上面CPD表格计算边缘几率得:
到目前为止,咱们选对了门的几率都是三分之一,汽车仍然有可能在任何一扇门以后且几率相等。
如今,主持人打开了 F 以外的另外一扇门,因此咱们观察到了 H。假设 H=2。让咱们再计算给定了 F 和 H 时 I 和 D 的条件几率。
几率计算结果以下:
能够看到,咱们第一个选择正确的几率仍然是三分之一,咱们的直觉也是如此。可是,如今车在第 3 扇门后的几率再也不是三分之一,而是三分之二了。
因此若是咱们更换选择,那么咱们获得车的几率是三分之二;若是咱们不换,咱们获得车的几率是三分之一。
示例代码以下:
import math from pomegranate import * # We'll create the discrete distribution for our friend first. friend = DiscreteDistribution( { True: 0.5, False: 0.5 } ) # The emissions for our guest are completely random. guest = ConditionalProbabilityTable( [ [True, 'A', 0.50], [True, 'B', 0.25], [True, 'C', 0.25], [False, 'A', 0.0], [False, 'B', 0.7], [False, 'C', 0.3] ], [friend] ) # Then the distribution for the remaining cars. remaining = DiscreteDistribution({0: 0.1, 1: 0.7, 2: 0.2, }) # The probability of whether the prize is randomized is dependent on the number of remaining cars. randomize = ConditionalProbabilityTable( [ [0, True, 0.05], [0, False, 0.95], [1, True, 0.8], [1, False, 0.2], [2, True, 0.5], [2, False, 0.5] ], [remaining] ) # Now the conditional probability table for the prize. This is dependent on the guest's friend and whether or not it is randomized. prize = ConditionalProbabilityTable( [ [True, True, 'A', 0.3], [True, True, 'B', 0.4], [True, True, 'C', 0.3], [True, False, 'A', 0.2], [True, False, 'B', 0.4], [True, False, 'C', 0.4], [False, True, 'A', 0.1], [False, True, 'B', 0.9], [False, True, 'C', 0.0], [False, False, 'A', 0.0], [False, False, 'B', 0.4], [False, False, 'C', 0.6] ], [randomize, friend] ) # Finally we can create the conditional probability table for our Monty. This is dependent on the guest and the prize. monty = ConditionalProbabilityTable( [ ['A', 'A', 'A', 0.0], ['A', 'A', 'B', 0.5], ['A', 'A', 'C', 0.5], ['A', 'B', 'A', 0.0], ['A', 'B', 'B', 0.0], ['A', 'B', 'C', 1.0], ['A', 'C', 'A', 0.0], ['A', 'C', 'B', 1.0], ['A', 'C', 'C', 0.0], ['B', 'A', 'A', 0.0], ['B', 'A', 'B', 0.0], ['B', 'A', 'C', 1.0], ['B', 'B', 'A', 0.5], ['B', 'B', 'B', 0.0], ['B', 'B', 'C', 0.5], ['B', 'C', 'A', 1.0], ['B', 'C', 'B', 0.0], ['B', 'C', 'C', 0.0], ['C', 'A', 'A', 0.0], ['C', 'A', 'B', 1.0], ['C', 'A', 'C', 0.0], ['C', 'B', 'A', 1.0], ['C', 'B', 'B', 0.0], ['C', 'B', 'C', 0.0], ['C', 'C', 'A', 0.5], ['C', 'C', 'B', 0.5], ['C', 'C', 'C', 0.0] ], [guest, prize] ) # Now we can create the states for our bayesian network. s0 = State(friend, name="friend") s1 = State(guest, name="guest") s2 = State(prize, name="prize") s3 = State(monty, name="monty") s4 = State(remaining, name="remaining") s5 = State(randomize, name="randomize") # Now we'll create our bayesian network with an instance of BayesianNetwork, then add the possible states. network = BayesianNetwork("test") network.add_states(s0, s1, s2, s3, s4, s5) # Then the possible transitions. network.add_transition(s0, s1) network.add_transition(s1, s3) network.add_transition(s2, s3) network.add_transition(s4, s5) network.add_transition(s5, s2) network.add_transition(s0, s2) # With a "bake" to finalize the structure of our network. network.bake() # Now let's create our network from the following data. data = [ [True, 'A', 'A', 'C', 1, True], [True, 'A', 'A', 'C', 0, True], [False, 'A', 'A', 'B', 1, False], [False, 'A', 'A', 'A', 2, False], [False, 'A', 'A', 'C', 1, False], [False, 'B', 'B', 'B', 2, False], [False, 'B', 'B', 'C', 0, False], [True, 'C', 'C', 'A', 2, True], [True, 'C', 'C', 'C', 1, False], [True, 'C', 'C', 'C', 0, False], [True, 'C', 'C', 'C', 2, True], [True, 'C', 'B', 'A', 1, False] ] network.fit(data) # We can see the results below. Lets look at the distribution for our Friend first. print friend # Then our Guest. print guest # Now the remaining cars. print remaining # And the probability the prize is randomized. print randomize # Now the distribution of the Prize. print prize # And finally our Monty. print monty
这里介绍一个pomegranate库,它抽象了几率图模型的底层细节,咱们能够方便地基于API进行上层应用建模。
# -*- coding: utf-8 -*- from pomegranate import * if __name__ == '__main__': guest = DiscreteDistribution({'A': 1./3, 'B': 1./3, 'C': 1./3}) prize = DiscreteDistribution({'A': 1./3, 'B': 1./3, 'C': 1./3}) monty = ConditionalProbabilityTable( [['A', 'A', 'A', 0.0], ['A', 'A', 'B', 0.5], ['A', 'A', 'C', 0.5], ['A', 'B', 'A', 0.0], ['A', 'B', 'B', 0.0], ['A', 'B', 'C', 1.0], ['A', 'C', 'A', 0.0], ['A', 'C', 'B', 1.0], ['A', 'C', 'C', 0.0], ['B', 'A', 'A', 0.0], ['B', 'A', 'B', 0.0], ['B', 'A', 'C', 1.0], ['B', 'B', 'A', 0.5], ['B', 'B', 'B', 0.0], ['B', 'B', 'C', 0.5], ['B', 'C', 'A', 1.0], ['B', 'C', 'B', 0.0], ['B', 'C', 'C', 0.0], ['C', 'A', 'A', 0.0], ['C', 'A', 'B', 1.0], ['C', 'A', 'C', 0.0], ['C', 'B', 'A', 1.0], ['C', 'B', 'B', 0.0], ['C', 'B', 'C', 0.0], ['C', 'C', 'A', 0.5], ['C', 'C', 'B', 0.5], ['C', 'C', 'C', 0.0]], [guest, prize]) s1 = Node(guest, name="guest") s2 = Node(prize, name="prize") s3 = Node(monty, name="monty") model = BayesianNetwork("Monty Hall Problem") model.add_states(s1, s2, s3) model.add_edge(s1, s3) model.add_edge(s2, s3) model.bake() print model.probability([['A', 'A', 'A'], ['A', 'A', 'B'], ['C', 'C', 'B']]) print model.predict([['A', 'B', None], ['A', 'C', None], ['C', 'B', None]]) print model.predict([['A', 'B', None], ['A', None, 'C'], [None, 'B', 'A']])
Relevant Link:
https://yq.aliyun.com/articles/280788
假设咱们有如下图像:
如今假设这张图像受到了随机噪声的污染,变成了有噪声的图像:
如今咱们的目标是恢复原始图像。让咱们看看如何使用几率图模型来实现。
咱们将有噪声图像中的每一个像素都定义为一个观察到的随机变量,并将基准图像中的每一个像素都定义为一个未被观察到的变量,由此,观察到的变量和未被观察到的变量都为 MxN 个。
咱们将观察到的变量表示为 X_ij,未被观察到的变量定义为 Y_ij。每一个变量均可取值 +1 或 -1(分别对应于黑色像素和白色像素)。
给定观察到的变量,咱们但愿找到未观察到的变量的最有可能的值。这对应于 MAP 推理。
如今让咱们使用一些领域知识来构建图结构:
由此,咱们获得图结构:
这个图结构的先验知识很是重要,这是咱们后面进行几率推理的一个重要条件。
咱们的 MAP 推理问题能够用数学的方式写出,以下:
如今,咱们须要根据咱们的图结构来定义咱们的联合分布 P(X,Y)。让咱们假设 P(X,Y) 由两类因子组成,ϕ(X_ij, Y_ij) 和 ϕ(Y_ij,Y_kl),对应于图中的两类边。
接下来,咱们按以下方式定义这些因子:
所以,咱们的联合分布可由下式给出:
将其插入到咱们的 MAP 推理式中,可得:
有了这些参数后,咱们须要求解上述 MAP 推理问题。咱们可使用迭代条件模式(ICM/iterated conditional mode)。其基本思想是:在每一个步骤选择一个节点 Y_ij,而后检查 Y_ij=-1 和 Y_ij=1 时 MAP 推理表达式的值,而后选择值更高的那个。重复这个过程必定的迭代次数或直到收敛,一般就能获得至关好的结果。
下面代码中展现了这个过程,须要特别体会的是,这是一个动态的几率调整过程,每次像素的猜想的同时都至关于向网络中输入了新的信息,网络中的条件几率也所以发生了改变。
# -*- coding: utf-8 -*- import numpy as np from PIL import Image import sys # look up the value of Y for the given indices # if the indices are out of bounds, return 0 def compute_log_prob_helper(Y, i, j): try: return Y[i][j] except IndexError: return 0 def compute_log_prob(X, Y, i, j, w_e, w_s, y_val): result = w_e * X[i][j] * y_val # 在每一个单一颜色的区域内,邻近的像素一般有同样的值,所以,若是 Y_ij 和 Y_kl 是邻近像素,那么咱们将它们链接起来 result += w_s * y_val * compute_log_prob_helper(Y, i-1, j) result += w_s * y_val * compute_log_prob_helper(Y, i+1, j) result += w_s * y_val * compute_log_prob_helper(Y, i, j-1) result += w_s * y_val * compute_log_prob_helper(Y, i, j+1) return result def denoise_image(X, w_e, w_s): m, n = np.shape(X) # initialize Y same as X # 在有噪声图像中的 (i,j) 位置观察到的变量取决于在基准图像中的 (i,j) 位置未观察到的变量。缘由是大多数时候它们是相等的,即 X_ij 和 Y_ij 的初始先验是相等的 Y = np.copy(X) # optimization max_iter = 10 * m * n for iter in range(max_iter): # randomly pick a location i = np.random.randint(m) j = np.random.randint(n) # compute the log probabilities of both values of Y_ij log_p_neg = compute_log_prob(X, Y, i, j, w_e, w_s, -1) log_p_pos = compute_log_prob(X, Y, i, j, w_e, w_s, 1) # assign Y_ij to the value with higher log probability if log_p_neg > log_p_pos: Y[i][j] = -1 else: Y[i][j] = 1 if iter % 100000 == 0: print ('Completed', iter, 'iterations out of', max_iter) return Y # preprocessing step def read_image_and_binarize(image_file): im = Image.open(image_file).convert("L") A = np.asarray(im).astype(int) A.flags.writeable = True A[A<128] = -1 A[A>=128] = 1 return A def add_noise(orig): A = np.copy(orig) for i in range(np.size(A, 0)): for j in range(np.size(A, 1)): r = np.random.rand() if r < 0.1: A[i][j] = -A[i][j] return A def convert_from_matrix_and_save(M, filename, display=False): M[M==-1] = 0 M[M==1] = 255 im = Image.fromarray(np.uint8(M)) if display: im.show() im.save(filename) def get_mismatched_percentage(orig_image, denoised_image): diff = abs(orig_image - denoised_image) / 2 return (100.0 * np.sum(diff)) / np.size(orig_image) def main(): # read input and arguments orig_image = read_image_and_binarize("input.png") w_e = 8 w_s = 10 # add noise noisy_image = add_noise(orig_image) # use ICM for denoising denoised_image = denoise_image(noisy_image, w_e, w_s) # print the percentage of mismatched pixels print ('Percentage of mismatched pixels: ', get_mismatched_percentage(orig_image, denoised_image)) convert_from_matrix_and_save(orig_image, 'orig_image.png', display=False) convert_from_matrix_and_save(noisy_image, 'noisy_image.png', display=False) convert_from_matrix_and_save(denoised_image, 'denoised_image.png', display=False) if __name__ == '__main__': main()
降噪后的图像
能够看到,算法得到了70%的降噪效果。
Relevant Link:
https://www.coursera.org/learn/probabilistic-graphical-models?authMode=signup https://www.cnblogs.com/tornadomeet/p/3480694.html https://yq.aliyun.com/articles/280788 https://github.com/prasoongoyal/image-denoising-mrf/blob/master/denoise.py