使用Python实现马尔科夫随机场、蒙特卡洛采样等随机过程算法的前提,就是用Python实现概率的计算。并不只是数值计算,而是能够将随机模拟中常用的各种概率相关的操作,都能用计算机的数据结构来表达,其关键在于对【随机变量】的适当定义处理。
因此本文介绍一下概率分布在Python中定义的一种数据结构。
一个概率分布的组成要素包含:随机变量、变量的维度、变量不同取值状态的对应概率值。
在一个有向图中(贝叶斯网络),常有如下所示的结构:
典型的贝叶斯网络
在这个贝叶斯网络中,有五个随机变量,各自有不同的维度,并且在列表中给出了对应变量取值的概率值。因此我们的目标可以拆解为两步,第一:
用Python精准地定义一个因子对象(记为Factor),这个对象表达一个联合分布,其中包含随机变量、变量维度、对应概率值这三个信息。
第二:
实现概率相乘、求边缘概率、求条件概率运算。
这次先解决问题一。
将概率分布间的计算用python表达出来,包括对一个联合分布求某个变量的边缘概率分布,对一个联合分布给定一部分变量的取值,求条件概率分布。以及更基础的,求两个因子的乘积-状态维度和状态维度的相乘,所对应的概率值的数量也同样扩大。
最后,分别获取这个贝叶斯网络中每个因子的概率分布,我们要求出整个网络的联合分布ÿ