【问题标题】:Random samples from Lognormal distribution对数正态分布的随机样本
【发布时间】:2014-07-13 17:40:19
【问题描述】:

我有一个对数正态分布的参数 X,均值为 15,标准差为 0.48。对于 MATLAB 中的蒙特卡罗模拟,我想从这个分布中生成 40,000 个样本。如何在 MATLAB 中完成?

【问题讨论】:

  • 你试过了吗?

标签: matlab random statistics distribution


【解决方案1】:

要生成随机样本,您需要反转 cdf。如果你这样做了,生成样本无非就是 'my_icdf(rand(n, m))'

先得到cdf(对pdf进行积分),然后反转函数得到反转后的cdf。

【讨论】:

  • 我尝试了这段代码,它也给了我由 lognrnd 命令产生的类似结果。很好还是我错过了什么?米 = 15; v = 0.48; mu = log((m^2)/sqrt(v+m^2)); sigma = sqrt(log(v/(m^2)+1)); u = 兰德(1000,1); x = logninv(u,mu,sigma); hist(x,50);
【解决方案2】:

要生成带有参数musigma 的对数分布随机数MxN 矩阵,请使用lognrnd(统计工具箱):

result = lognrnd(mu,sigma,M,N);

如果您没有统计工具箱,您可以等效地使用randn,然后取指数。这利用了这样一个事实,即根据定义,对数正态随机变量的对数是正态随机变量:

result = exp(mu+sigma*randn(M,N));

对数正态分布的参数musigma是相关正态分布的均值和标准差。要了解对数正态分布的均值和标准差如何与参数musigma 相关,请参阅lognrnd documentation

【讨论】:

  • 我尝试了 lognrnd 命令,首先计算文档中给出的 mu 和 sigma。但直方图始终是正态分布。但是,当我绘制 pdf (mean=15, st.deviation=0.48) 时,它显示出左偏对数正态分布。为什么随机数的pdf和直方图有不同的形状?
  • @fani 你如何绘制 pdf 和直方图?例如hist(lognrnd(0,1,1e5,1),50);。这给出了具有预期形状的直方图
  • 是的,没问题。但问题是以下代码产生正态分布,而不是对数正态分布。您能否检查此代码并指出问题,m = 15; v = 0.48; mu = log((m^2)/sqrt(v+m^2)); sigma = sqrt(log(v/(m^2)+1)); hist(lognrnd(mu,sigma,1,1e5),50);
  • @fani 没错。这是对数正常的。具有小方差的对数正态类似于正态。尝试增加方差(例如v=10),你会发现它有点歪
【解决方案3】:

您可以使用formulas 在对数正态分布的均值和方差及其对应于相关正态(高斯)分布的参数 (mu,sigma) 之间进行转换。

以下方法使用 MATLAB 2013a 中引入的概率分布对象。更具体地说,它使用makedistrandompdf 函数。

% Notation
% if X~Lognormal(mu,sigma) the E[X] = m & Var(X) = v
m = 15;     % Target mean for Lognormal distribution
v = 0.48;   % Target variance Lognormal distribution
getLmuh=@(m,v) log(m/sqrt(1+(v/(m^2))));
getLvarh=@(m,v) log(1 + (v/(m^2)));
mu = getLmuh(m,v);
sigma = sqrt(getLvarh(m,v));

% Generate Random Samples
pd = makedist('Lognormal',mu,sigma);
X = random(pd,1000,1);                  % Generates a 1000 x 1 vector of samples

您可以通过meanvar函数和分发对象来验证正确性:

>> mean(pd)
ans =
    15
>> var(pd)
ans =
    0.4800

使用icdf(逆CDF)函数也可以轻松地通过inverse transform 生成样本。

% Alternate way to generate X~Lognormal(mu,sigma)
U = rand(1000,1);       % U ~ Uniform(0,1)
X = icdf(pd,U);         % Inverse Transform

由以下代码(MATLAB 2018a)生成的图形。

Xrng = [0:.01:20]';
figure, hold on, box on
h(1) = histogram(X,'DisplayName','Random Sample (N = 1000)');
h(2) = plot(Xrng,pdf(pd,Xrng),'b-','DisplayName','Theoretical PDF');
legend('show','Location','northwest')
title('Lognormal')
xlabel('X')
ylabel('Probability Density Function')
% Options
h(1).Normalization = 'pdf';
h(1).FaceColor = 'k';
h(1).FaceAlpha = 0.35;
h(2).LineWidth = 2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多