我有一个参数X,它是对数正态分布的,平均值为15,标准差为0.48。对于MATLAB中的蒙特卡罗模拟,我想从这个分布中生成40,000个样本。如何在MATLAB中完成?
答案 0 :(得分:2)
要使用参数M
和N
生成mu
x sigma
矩阵的日志分布随机数,请使用lognrnd
(统计工具箱):
result = lognrnd(mu,sigma,M,N);
如果您没有统计工具箱,则可以等效地使用randn
,然后取指数。根据定义,对数正态随机变量的对数是一个正态的随机变量:
result = exp(mu+sigma*randn(M,N));
对数正态分布的参数mu
和sigma
是相关正态分布的均值和标准差。要了解对数正态分布的均值和标准偏差如何与参数mu
,sigma
相关,请参阅lognrnd
documentation。
答案 1 :(得分:0)
要生成随机样本,您需要反转cdf。如果你这样做了,生成样本只不过是' my_icdf(rand(n,m))'
首先获取cdf(集成pdf),然后反转函数以获得反转的cdf。
答案 2 :(得分:0)
您可以使用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;