如何基于任意离散分布生成数字?
例如,我有一组要生成的数字。假设它们从1-3标记如下。
1:4%,2:50%,3:46%
基本上,百分比是它们将出现在随机数生成器的输出中的概率。我有一个伪随机数生成器,它将在间隔[0,1]中生成均匀分布。有什么办法吗?
我可以拥有多少个元素没有限制,但是%总计为100%。
如何基于任意离散分布生成数字?
例如,我有一组要生成的数字。假设它们从1-3标记如下。
1:4%,2:50%,3:46%
基本上,百分比是它们将出现在随机数生成器的输出中的概率。我有一个伪随机数生成器,它将在间隔[0,1]中生成均匀分布。有什么办法吗?
我可以拥有多少个元素没有限制,但是%总计为100%。
Answers:
从离散分布采样的最佳算法之一是别名方法。
别名方法(有效地)预先计算二维数据结构,以将矩形划分为与概率成比例的区域。
在从被引用的网站这个示意图,单元高度的矩形已经被划分为四种区域-通过颜色区分-在比例,1 / 3,1 / 12,和1 / 12,在为了从具有这些概率的离散分布中重复采样。垂直条具有恒定的(单位)宽度。每个都分为一两部分。件的标识和垂直分隔的位置存储在可通过列索引访问的表中。
该表可以通过两个简单步骤(每个坐标一个)进行采样,只需生成两个独立的统一值并进行计算。如此处其他答复中所述,这改善了反转离散CDF所需的O (log (n ))计算。
您可以在R中轻松完成此操作,只需指定所需的大小即可:
sample(x=c(1,2,3), size=1000, replace=TRUE, prob=c(.04,.50,.46))
在您的示例中,假设您绘制了伪随机Uniform [0,1]值并将其命名为U。然后输出:
如果U <0.04,则为1
如果U> = 0.04并且U <0.54,则为2
如果U> = 0.54,则为3
如果指定的百分比是a,b,...,则只需输出
如果U则为1
如果U> = a并且U <(a + b)则值为2
等等
本质上,我们将%映射到[0,1]的子集中,并且我们知道统一随机值落入任何范围的概率就是该范围的长度。排列范围似乎是最简单的方法,即使不是唯一的方法。假设您仅询问离散分布;对于连续性,可以执行“拒绝采样”之类的操作(Wikipedia条目)。
假设有可能的离散结果。你瓜分间隔[ 0 ,1 ]到基于累积概率密度函数,子区间˚F,得到分割(0 ,1 )的间隔
其中和˚F (0 )≡ 0。在您的示例中m = 3并且
因为和F (2 )= .54和F (3 )= 1。
然后,您可以使用以下算法生成具有分布F的:
(1)生成
(2)如,则X = Ĵ。
TRUE
FALSE
FALSE
注意,将在时间间隔中的恰好一个我Ĵ,因为它们是不相交的和分区[ 0 ,1 ]。
min(which(u < cp))
?也最好避免在每次调用时重新计算累积和。使用该预先计算的方法,整个算法将简化为min(which(runif(1) < cp))
。或者更好,因为OP要求生成数字(复数),所以将其向量化为n<-10; apply(matrix(runif(n),1), 2, function(u) min(which(u < cp)))
。
I had the same problem. Given a set where each item has a probability and whose items' probabilities sum up to one, I wanted to draw a sample efficiently, i.e. without sorting anything and without repeatedly iterating over the set.
The following function draws the lowest of uniformly distributed random numbers within the interval . Let be a random number from .
You can use this function to draw an ascending series of uniformly distributed random numbers in [0,1). Here is an example with :
While drawing that ascending series of uniformly distributed numbers, iterate over the set of probabilities which represents your arbitraty (yet finite) distribution. Let be the iterator and . After drawing , increment zero or more times until . Then add to your sample and move on with drawing .
Example with the op's set and sample size :
i a_i k Sum Draw 0 0.031 0 0.04 1 1 0.200 1 0.54 2 2 0.236 1 0.54 2 3 0.402 1 0.54 2 4 0.488 1 0.54 2 5 0.589 2 1.0 3 6 0.625 2 1.0 3 7 0.638 2 1.0 3 8 0.738 2 1.0 3 9 0.942 2 1.0 3
Sample:
If you wonder about the function: It is the inverse of the probability that one of uniformly distributed random numbers lies within the interval with .