python计算数据百分比_概率计算:定义概率分布数据结构,Python实现概率分布计算...
使用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实现概率分布计算...相关推荐
- Python灰帽子_黑客与逆向工程师的Python编程之道
收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道
- python helper函数_使函数定义以python文件顺序独立
使函数定义以python文件顺序独立 我使用Python CGI. 我无法在定义函数之前调用它. 在Oracle PL / SQL中,存在"转发声明"的技巧:将所有函数都命名为最顶 ...
- python老师武_跟着廖雪峰老师学python (5)
若想技术精进,当然得把基础知识打得牢牢的. 廖雪峰的官方网站 python3教程,该网站提供的教程浅显易懂,还附带了讲学视频,非常适合初学者正规入门. 以下是通过廖雪峰python官方网站学习的个人 ...
- python ray定时_使用 Ray 用 15 行 Python 代码实现一个参数服务器
使用 Ray 用 15 行 Python 代码实现一个参数服务器 参数服务器是很多机器学习应用的核心部分.其核心作用是存放机器学习模型的参数(如,神经网络的权重)和提供服务将参数传给客户端(客户端通常 ...
- access与python哪个好_美图太多,Python 帮你挑选最合适的!
前几天,極光同学写了篇下载王者荣耀皮肤的文章,可以轻松的获取各种英雄背景图,甚是激动,也想将桌面背景换成漂亮的,不过我对王者荣耀不感冒(曝露年龄啦),时常会被必应搜索主页的背景图所震撼,于是想到从必应 ...
- 什么是python编程例子_案例详解:优化Python编程的4个妙招
全文共3510字,预计学习时长7分钟 作为数据科学家,敲出最优的Python代码非常非常重要.别无他法,杂乱低效的代码笔记本会消耗你的时间,也会浪费大量项目资金.经验丰富的数据科学家和专业人士都很清楚 ...
- python 行为驱动_什么是行为驱动的Python?
python 行为驱动 您是否听说过行为驱动开发 (BDD),并想知道所有嗡嗡声是什么? 也许您发现团队成员在"小食"中聊天,并感到被排除在对话之外. 或者,也许您是一名Pytho ...
- python vector 初始化_一文带你走进Python中的数据类
全文共2607字,预计学习时长14分钟 图源:unsplash 数据类适用于Python3.7或更高版本,它不仅可以用作数据容器,还可以编写样板代码,简化创建类的过程. 创建第一个数据类 创建一个数据 ...
- python核心理念_《三天搞定Python基础概念之第一天》中文版
前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...
最新文章
- 在Ubuntu 14.04 64位上使用libpcap进行抓包和解包
- 【PP】重复生产参数文件说明
- 蓝桥杯C语言指数计算,蓝桥杯 算式900!!!!自己编的程序出毛病 了 求大神帮忙!~...
- JAVA入门级教学之(多态)
- win10清理_无需第三方,win10也可以实现自动清理垃圾
- 迅游科技拟作价27亿元收购移动应用开发商狮之吼
- 搭建网站-Disczu
- 【报告分享】2021H1电商发展分析报告.pdf(附下载链接)
- 拒绝版权流氓!阿里巴巴重磅发布免费商用字体
- office 2007插入带圈字符
- GVS与唯康教育达成战略合作,共建智能家居人才培养高地
- 手机软件测试分类(测试分类)
- 谷歌浏览器的各种插件网址Chrome插件(谷歌浏览器)-超级详细
- 数据分析之学术前沿分析 任务1:论文数据统计
- docker创建容器一直restart解决
- 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...
- 怎么设置服务器用户默认路径,怎么把传奇服务端里的默认路径由D盘改为C盘
- Svchost.exe服务
- Ubuntu如何百度云盘下载
- cc1101中文手册
热门文章
- BCE支持者在BCH见面会烧毁BCH主题衣服
- Google Play 关联了
- memcached 高可用工具 memcached-ha
- VMware Virtual SAN存储设计规划
- 首次编译Java小程序
- ORACLE11G 将dataguard的rman备份恢复到测试环境的单机oracle中的详细过程
- BootStrap字体图标不显示、下拉菜单不显示
- LYNC2013部署系列PART2:后端部署
- 【Curl (libcurl) 开发 之一】Cocos2dx之libcurl(curl_easy)的编程教程(帮助手册)!...
- RHEL5+ImageMagick-6.4.0-0+jmagick-6.4.0+resin 解决方案