【发布时间】:2014-07-13 17:40:19
【问题描述】:
我有一个对数正态分布的参数 X,均值为 15,标准差为 0.48。对于 MATLAB 中的蒙特卡罗模拟,我想从这个分布中生成 40,000 个样本。如何在 MATLAB 中完成?
【问题讨论】:
-
你试过了吗?
标签: matlab random statistics distribution
我有一个对数正态分布的参数 X,均值为 15,标准差为 0.48。对于 MATLAB 中的蒙特卡罗模拟,我想从这个分布中生成 40,000 个样本。如何在 MATLAB 中完成?
【问题讨论】:
标签: matlab random statistics distribution
要生成随机样本,您需要反转 cdf。如果你这样做了,生成样本无非就是 'my_icdf(rand(n, m))'
先得到cdf(对pdf进行积分),然后反转函数得到反转后的cdf。
【讨论】:
要生成带有参数mu 和sigma 的对数分布随机数MxN 矩阵,请使用lognrnd(统计工具箱):
result = lognrnd(mu,sigma,M,N);
如果您没有统计工具箱,您可以等效地使用randn,然后取指数。这利用了这样一个事实,即根据定义,对数正态随机变量的对数是正态随机变量:
result = exp(mu+sigma*randn(M,N));
对数正态分布的参数mu和sigma是相关正态分布的均值和标准差。要了解对数正态分布的均值和标准差如何与参数mu、sigma 相关,请参阅lognrnd documentation。
【讨论】:
hist(lognrnd(0,1,1e5,1),50);。这给出了具有预期形状的直方图
v=10),你会发现它有点歪
您可以使用formulas 在对数正态分布的均值和方差及其对应于相关正态(高斯)分布的参数 (mu,sigma) 之间进行转换。
以下方法使用 MATLAB 2013a 中引入的概率分布对象。更具体地说,它使用makedist、random 和pdf 函数。
% 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
您可以通过mean和var函数和分发对象来验证正确性:
>> 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;
【讨论】: