Python で対数正規分布の乱数を生成しようとしています (後の MC シミュレーション用)。パラメーターが少し大きいと、結果がかなり矛盾することがわかりました。
以下では、Normals から (そして Exp を使用して) 一連の LogNormals を、LogNormals から直接生成しています。結果として得られる平均は許容できますが、分散はかなり不正確です。これは、mu = 4,5、... についても当てはまります。
以下のコードを数回再実行すると、まったく異なる結果が返されます。
コード:
import numpy as np
mu = 10;
tmp1 = np.random.normal(loc=-mu, scale=np.sqrt(mu*2),size=1e7)
tmp1 = np.exp(tmp1)
print tmp1.mean(), tmp1.var()
tmp2 = np.random.lognormal(mean=-mu, sigma=np.sqrt(mu*2), size=1e7)
print tmp2.mean(), tmp2.var()
print 'True Mean:', np.exp(0), 'True Var:',(np.exp(mu*2)-1)
これを修正する方法についてアドバイスはありますか?Wakari.ioでもこれを試したので、結果はそこでも一貫しています
更新: ウィキペディアから「真の」平均と分散の式を取得しました: https://en.wikipedia.org/wiki/Log-normal_distribution
結果のスナップショット: 1)
0.798301881219 57161.0894726
1.32976988569 2651578.69947
True Mean: 1.0 True Var: 485165194.41
2)
1.20346203176 315782.004309
0.967106664211 408888.403175
True Mean: 1.0 True Var: 485165194.41
3) n=1e8 乱数の最後のもの
1.17719369919 2821978.59163
0.913827160458 338931.343819
True Mean: 1.0 True Var: 485165194.41