4

我正在将 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)
4

1 回答 1

4

我想我将不得不在这里回答我自己的问题。

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

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

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

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

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

于 2016-03-14T05:11:34.323 回答