了解 numpy.random.lognormal
Understanding numpy.random.lognormal
我正在将 Matlab 代码(由其他人编写)翻译成 Python。
在 Matlab 代码的一部分中,变量 X_new
被设置为从对数正态分布中得出的值,如下所示:
% log normal distribution
X_new = exp(normrnd(log(X_old), sigma));
即从以log(X_old)
为中心的正态分布中抽取一个随机值,将X_new
设置为e
提升到这个值。
这段代码直接翻译成Python如下:
import numpy as np
X_new = np.exp(np.random.normal(np.log(X_old), sigma))
但是numpy
包括一个可以直接采样的对数正态分布。
我的问题是,后面的代码行是否等同于上面的代码行?
X_new = np.random.lognormal(np.log(X_old), sigma)
我想我必须在这里回答我自己的问题。
根据 np.random.lognormal
的文档,我们有
A variable x has a log-normal distribution if log(x) is normally distributed.
让我们将 Matlab 代码中的 X_new
视为随机变量 x
的特定实例。问题是,log(x)
这里是正态分布的吗?嗯,log(X_new)
就是 normrnd(log(X_old), sigma)
。所以答案是肯定的。
现在让我们转到 Python 代码的第二个版本中对 np.random.lognormal
的调用。 X_new
又是一个随机变量的特定实例,我们可以称之为 x
。 log(x)
这里是正态分布吗?是的,必须是,否则numpy
不会调用这个函数lognormal
。底层正态分布的均值是log(X_old)
,与Matlab代码中正态分布的均值相同。
因此,问题中对数正态分布的所有实现都是等效的(忽略语言之间任何非常低级的实现差异)。
我正在将 Matlab 代码(由其他人编写)翻译成 Python。
在 Matlab 代码的一部分中,变量 X_new
被设置为从对数正态分布中得出的值,如下所示:
% log normal distribution
X_new = exp(normrnd(log(X_old), sigma));
即从以log(X_old)
为中心的正态分布中抽取一个随机值,将X_new
设置为e
提升到这个值。
这段代码直接翻译成Python如下:
import numpy as np
X_new = np.exp(np.random.normal(np.log(X_old), sigma))
但是numpy
包括一个可以直接采样的对数正态分布。
我的问题是,后面的代码行是否等同于上面的代码行?
X_new = np.random.lognormal(np.log(X_old), sigma)
我想我必须在这里回答我自己的问题。
根据 np.random.lognormal
的文档,我们有
A variable x has a log-normal distribution if log(x) is normally distributed.
让我们将 Matlab 代码中的 X_new
视为随机变量 x
的特定实例。问题是,log(x)
这里是正态分布的吗?嗯,log(X_new)
就是 normrnd(log(X_old), sigma)
。所以答案是肯定的。
现在让我们转到 Python 代码的第二个版本中对 np.random.lognormal
的调用。 X_new
又是一个随机变量的特定实例,我们可以称之为 x
。 log(x)
这里是正态分布吗?是的,必须是,否则numpy
不会调用这个函数lognormal
。底层正态分布的均值是log(X_old)
,与Matlab代码中正态分布的均值相同。
因此,问题中对数正态分布的所有实现都是等效的(忽略语言之间任何非常低级的实现差异)。