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)
用一点代数,这些可以颠倒过来:
^{pr2}$
然后你可以用这些来生成一个样本。下面是一个例子: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”。如果它是“log10的平均值”,那么您不需要上面的任何东西;您已经有了基本正态分布的参数,它们只需要乘以log(10)就可以从log10转换为自然分布。在