我得到了对数正态分布的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),因此这就是你将得到的。
最后,如果您的输入数据是log 10(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转换为自然。