从逻辑分布中生成样本

5
我正在编写一些统计代码并探索从随机分布中创建样本的不同方法 - 从生成0到1之间的均匀浮点值的随机数生成器开始。
我知道可以通过将足够数量的独立、同分布均匀随机变量相加(通过中心极限定理)生成近似的正态分布样本。
是否有类似的方法可以创建逻辑分布的样本?我假设需要对要添加的样本进行加权或相关处理,以避免最终得到正态分布。
附注:我也知道可能有更有效的生成随机样本的方法,我提出这个问题是因为我更想了解这样一个生成器如何工作,而不是效率。
3个回答

12

逆逻辑分布很容易找到,所以您可以使用逆变换抽样。基本算法如下:

for each random variate x ~ logistic
  generate a random variate y ~ Uniform(0, 1)
  x := F^-1 (y)

F^-1是logistic函数的反向累积分布函数,或者说是所需分布的反向累积分布函数。 大多数编程语言都可以通过某种随机函数生成介于0和1之间的均匀分布变量。

以下是一些 Python 代码,可以生成1000个来自 logistic 分布的随机变量:

from random import random
import math
import pylab

loc, scale = 0, 1

randvars = []
for i in range(1000):
    x = random()
    y = loc + scale * math.log(x / (1-x))
    randvars.append(y)

pylab.hist(randvars)

谢谢,这是一个很好的答案。你不知道是否有一种方法可以通过将不同均匀值的总和相加来获得逻辑分布,而不使用 c.d.f. 吗? - mikera
抱歉,我不知道其他的方法。 - ars
这不是数值精确的。在进行反变换采样时,您经常需要使用数值优化来纠正值。在这种情况下,算法将非常低效。 - Neil G

6

对于大多数感兴趣的分布,有一种非常常见的创建随机数的方法,即逆 cdf 方法。

首先,为所讨论的分布生成一个累积分布函数的逆函数 - 由于 cdf 是一个将值映射到 [0,1] 的函数,它接受分布域中的值,并将它们映射到具有适当概率的分布域中的值。很多常见的分布都有解析求得的逆 cdf,但如果你的分布难以处理或是近似的,可以创建一个近似的数值逆 cdf。

其次,使用任何好的随机数生成器,生成在 [0,1] 上均匀分布的数字,并通过逆 cdf 运行其输出。现在输出遵循你开始的分布。

logistic 分布的逆 cdf 可在此处找到。


2

物流分布是两个Gumbel分布的差,其变量是指数变量的负对数或等效地 log(u/(1.0 - u)) ,其中 u 是均匀变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接