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);
解决方案
如果您有统计工具箱,并且要从日志正态分布中绘制随机值,则可以调用 lognrnd. 。如果您想以特定值以给定的平均值和sigma了解对数正态分布的密度,则使用 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))
其他提示
看来您正在寻找生成截断的log normal随机数。如果我的假设是正确的,则可以使用 拒绝采样 或者 逆变换采样 生成必要的样品。警告:如果您的界限远离平均值,拒绝采样效率非常低。
拒绝采样
如果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(log) - mu)/sigma) - phi((log(log(lb) - mu)/sigma)))
生成,U〜统一(0,1)。
设置,cdf(x)= u,x倒置。
换句话说,
x = exp(mu + sigma * phi_inverse(u *)