两步概率抽取 - 结合概率加权函数和截断正态分布的抽取
Two step probability draw - Combine probability weighting function and a draw from a truncuated normal distribution
我想根据特定的概率函数用python抽取一个随机值(r):
该值应该是一个固定常数,概率为 (p),概率为 (1-p),该值是从区间 (a,b) 中的正态分布中随机抽取的。
从我的角度来看,该函数由两个绘制组成:
第一次抽取:概率加权函数,概率为 p 和 (1-p)。
第二次抽取:从区间 (a,b) 中的截断正态分布抽取。
f.e。 constant = 10; p = 0,3; 1-p = 0,7, a=5, b=15
我的想法是:
r = random.choices([constant,random.normal()], weights=(0.3, 0.7))
然而,它似乎不起作用,我不知道如何包括间隔 (a,b)。
您的想法是中肯的,但您没有正确处理正态分布。首先,如果您使用 import random
,您的选择是 random.gauss(mu, sigma)
或 random.normalvariate(mu, sigma)
。没有 normal()
函数。其次,正态分布的范围是无限的。您可以指定分布的中心 mu
和分布的度量 sigma
,这样约 95% 的结果将落在 mu ± 2*sigma
范围内。如果您确实需要限制范围,则需要编写自己的带有循环的函数以拒绝超出范围限制的值并重试。
这是一个展示您想法的工作示例:
import random
constant = -42
mu = 10
sigma = 2
for _ in range(10):
r = random.choices((constant,random.gauss(mu, sigma)), weights=(0.3, 0.7))
print(r)
对于 mu
和 sigma
的这些值,[5, 15] 范围之外的结果将很少见,但肯定仍然会发生。
这会产生如下结果:
[7.674159248587632]
[-42]
[7.818652194185853]
[-42]
[7.418414458386396]
[11.855000252151326]
[12.398753049340957]
[9.663097201849096]
[-42]
[10.385663464672415]
如果您不喜欢括号,print(r[0])
。
我想根据特定的概率函数用python抽取一个随机值(r):
该值应该是一个固定常数,概率为 (p),概率为 (1-p),该值是从区间 (a,b) 中的正态分布中随机抽取的。
从我的角度来看,该函数由两个绘制组成:
第一次抽取:概率加权函数,概率为 p 和 (1-p)。
第二次抽取:从区间 (a,b) 中的截断正态分布抽取。
f.e。 constant = 10; p = 0,3; 1-p = 0,7, a=5, b=15
我的想法是:
r = random.choices([constant,random.normal()], weights=(0.3, 0.7))
然而,它似乎不起作用,我不知道如何包括间隔 (a,b)。
您的想法是中肯的,但您没有正确处理正态分布。首先,如果您使用 import random
,您的选择是 random.gauss(mu, sigma)
或 random.normalvariate(mu, sigma)
。没有 normal()
函数。其次,正态分布的范围是无限的。您可以指定分布的中心 mu
和分布的度量 sigma
,这样约 95% 的结果将落在 mu ± 2*sigma
范围内。如果您确实需要限制范围,则需要编写自己的带有循环的函数以拒绝超出范围限制的值并重试。
这是一个展示您想法的工作示例:
import random
constant = -42
mu = 10
sigma = 2
for _ in range(10):
r = random.choices((constant,random.gauss(mu, sigma)), weights=(0.3, 0.7))
print(r)
对于 mu
和 sigma
的这些值,[5, 15] 范围之外的结果将很少见,但肯定仍然会发生。
这会产生如下结果:
[7.674159248587632]
[-42]
[7.818652194185853]
[-42]
[7.418414458386396]
[11.855000252151326]
[12.398753049340957]
[9.663097201849096]
[-42]
[10.385663464672415]
如果您不喜欢括号,print(r[0])
。