快速任意分布随机抽样 [英] Fast arbitrary distribution random sampling
问题描述
random
模块( http://docs.python.org/2/library/random.html )具有几个 fixed 函数,可以从中随机采样.例如,random.gauss
将从具有给定均值和sigma值的正态分布中采样随机点.
The random
module (http://docs.python.org/2/library/random.html) has several fixed functions to randomly sample from. For example random.gauss
will sample random point from a normal distribution with a given mean and sigma values.
我正在寻找一种方法,该方法使用我自己的python
中的分布尽可能快地在给定间隔内提取许多N
随机样本.这就是我的意思:
I'm looking for a way to extract a number N
of random samples between a given interval using my own distribution as fast as possible in python
. This is what I mean:
def my_dist(x):
# Some distribution, assume c1,c2,c3 and c4 are known.
f = c1*exp(-((x-c2)**c3)/c4)
return f
# Draw N random samples from my distribution between given limits a,b.
N = 1000
N_rand_samples = ran_func_sample(my_dist, a, b, N)
其中,ran_func_sample
是我所追求的,而a, b
是抽取样本的限制. python
中有没有类似的东西?
where ran_func_sample
is what I'm after and a, b
are the limits from which to draw the samples. Is there anything of that sort in python
?
推荐答案
您需要使用逆变换采样方法来获取根据所需定律分布的随机值.使用这种方法,您可以仅应用倒置函数 到在[0,1]区间内具有标准均匀分布的随机数.
You need to use Inverse transform sampling method to get random values distributed according to a law you want. Using this method you can just apply inverted function to random numbers having standard uniform distribution in the interval [0,1].
找到反函数后,您将以明显的方式根据所需的分布获得1000个数字:
After you find the inverted function, you get 1000 numbers distributed according to the needed distribution this obvious way:
[inverted_function(random.random()) for x in range(1000)]
有关逆变换采样的更多信息:
此外,有关该主题的StackOverflow上还有一个很好的问题:
Also, there is a good question on StackOverflow related to the topic:
这篇关于快速任意分布随机抽样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!