使用Python实现马尔科夫随机场、蒙特卡洛采样等随机过程算法的前提,就是用Python实现概率的计算。并不只是数值计算,而是能够将随机模拟中常用的各种概率相关的操作,都能用计算机的数据结构来表达,其关键在于对【随机变量】的适当定义处理。

因此本文介绍一下概率分布在Python中定义的一种数据结构。

一个概率分布的组成要素包含:随机变量、变量的维度、变量不同取值状态的对应概率值。

在一个有向图中(贝叶斯网络),常有如下所示的结构:

典型的贝叶斯网络

在这个贝叶斯网络中,有五个随机变量,各自有不同的维度,并且在列表中给出了对应变量取值的概率值。因此我们的目标可以拆解为两步,第一:

用Python精准地定义一个因子对象(为Factor),这个对象表达一个联合分布,其中包含随机变量、变量维度、对应概率值这三个信息。

第二:

实现概率相乘、求边缘概率、求条件概率运算。

这次先解决问题一。

将概率分布间的计算用python表达出来,包括对一个联合分布求某个变量的边缘概率分布,对一个联合分布给定一部分变量的取值,求条件概率分布。以及更基础的,求两个因子的乘积-状态维度和状态维度的相乘,所对应的概率值的数量也同样扩大。

最后,分别获取这个贝叶斯网络中每个因子的概率分布,我们要求出整个网络的联合分布:

求联合分布

联合分布概率为每个因子在父节点条件下条件概率的乘积。

具体实现如下:

首先实现因子对象,Factor,其中随机变量用属性var(variables)表示,为python_list结构,变量维度card(cardinality),同样为list,概率取值val(value)列表list。对因子对象实现获取状态结构函数(get_all_assignments),正态化函数(将val列表中所有概率值正态化,使其和为1)。

注意,val概率值列表的顺序,对应着变量取值的某个特定状态。

实现打印功能,方便查看一个因子的具体情况。

class Factor:    def __init__(self, var=None, card=None, val=None):        if var is None:            var = np.array([], np.int64)        if card is None:            card = np.array([], np.int64)        if val is None:            val = np.array([], np.float64)        self.var = np.array(var)        self.card = np.array(card)        self.val = np.array(val)    def is_empty(self):        """Returns true if the factor is empty (i.e. not initialized)"""        return len(self.var) == 0    def get_all_assignments(self):        assignments = index_to_assignment(np.arange(int(np.prod(self.card))), self.card)        return assignments    def __repr__(self):        if self.is_empty():            str = 'Empty factor'        else:            str = 'Factor containing {} variables'.format(len(self.var))            num_states = int(np.prod(self.card))            assigments = index_to_assignment(np.arange(num_states), self.card)            # Print header row            header = '| ' + ' '.join(['X_{}'.format(i) for i in self.var]) +                      ' | Probability |'            col_width = len(header)            line = '-' * col_width + ''            str += line + header + '' + line            # Assignments            for i in range(assigments.shape[0]):                lhs = '   '.join(['{}'.format(a) for a in assigments[i]])                row = '|  ' + lhs + '  | ' + '{:>11g}'.format(self.val[i]) + ' |'                str = str + row            str += line + ''        return str    def normalize(self):        """Normalize the probablity such that it sums to 1.        Use this function with care since not all factor tables should be        normalized.        """        if not self.is_empty():            self.val /= np.sum(self.val)

比如,定义一个因子:

card=[2,3,2]phi = Factor(var=[1, 2,5],                 card=card,                 val=[0.6, 0.3, 0.2, 0.7, 0.2, 0.0,0.1,0.2,0.1,0.1,0.2,0.3])

使得该因子含3个随机变量,随机变量维度分别为2,3,2,概率值如val列表所示。

将其打印,结果如下:

print(phi)———————————————Factor containing 2 variables-------------------------| X_1 X_2 X_5 | Probability |-----------------------------|  0   0   0  |         0.6 ||  1   0   0  |         0.3 ||  0   1   0  |         0.2 ||  1   1   0  |         0.7 ||  0   2   0  |         0.2 ||  1   2   0  |           0 ||  0   0   1  |         0.1 ||  1   0   1  |         0.2 ||  0   1   1  |         0.1 ||  1   1   1  |         0.1 ||  0   2   1  |         0.2 ||  1   2   1  |         0.3 |-----------------------------

这样就完成了问题一,实现了概率分布这个数据结构。这样做的意义,在于将随机变量的信息和概率值绑定在一起,为后续的概率计算,乃至各种随机模拟算法的实现提供条件。

为了后续的实现,开发两个因子函数,用以方便地查看概率值,及其所对应的变量状态取值:

def index_to_assignment(index: Union[int, np.ndarray], card: np.ndarray):    """Convert index to variable assignment    Args:        index: Index to convert into assignment.          If index is a vector of numbers, the function will return          a matrix of assignments, one assignment per row.        card: Cardinality of the factor    """    if isinstance(index, int):        is_scalar = True        index = np.array([index])    else:        is_scalar = False    divisor = np.cumprod(np.concatenate([[1.], card[:-1]]))    assignment = np.mod(        np.floor(index[:, None] / divisor[None, :]),        card[None, :]    ).astype(np.int64)    if is_scalar:        assignment = assignment[0]      return assignmentdef assignment_to_index(assignment: np.ndarray, card: np.ndarray):    """Convert assignment to index.    Args:        assignment: Assignment to convert to index        card: Cardinality of the factor    """    multiplier = np.cumprod(np.concatenate([[1.], card[:-1]]))    index = np.sum(assignment * multiplier, axis=-1).astype(np.int64)    return index

以上是用Python定义概率分布数据结构的方法。

python计算数据百分比_概率计算:定义概率分布数据结构,Python实现概率分布计算...相关推荐

  1. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  2. python helper函数_使函数定义以python文件顺序独立

    使函数定义以python文件顺序独立 我使用Python CGI. 我无法在定义函数之前调用它. 在Oracle PL / SQL中,存在"转发声明"的技巧:将所有函数都命名为最顶 ...

  3. python老师武_跟着廖雪峰老师学python (5)

    若想技术精进,当然得把基础知识打得牢牢的. 廖雪峰的官方网站  python3教程,该网站提供的教程浅显易懂,还附带了讲学视频,非常适合初学者正规入门. 以下是通过廖雪峰python官方网站学习的个人 ...

  4. python ray定时_使用 Ray 用 15 行 Python 代码实现一个参数服务器

    使用 Ray 用 15 行 Python 代码实现一个参数服务器 参数服务器是很多机器学习应用的核心部分.其核心作用是存放机器学习模型的参数(如,神经网络的权重)和提供服务将参数传给客户端(客户端通常 ...

  5. access与python哪个好_美图太多,Python 帮你挑选最合适的!

    前几天,極光同学写了篇下载王者荣耀皮肤的文章,可以轻松的获取各种英雄背景图,甚是激动,也想将桌面背景换成漂亮的,不过我对王者荣耀不感冒(曝露年龄啦),时常会被必应搜索主页的背景图所震撼,于是想到从必应 ...

  6. 什么是python编程例子_案例详解:优化Python编程的4个妙招

    全文共3510字,预计学习时长7分钟 作为数据科学家,敲出最优的Python代码非常非常重要.别无他法,杂乱低效的代码笔记本会消耗你的时间,也会浪费大量项目资金.经验丰富的数据科学家和专业人士都很清楚 ...

  7. python 行为驱动_什么是行为驱动的Python?

    python 行为驱动 您是否听说过行为驱动开发 (BDD),并想知道所有嗡嗡声是什么? 也许您发现团队成员在"小食"中聊天,并感到被排除在对话之外. 或者,也许您是一名Pytho ...

  8. python vector 初始化_一文带你走进Python中的数据类

    全文共2607字,预计学习时长14分钟 图源:unsplash 数据类适用于Python3.7或更高版本,它不仅可以用作数据容器,还可以编写样板代码,简化创建类的过程. 创建第一个数据类 创建一个数据 ...

  9. python核心理念_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

最新文章

  1. 在Ubuntu 14.04 64位上使用libpcap进行抓包和解包
  2. 【PP】重复生产参数文件说明
  3. 蓝桥杯C语言指数计算,蓝桥杯 算式900!!!!自己编的程序出毛病 了 求大神帮忙!~...
  4. JAVA入门级教学之(多态)
  5. win10清理_无需第三方,win10也可以实现自动清理垃圾
  6. 迅游科技拟作价27亿元收购移动应用开发商狮之吼
  7. 搭建网站-Disczu
  8. 【报告分享】2021H1电商发展分析报告.pdf(附下载链接)
  9. 拒绝版权流氓!阿里巴巴重磅发布免费商用字体
  10. office 2007插入带圈字符
  11. GVS与唯康教育达成战略合作,共建智能家居人才培养高地
  12. 手机软件测试分类(测试分类)
  13. 谷歌浏览器的各种插件网址Chrome插件(谷歌浏览器)-超级详细
  14. 数据分析之学术前沿分析 任务1:论文数据统计
  15. docker创建容器一直restart解决
  16. 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...
  17. 怎么设置服务器用户默认路径,怎么把传奇服务端里的默认路径由D盘改为C盘
  18. Svchost.exe服务
  19. Ubuntu如何百度云盘下载
  20. cc1101中文手册

热门文章

  1. BCE支持者在BCH见面会烧毁BCH主题衣服
  2. Google Play 关联了
  3. memcached 高可用工具 memcached-ha
  4. VMware Virtual SAN存储设计规划
  5. 首次编译Java小程序
  6. ORACLE11G 将dataguard的rman备份恢复到测试环境的单机oracle中的详细过程
  7. BootStrap字体图标不显示、下拉菜单不显示
  8. LYNC2013部署系列PART2:后端部署
  9. 【Curl (libcurl) 开发 之一】Cocos2dx之libcurl(curl_easy)的编程教程(帮助手册)!...
  10. RHEL5+ImageMagick-6.4.0-0+jmagick-6.4.0+resin 解决方案