【问题标题】:Get lognormal random number given log10 mean and log10 standard deviation在给定 log10 平均值和 log10 标准差的情况下获取对数正态随机数
【发布时间】:2023-04-23 08:57:02
【问题描述】:

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

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

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

【问题讨论】:

  • 好的,所以你有一个随机变量的分布(我们称之为X),它是对数正态分布的。您有X 的均值和标准差值的以 10 为底的对数:log10(mu)log10(sigma)?鉴于这些,您想从与X 相同的分布中提取更多数字吗?
  • 抱歉@pault 我的意思是我有 log10(X) 的 mu 和 sigma,其中 X 是对数正态分布的随机变量。例如,假设基础物理量是质量并且它是对数正态分布的。我没有给出质量的对数正态 mu 和 sigma,而是给出了 log10(质量)的对数正态 mu 和 sigma。鉴于我有 log10(mass) 的 mu 和 sigma,我可以使用 numpy/scipy 中的什么函数来给我一个质量或 log10(mass) 的对数正态随机值?
  • 这不是一个真正的编程问题,更适合math.stackexchange.com。尝试在那里发帖。一旦你弄清楚它背后的数学原理,你就可以尝试询问如何实现该解决方案。

标签: python numpy scipy normal-distribution logarithm


【解决方案1】:

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 一致。

“对数正态”中的“对数”总是代表自然对数(以 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 转换为自然。

【讨论】:

  • 很酷,谢谢,这很有帮助!实际上,源的意思是“log10 的平均值”,而不是“log10 的平均值”——如有任何混淆,请见谅。
最近更新 更多