【机器学习系列】概率图模型第六讲:因子图和道德图


作者:CHEONG

公众号:AI机器学习与知识图谱

研究方向:自然语言处理与知识图谱

阅读本文之前,先注意一下两点:

1、机器学习系列文章常含有大量公式推导证明,为了更好理解,文章在最开始会给出本文的重要结论,方便最快速度理解本文核心。需要进一步了解推导细节可继续往后看;

2、文中含有大量公式,若读者需要获取含公式原稿Word文档,可关注公众号【AI机器学习与知识图谱】后回复:概率图模型第六讲,可添加微信号【17865190919】进公众号讨论群,加好友时备注来自优快云。原创不易,转载请告知并注明出处!


本文主要介绍概率图中的两类图:因子图和道德图。



一、本文结论


1、因子图作用:有向图有时需要转为无向图,但在转化过程中会引入环,图中存在环不好处理,因子图的作用是:一方面因子图可以将图中的环去掉;另一方面因子图会使得图计算变得简便;

2、道德图含义:道德图是指在有向图转化为无向图时,这个无向图就又被称为道德图,主要需要掌握的是如何将一个有向图转化为道德图,具体看正文。



二、因子图Factor Graph


有向图可以转为无向图,但转为无向图过程中可能会引入环。例如Belief Propagation算法只能处理树形结构,含有环便不好处理。因此因子图的引入有以下两个作用:

1、首先因子图可以将图中的环去掉,转化为无环图,2、因子图会使得计算变得简便

对于图G={x1,x2,...,xn}G=\{x_1,x_2,...,x_n\}G={x1,x2,...,xn},因子图可表达成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g39H2mJh-1615623123079)(file:///C:/Users/zl_sd/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png)]

其中SSS是图中节点子集,xsx_sxssss的随机变量子集。因式分解本身就对应一个特殊的因子图。一个无向图可以存在多个因子图,在无向图中加入因子节点,以下展现了一个有环无向图两种因子分解图的形式:

在这里插入图片描述
在这里插入图片描述



三、Moral Graph道德图


将有向图转化为无向图时,该无向图又被称为道德图Moral Graph,为什么要将有向图转化为无向图:因为无向图更加Generalize一些,更方便处理。有向图GGG转化为无向图有两大准则:

1∀xiϵG\forall x_i \epsilon GxiϵG,将Parent(xi)Parent(x_i)Parent(xi)两两连接起来;
2、将GGG中的有向边替换成无向边。

下面展现了四种有向图转化为无向图的例子:

在这里插入图片描述

上图中有向图因式分解:p(a,b,c)=p(a)⋅p(b∣a)⋅p(c∣b)p(a,b,c)=p(a)\cdot p(b|a)\cdot p(c|b)p(a,b,c)=p(a)p(ba)p(cb),转化后的无向图因子分解为:p(a,b,c)=ψ(a,b)⋅ψ(b,c)p(a,b,c)=\psi(a,b)\cdot \psi(b,c)p(a,b,c)=ψ(a,b)ψ(b,c),其中ψ(a,b)\psi(a,b)ψ(a,b)相当于有向图中的p(a)⋅p(b∣a)p(a)\cdot p(b|a)p(a)p(ba)ψ(b,c)\psi(b,c)ψ(b,c)相当于有向图中的p(c∣b)p(c|b)p(cb)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5M8vgYTB-1615623123105)(file:///C:/Users/zl_sd/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg)]

上图中有向图因式分解:p(a,b,c)=p(a)⋅p(b∣a)⋅p(c∣a)p(a,b,c)=p(a)\cdot p(b|a)\cdot p(c|a)p(a,b,c)=p(a)p(ba)p(ca),转化后的无向图因子分解为:p(a,b,c)=ψ(a,b)⋅ψ(a,c)p(a,b,c)=\psi(a,b)\cdot \psi(a,c)p(a,b,c)=ψ(a,b)ψ(a,c),同理:ψ(a,b)\psi(a,b)ψ(a,b)近似p(a)⋅p(b∣a)p(a)\cdot p(b|a)p(a)p(ba)ψ(a,c)\psi(a,c)ψ(a,c)近似p(c∣a)p(c|a)p(ca)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7fFyAwo-1615623123108)(file:///C:/Users/zl_sd/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg)]

上图这种情况较为特殊,不仅仅将有向边替换成无向边还需要将父节点两两相连接,可以从有向图和无向图因子分解证明其合理性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhbUrF7Q-1615623123111)(file:///C:/Users/zl_sd/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]

简单说明一下,例如上式为有向图因子分解,将p(a)⋅p(b)⋅p(c∣a,b)p(a)\cdot p(b)\cdot p(c|a,b)p(a)p(b)p(ca,b)ψ\psiψ函数替换则合理的近似是p(a)⋅p(b)⋅p(c∣a,b)=ψ(a,b,c)p(a)\cdot p(b)\cdot p(c|a,b)=\psi(a,b,c)p(a)p(b)p(ca,b)=ψ(a,b,c),则说明节点a,b,c是一个团,所以两两相连,符合转化后的结果。
在这里插入图片描述

参考视频资料:【机器学习】【白板推导系列】 作者:shuhuai008

参考书籍资料:Pattern Recognition and Machine Learning 作者:Christopher Bishop

很高兴为您解答这个问题!本次我们将学习如何用 Python 实现《机器学习》周志华教授第十四章中的概率图模型习题。在这里,我们将使用 Python 的 pgmpy 库来构建分析概率图模型。 首先,我们需要安装 pgmpy。可以使用 pip 安装: ```python pip install pgmpy ``` 安装完成后,我们就可以开始实现习题了。 #### 习题 14.1 考虑一个三元组 $(X, Y, Z)$,其中 $X$ 是二元随机变量,$Y, Z$ 是一元随机变量,试构造一个无向结构,使其成为正态分布的一个合法模型。 我们可以使用 pgmpy 来创建这个无向模型。代码如下: ```python from pgmpy.models import MarkovModel # 创建一个空的无向模型 model = MarkovModel() # 添加变量节点 model.add_nodes_from(['X', 'Y', 'Z']) # 添加边 model.add_edges_from([('X', 'Y'), ('X', 'Z')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y', 'Z'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的无向模型,然后添加了三个变量节点 $X, Y, Z$ 两条边 $(X, Y), (X, Z)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 #### 习题 14.2 考虑一个四元组 $(X_1, X_2, X_3, X_4)$,它们之间的关系如下所示。试构造这个有向结构的贝叶斯网模型。 ![image.png](attachment:image.png) 我们可以使用 pgmpy 来创建这个有向模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X3', 'X2'), ('X4', 'X2')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向模型,然后添加了四个变量节点 $X_1, X_2, X_3, X_4$ 四条边 $(X_2, X_1), (X_3, X_1), (X_3, X_2), (X_4, X_2)$。最后,我们打印出了模型的边结构。 #### 习题 14.3 考虑一个五元组 $(X_1, X_2, X_3, X_4, X_5)$,它们之间的关系如下所示。试构造这个有向结构的贝叶斯网模型。 ![image-2.png](attachment:image-2.png) 我们可以使用 pgmpy 来创建这个有向模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X2'), ('X5', 'X3')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向模型,然后添加了五个变量节点 $X_1, X_2, X_3, X_4, X_5$ 五条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_2), (X_5, X_3)$。最后,我们打印出了模型的边结构。 #### 习题 14.4 考虑一个六元组 $(X_1, X_2, X_3, X_4, X_5, X_6)$,它们之间的关系如下所示。试构造这个有向结构的贝叶斯网模型。 ![image-3.png](attachment:image-3.png) 我们可以使用 pgmpy 来创建这个有向模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5', 'X6']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X3'), ('X6', 'X4'), ('X6', 'X5')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向模型,然后添加了六个变量节点 $X_1, X_2, X_3, X_4, X_5, X_6$ 六条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_3), (X_6, X_4), (X_6, X_5)$。最后,我们打印出了模型的边结构。 #### 习题 14.5 考虑一个二元组 $(X, Y)$,其中 $X$ 是一元随机变量,$Y$ 是二元随机变量,试构造一个有向结构,使其成为正态分布的一个合法模型。 我们可以使用 pgmpy 来创建这个有向模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X', 'Y1', 'Y2']) # 添加边 model.add_edges_from([('X', 'Y1'), ('X', 'Y2')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y1', 'Y2'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的有向模型,然后添加了三个变量节点 $X, Y_1, Y_2$ 两条边 $(X, Y_1), (X, Y_2)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 以上就是本次的答案,希望对您有所帮助!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值