一、概率列表+样本列表

任务描述:我们常常拥有一个概率列表和样本列表,表示每一个样本被选中的概率,并且在概率列表中,概率之和为1。比如,[0.7, 0.2, 0.1]['钢铁侠', '美国队长', '雷神'],两个列表中的元素一一对应;并且,这两个列表共同表示:'钢铁侠'0.7的概率被选中,'美国队长'0.2的概率被选中,'雷神'0.1的概率被选中,我们的目的是想要通过[0.7, 0.2, 0.1]这样的离散概率分布来对['钢铁侠', '美国队长', '雷神']进行采样,并且只采一个样本(当然也可以采多个样本)。

实际上这样的任务在Python中可以使用相当简单的方式实现,具体请看我的代码。

代码

import random# input: probability distribution and correspondence
list_probability = [0.005, 0.015, 0.08, 0.25, 0.3, 0.25, 0.08, 0.015, 0.005]
list_player_role = ['黑寡妇', '蜘蛛侠', '绿巨人', '雷神', '钢铁侠', '奇异博士', '美国队长', '黑豹', '鹰眼']
# sampling
result = random.choices(list_player_role, weights=list_probability, k=1)[0]
# output: sampling one by probability distribution
print(result)# check the sampling whether is following the probability distribution or not
frequency = [0, 0, 0, 0, 0, 0, 0, 0, 0]
trying_times = 100000
for i in range(trying_times):result = random.choices(list_player_role, weights=list_probability, k=1)[0]if result == list_player_role[0]:frequency[0] += 1elif result == list_player_role[1]:frequency[1] += 1elif result == list_player_role[2]:frequency[2] += 1elif result == list_player_role[3]:frequency[3] += 1elif result == list_player_role[4]:frequency[4] += 1elif result == list_player_role[5]:frequency[5] += 1elif result == list_player_role[6]:frequency[6] += 1elif result == list_player_role[7]:frequency[7] += 1elif result == list_player_role[8]:frequency[8] += 1else:raise Exception('There is something wrong in sampling...')
for i in range(len(frequency)):print('角色:%s\t概率: %.3f\t频率: %d/%d=%.4f' % (list_player_role[i], list_probability[i], frequency[i], trying_times, frequency[i]/trying_times))

输出

钢铁侠
角色:黑寡妇    概率: 0.005    频率: 489/100000=0.0049
角色:蜘蛛侠    概率: 0.015    频率: 1558/100000=0.0156
角色:绿巨人    概率: 0.080    频率: 8011/100000=0.0801
角色:雷神    概率: 0.250    频率: 25094/100000=0.2509
角色:钢铁侠    概率: 0.300    频率: 29957/100000=0.2996
角色:奇异博士    概率: 0.250    频率: 24958/100000=0.2496
角色:美国队长    概率: 0.080    频率: 7867/100000=0.0787
角色:黑豹    概率: 0.015    频率: 1551/100000=0.0155
角色:鹰眼    概率: 0.005    频率: 515/100000=0.0052

可以看到输出结果中每一个频率都接近于它所对应的概率,这说明采样的过程确实是遵从我们指定的概率分布的。

二、仅有概率列表

任务描述:不指定样本列表,仅仅有一个概率列表,然后经过采样后输出概率列表中的一个索引。例如,输入[0.7, 0.2, 0.1],输出1,那么1则表示采到了概率0.2。如果输出2,那么表示采到了概率0.1;如果输出0,那么表示采到了概率0.7

代码

import random# input: probability distribution and correspondence
list_probability = [0.005, 0.015, 0.08, 0.25, 0.3, 0.25, 0.08, 0.015, 0.005]# sampling
index = list(range(len(list_probability)))
probability_index = random.choices(index, weights=list_probability, k=1)[0]# output: sampling one by probability distribution
print(probability_index)

输出

5

上述的采样过程仅在Python中的list进行测试,按理来说numpy、pytorch等开源库也是会有相应的实现方法的。经过网上检索,确实有,请移步至sampling from a tensor in torch。

三、pytorch实现

代码

import torch# input: discrete probability distribution
p = torch.tensor([0.005, 0.015, 0.08, 0.25, 0.3, 0.25, 0.08, 0.015, 0.005])# sampling: sample one by given probability distribution
index = p.multinomial(num_samples=1, replacement=False)     # replacement=False指不重复采样# output: the formulation of sampling result
print(index.item())

输出

4

四、参考

Choose element(s) from List with different probability in Python

Sampling from a tensor in Torch

Python根据离散概率分布采样相关推荐

  1. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  2. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

  3. tensorflow如何做幂律分布_离散概率分布与连续概率分布

    随机变量:随机变量(random variable)表示随机试验各种结果的实值单值函数.随机事件不论与数量是否直接有关,都可以数量化,即都能用数量化的方式表 概率:,它反映随机事件出现的可能性(lik ...

  4. Python分析离散心率信号(上)

    Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...

  5. 概率分布--------离散概率分布和连续概率分布

    解释关键词: 概率分布:离散概率分布和连续概率分布 随机变量:量化的随机世界的函数 分布:数据在统计图中的形状 概率分布:用统计图来表示随机变量所有可能的结果和对应结果发生的概率 离散的概率计算是体积 ...

  6. Python中的图像处理(第六章)Python图像量化及采样处理(2)

    Python中的图像处理(第六章)Python图像量化及采样处理(2) 前言 一. Python准备 二. Python仿真 三. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上 ...

  7. 【程序员眼中的统计学(4)】离散概率分布的运用:善用期望

    离散概率分布的运用:善用期望 作者 白宁超 2015年10月15日0:37:02 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机 ...

  8. 翻译—使用Python分析离散心率信号–第2部分

    此文为翻译+自己的理解,github地址:https://github.com/paulvangentcom/heartrate_analysis_python 对于求心率的信号,我们主要关注心跳之间 ...

  9. 使用Python计算离散随机变量的熵(Entropy)

    一.离散随机变量 设为离散型随机变量的所有可能值:而是取的概率,即 则称为(离散)随机变量的概率分布,而且它满足下面的条件: 在现实中,通常这个随机变量的取值个数是可数的.这里假设随机变量的取值个数为 ...

最新文章

  1. CentOS下Docker 安装
  2. R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)
  3. 学完 CompletionService,可以做时间管理大师?
  4. wordexcelppt文档加密方式
  5. 相似度--欧氏距离(归一化)
  6. linux 系统管理(二) 磁盘分区
  7. exception in thread main java,【异常】idea执行Main方法出现 Exception in thread main java.lang.NoClassDefFo...
  8. 使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件
  9. anaconda对应python版本_Python基础——如何查看python版本、如何查看多个python版本
  10. Android网络多线程断点续传下载
  11. appium和airtest_Airtest自动化测试工具
  12. 创业/商业计划书10大禁忌
  13. php个人财务管理,PHP个人理财管理系统的设计与实现
  14. [教学]基于crnn的中文汉字识别_pyqt界面交互界面python含代码
  15. 什么是域名系统或 DNS?
  16. html文字发光效果,css文字发光效果
  17. layui 集成手写签名
  18. C++:实现量化Libor市场模型测试实例
  19. 江西省上饶市谷歌高清卫星地图下载
  20. Windows CE下中文输入法编辑器

热门文章

  1. 【论文分享】Sequence Coverage Directed Greybox Fuzzing
  2. SAP的顾问FICO面试经典
  3. 台达HMI和松下PLC通信常见错误总结与解决办法
  4. 集思广益,求工作室名称
  5. 2018数学建模美赛A题翻译
  6. jFinal集成activiti流程管理框架
  7. S090-针对车载系统电气化应用的电磁阀和电机驱动模块
  8. Adobe RIA 开发工程师认证考试大纲
  9. AnyGantt Flash甘特图组件免费下载及使用教程
  10. 怎样检查笔记本电池使用情况?