python – 生成加权随机数
发布时间:2020-12-20 11:31:14 所属栏目:Python 来源:网络整理
导读:嗨,我正在做一些基因组学课程的代码,我在某个方面遇到了困难. 我有一套相互排斥的活动 概率 我想用给定的概率模拟n次随机抽样事件. 输入:概率= {0.3,0.2,0.5}事件{e1,e2,e3} n = 100 输出:e3应为~50,e2为~20,e1为~30. 请注意,这些可能不完全是50,20,30,因
嗨,我正在做一些基因组学课程的代码,我在某个方面遇到了困难.
我有一套相互排斥的活动 我想用给定的概率模拟n次随机抽样事件. 输入:概率= {0.3,0.2,0.5}事件{e1,e2,e3} n = 100 输出:e3应为~50,e2为~20,e1为~30. 解决方法
Python没有内置任何加权采样功能(NumPy / SciPy),但对于这样一个非常简单的情况,它非常简单:
import itertools import random probabilities = [0.3,0.5] totals = list(itertools.accumulate(probabilities)) def sample(): n = random.uniform(0,totals[-1]) for i,total in enumerate(totals): if n <= total: return i 如果你没有Python 3.2,你就没有accumulate函数;如果列表确实如此简短,你可以使用低效的单行代码伪造它: totals = [sum(probabilities[:i+1]) for i in range(len(probabilities))] …或者您可以编写显式循环或丑陋的reduce调用,或者从the docs复制等效的Python函数. 另外,请注意random.uniform(0,totals [-1])只是编写random.random()的一种更复杂的方法,如果你可以确定你的数字加起来为1.0. 一种快速测试方法: >>> samples = [sample() for _ in range(100000)] >>> samples.count(0) 29878 >>> samples.count(1) 19908 >>> samples.count(2) 50214 这些分别非常接近100000的30%,20%和50%. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |