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

qua*_*ash 1 python numpy logarithm normal-distribution scipy

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

即使该函数的输入是底层正态分布的平均值和标准(我没有),这可以用 numpy.random.lognormal 来完成吗?

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

小智 5

维基百科说,对数正态分布的参数是用基础正态分布来表示的,因此:

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)
Run Code Online (Sandbox Code Playgroud)

通过一些代数,这些可以逆转:

normal_std = np.sqrt(np.log(1 + (lognormal_std/lognormal_mean)**2))
normal_mean = np.log(lognormal_mean) - normal_std**2 / 2
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它们来生成示例。这是一个例子:

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())
Run Code Online (Sandbox Code Playgroud)

在试运行中,输出为 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
Run Code Online (Sandbox Code Playgroud)

我还会检查来源,看看他们是否使用含糊不清的短语“log10mean”来表示“log10ofmean”或“meanoflog10”。如果它是“log10 的平均值”,那么你不需要上面的任何内容;您已经有了基础正态分布的参数,只需将它们乘以 log(10) 即可从 log10 转换为自然分布。