理解 numpy.random.lognormal

dbl*_*iss 5 python matlab numpy normal-distribution natural-logarithm

我正在将 Matlab 代码(由其他人编写)翻译为 Python。

在 Matlab 代码的一部分中,变量X_new被设置为从对数正态分布中得出的值,如下所示:

% log normal distribution
X_new = exp(normrnd(log(X_old), sigma));
Run Code Online (Sandbox Code Playgroud)

也就是说,从以 为中心的正态分布中抽取一个随机值log(X_old),并将X_new其设置为e提高到该值。

这段代码直接翻译成Python如下:

import numpy as np


X_new = np.exp(np.random.normal(np.log(X_old), sigma))
Run Code Online (Sandbox Code Playgroud)

numpy包括可以直接采样的对数正态分布。

我的问题是,下面的代码行与上面的代码行等效吗?

X_new = np.random.lognormal(np.log(X_old), sigma)
Run Code Online (Sandbox Code Playgroud)

dbl*_*iss 4

我想我必须在这里回答我自己的问题。

从 的文档中np.random.lognormal,我们有

如果 log(x) 服从正态分布,则变量 x 具有对数正态分布。

让我们将X_newMatlab 代码视为随机变量的特定实例x。问题是,log(x)这里是正态分布吗?嗯,log(X_new)只是normrnd(log(X_old), sigma)。所以答案是肯定的。

现在让我们转向np.random.lognormal第二个版本的 Python 代码中的调用。 X_new又是一个随机变量的特定实例,我们可以称之为xlog(x)正常分布在这里吗?是的,必须是,否则numpy不会调用这个函数lognormal。底层正态分布的均值log(X_old)与Matlab代码中正态分布的均值相同。

因此,问题中对数正态分布的所有实现都是等效的(忽略语言之间任何非常低级的实现差异)。