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 转换为自然分布。