4

私は Matlab コード (他の誰かによって書かれた) を Python に翻訳しています。

Matlab コードの 1 つのセクションでは、変数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 コードの 2 番目のバージョンの への呼び出しに移りましょう。X_newも、 と呼ぶことができる確率変数の特定のインスタンスですx。ここではlog(x)通常配布されていますか?はい、そうでなければなりません。そうでなければ、numpyこの関数は呼び出されませんlognormal。基になる正規分布log(X_old)の平均は、Matlab コードの正規分布の平均と同じです。

したがって、問題の対数正規分布のすべての実装は同等です(言語間の非常に低レベルの実装の違いは無視します)。

于 2016-03-14T05:11:34.323 に答える