【问题标题】:Generate logormal random numbers within range matlab在matlab范围内生成对数随机数
【发布时间】:2016-05-09 20:06:54
【问题描述】:

我们有遵循对数正态分布的数据,知道它的平均值 = 5.0163 和标准偏差 = 1.0571 我们想要生成并绘制 n (6000) 个样本在范围内 (3:7.9) 遵循与蒙特卡罗方法相同的分布 我们有这段代码,但它没有输出所需范围内的样本(所有样本都小于下限)

Data = [ 3 3 3 3 3.3 3.3 3.6 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 4.2 4.2 4.2 4.2 4.2 4.2 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.8 4.8 4.8 4.8 4.8 4.8 4.8 4.8 4.8 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.7 6 6 6 6 6 6 6 6 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.6 6.6 6.6 6.6 6.9 6.9 6.9 7.8];
%draw Lognormal Fit of the data
histfit(Data,[],'lognormal');
% lognormal curve parameters
LN = lognfit(Data);
m=LN(1);
s=LN(2);
% mean and stanard diviation of the associated normal dist.
mu=log(m^2/sqrt(s^2+m^2));
sigma=sqrt(log((s^2/m^2)+1));
%generate random numbers
for i = 1 : 100
X = lognrnd(mu,sigma)
if ((X>=3)&&(X<=7.9))
 X;
end
end

【问题讨论】:

标签: matlab


【解决方案1】:

无法保证来自Lognormal distribution 的样本会落在某个(有限)范围内,因为对分布的支持是无限的(所有正实数)。但是,我们可以调用 MATLAB 的truncate 函数来轻松处理这个问题(见下文)。

参数化:注意如果 X ~ Normal(mu,sigma),那么如果 Y = ln(X),Y ~ Lognormal(mu,sigma)。因此,对数正态通常由相关的正态分布参数化。均值,E[Y] 等于 mu。

下面的代码说明了这一点。

mu = 5; 
sigma = 1;
pd = makedist('Lognormal',mu,sigma)
Y = random(pd,50000,1);                 % 50000 Lognormal samples
X = log(Y);  

>> mean(X)                              
ans =
    4.9922
>> std(X)
ans =
    1.0007

对范围 [a,b] 的限制:
给定通过拟合对数正态获得的参数 mu 和 sigma,然后限制到给定的区间,[a,b] 对于 MATLAB 的概率分布对象(在 R2013a 中引入)很简单。

mu = 2.5;       % Assume mu & sigma found from fitting 
sigma = 1.4;
pd = makedist('Lognormal',mu,sigma);    % Creates the Lognormal distribution object

a = 10;
b = 100;
N = 10000;
pdT = truncate(pd,a,b);              % Truncates to the interval [a,b]

Y = random(pdT,N,1);                 % Generate samples from truncated Lognormal

区别很明显。

W = random(pd,N,1);                  % Generate samples from Lognormal 

figure
s(1) = subplot(2,1,1)
histogram(Y,'Normalization','pdf')
xlim([0,125])
s(2) = subplot(2,1,2)
histogram(W,'Normalization','pdf','FaceColor','g','FaceAlpha',0.35)
xlim([0 125])
title(s(2),'Lognormal(\mu=2.5,\sigma=1.4)')
title(s(1),'Lognormal(\mu=2.5,\sigma=1.4) truncated to [10,100]')

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 2010-12-24
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多