2017-12-28 38 views
0

log10平均とlog10の標準偏差はlog-normalの分布となります。私はこの対数正規分布から乱数を得たいと思う。log10平均とlog10標準偏差が与えられたlognormal乱数を得る

この関数の入力はの平均値と標準のディストリビューションの平均値と標準値ですが、numpy.random.lognormalでこれを行うことはできますか?

また、関数から戻ってくる乱数は、log10、natural log、regularのいずれになりますか?

+0

[OK]をクリックすると、正規分布で分布する確率変数(Xと呼ぶ)の分布が得られます。 log10(mu)とlog10(sigma)の平均と標準偏差の値のログベースが10です。これらのことを考えると、同じディストリビューションから 'X 'という数字を多く引き出したいでしょうか? – pault

+0

申し訳ありません@pault私は、log10(X)のmuとsigmaがあることを意味します。ここで、Xは対数正規分布の確率変数です。一例として、基礎となる物理量が質量であり、対数正規分布であると仮定する。質量の対数正規関数μとシグマを与えられる代わりに、log10(質量)の対数正規μとシグマが与えられます。私がlog10(質量)のmuとsigmaを持っているとすれば、numpy/scipyのどのような関数を使って、質量またはlog10(質量)の対数正規乱数値を与えることができますか? – quantumflash

+0

これは実際にプログラミングに関する質問ではなく、https://math.stackexchange.com/より適しています。そこに投稿してみてください。その背後にある数学を理解すれば、ソリューションの実装方法を尋ねることができます。 – pault

答えて

1

Wikipediaは対数正規分布のパラメータは、このように基本的な正規分布で表現されていることを述べている:

lognormal_mean = np.exp(normal_mean + normal_std**2/2) 
lognormal_std = np.sqrt(np.exp(normal_std**2) - 1) * np.exp(normal_mean + normal_std**2/2) 

代数のビットでこれら逆転させることができます。

normal_std = np.sqrt(np.log(1 + (lognormal_std/lognormal_mean)**2)) 
normal_mean = np.log(lognormal_mean) - normal_std**2/2 

そして、あなたのことができこれらを使用してサンプルを生成します。ここでは一例です:試運転で

lognormal_mean = 3 
lognormal_std = 5 
normal_std = np.sqrt(np.log(1 + (lognormal_std/lognormal_mean)**2)) 
normal_mean = np.log(lognormal_mean) - normal_std**2/2 
sample = np.random.lognormal(normal_mean, normal_std, size=10000000) 
print(sample.mean(), sample.std()) 

、出力は3.00126241708、4.99737569477だった - パラメータ3との合意では、5

常に自然対数を意味し、「対数正規」の「ログイン」 (ベースe)、これはあなたが得るものです。あなたの入力データが、その後のlog10(lognormal_mean)とのlog10(lognormal_std)であれば

最後に、最初のステップは、彼らがあいまいなフレーズを使用している場合、私はまた見つけるためにソースをチェックします

lognormal_mean = 10**log10_lognormal_mean_ 
lognormal_std = 10**log10_lognormal_std 

だろう「log10平均」は「平均のlog10」または「log10の平均」を意味する。それが「log10の平均」だった場合は、上記の必要はありません。基本的な正規分布のパラメータをすでに持っているので、log10からnaturalに変換するにはlog(10)を乗算するだけです。

+0

これは非常に役に立ちます。実際、ソースは「log10の平均」を意味するものであり、「log10の平均」の意味ではありません。混乱して申し訳ありません。 – quantumflash

関連する問題