Логнормальные случайные числа в определенном диапазоне в Matlab - PullRequest
0 голосов
/ 18 июня 2010

Я хочу разработать логнормальное распределение с диапазоном [0.42,1.19], несколько элементов которого заданы как D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42].Среднее значение должно составлять 0.84, а стандартное отклонение должно быть как можно меньше.Также с учетом того, что 90% cdf (= 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);

Ответы [ 2 ]

1 голос
/ 18 июня 2010

Если у вас есть набор инструментов статистики и вы хотите извлечь случайные значения из логнормального распределения, вы можете просто позвонить LOGNRND . Если вы хотите узнать плотность логнормального распределения с заданным средним значением и сигмой при конкретном значении, вы используете 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

EDIT

Если вы хотите узнать, какой процент зерен попадает в диапазон от 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))
0 голосов
/ 18 июня 2010

Похоже, вы ищете для генерирования усеченных логнормальных случайных чисел. Если мое предположение верно, вы можете использовать выборку отклонения или выборку обратного преобразования , чтобы сгенерировать необходимые выборки. Предостережение: выборка отклонения очень неэффективна, если ваши границы очень далеки от среднего.

Отбор проб

Если x ~ LogNormal (mu, sigma) I (lb

Затем сгенерируйте x ~ LogNormal (mu, sigma) и примите ничью, если lb

Выборка обратного преобразования

Если x ~ LogNormal (mu, sigma) I (lb

CDF (x) = фи ((log (x) - му) / сигма) / (фи ((log (ub) - му) / сигма) - фи ((log (фунт) - му) / сигма) ) * * тысяча двадцать-один

Generate, u ~ Uniform (0,1).

Set, CDF (x) = u и инвертировать для x.

Другими словами,

x = exp (mu + сигма * phi_inverse (u * (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - mu) / sigma))))

...