MATLABの特定の範囲の対数正規乱数
-
28-09-2019 - |
質問
範囲[0.42,1.19]の対数正規分布を開発したいと思っています。 D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42]
. 。平均はそうあるべきです 0.84
可能な限り小さい標準偏差。また、CDFの90%(穀物の90%)が間にあることも与えられています。 0.59 and 1.19
.
与えられた条件を組み込んだこの対数正規分布のすべての要素を知ったら、そのPDFを見つけることができます。これが私が試した簡単な手順です:
D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42];
s=0.30; % std dev of the lognormal distribution
m=0.84; % mean of the lognormal distribution
mu=log(m^2/sqrt(s^2+m^2)); % mean of the associated normal dist.
sigma=sqrt(log((s^2/m^2)+1)); % std dev of the associated normal dist.
[r,c]=size(D);
for i=1:c
D_normal(i)=mu+(sigma.*randn(1));
w(i)=(D_normal(i)-mu)/sigma; % the probability or the wt. percentage
end
sizes=exp(D_normal);
解決
統計ツールボックスがあり、lognormal分布からランダムな値を描画する場合は、単に呼び出すことができます lognrnd. 。特定の値で特定の平均とシグマで対数正規分布の密度を知りたい場合は、使用します lognpdf.
重みを計算しているので、密度を探しているかもしれません。あなたの例では、これらは次のとおりです。
weights = lognpdf([1.19,1.00,0.84,0.71,0.59,0.50,0.42],0.84,0.3)
weights =
0.095039 0.026385 0.005212 0.00079218 6.9197e-05 5.6697e-06 2.9244e-07
編集
穀物の割合が0.59〜1.19の範囲にあることを知りたい場合は、使用しています logncdf:
100*diff(logncdf([0.59,1.19],0.84,0.3))
ans =
1.3202
それはあまりありません。分布をプロットすると、値が2を少し上回る対数正規分布がピークに達することに気付くでしょう
x = 0:0.01:10;
figure
plot(x,lognpdf(x,0.84,0.3))
他のヒント
切り捨てられた対数正規数を生成しようとしているようです。私の仮定が正しい場合は、 拒否サンプリング また 逆変換サンプリング 必要なサンプルを生成します。警告:除去サンプリングは、範囲が平均から非常に遠く離れている場合、非常に非効率的です。
拒否サンプリング
x〜lognormal(mu、sigma)i(lb <x <ub)の場合
次に、x〜 lognormal(mu、sigma)を生成し、lb <x <ubの場合は引き分けを受け入れます。
逆変換サンプリング
x〜lognormal(mu、sigma)i(lb <x <ub)の場合、
cdf(x)= phi((log(x) - mu)/sigma)/(phi((log(ub) - mu)/sigma)-phi((log(lb)-mu)/sigma)))
生成、u〜均一(0,1)。
set、cdf(x)= uとxの反転。
言い換えると、
x = exp(mu + sigma * phi_inverse(u *(phi(log(ub) - mu)/sigma)-phi((log(lb)-mu)/sigma))))))