获取给定 log10 均值和 log10 标准差的对数正态随机数

Get lognormal random number given log10 mean and log10 standard deviation

我得到了 对数正态分布 的 log10 均值和 log10 标准差。我想从这个对数正态分布中得到一个随机数。

即使该函数的输入是基础正态分布的均值和标准(我没有),这可以用 numpy.random.lognormal 实现吗?

另外,我从函数返回的随机数是 log10、自然对数还是正则数?

Wikipedia 表示对数正态分布的参数用基础正态分布表示,因此:

lognormal_mean = np.exp(normal_mean + normal_std**2 / 2)
lognormal_std = np.sqrt(np.exp(normal_std**2) - 1) * np.exp(normal_mean + normal_std**2 / 2)

用一点代数就可以把它们颠倒过来:

normal_std = np.sqrt(np.log(1 + (lognormal_std/lognormal_mean)**2))
normal_mean = np.log(lognormal_mean) - normal_std**2 / 2

然后您可以使用这些来生成样本。这是一个例子:

lognormal_mean = 3
lognormal_std = 5
normal_std = np.sqrt(np.log(1 + (lognormal_std/lognormal_mean)**2))
normal_mean = np.log(lognormal_mean) - normal_std**2 / 2
sample = np.random.lognormal(normal_mean, normal_std, size=10000000)
print(sample.mean(), sample.std())

在试验中 运行,输出为 3.00126241708、4.99737569477 - 与参数 3、5 一致。

"lognormal"中的"log"始终代表自然对数(以e为底),所以这就是你将得到的。

最后,如果您的输入数据是 log10(lognormal_mean) 和 log10(lognormal_std) 那么第一步就是

lognormal_mean = 10**log10_lognormal_mean_
lognormal_std = 10**log10_lognormal_std

我还会检查来源,看看他们是否使用模棱两可的短语 "log10 mean" 表示 "log10 of mean" 或 "mean of log10"。如果是 "mean of log10" 那么你不需要上面的任何东西;您已经有了基本正态分布的参数,只需将它们乘以 log(10) 即可从 log10 转换为自然分布。