Логнормальные случайные числа в определенном диапазоне в Matlab

Я хочу разработать логнормальное распределение с диапазоном [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);

person Community    schedule 18.06.2010    source источник
comment
Я бы посоветовал добавить код, который у вас есть, к вашему вопросу. Это поможет нам лучше помочь вам.   -  person gnovice    schedule 18.06.2010
comment
Пожалуйста, отформатируйте опубликованный код - вы можете сделать это, выделив и нажав кнопку «нули и единицы».   -  person Doresoom    schedule 18.06.2010


Ответы (2)


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

ИЗМЕНИТЬ

Если вы хотите узнать, какой процент зерен попадает в диапазон от 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))
person Jonas    schedule 18.06.2010
comment
Благодарю за ваш ответ. Я не хочу выбирать случайное значение из размеров зерен, то есть из логнормального распределения. Мне нужна вероятность их появления с учетом их среднего и стандартного отклонения, а также с учетом диапазона распределения. Кроме того, я знаю, что 90% зерен (по весу) имеют размер от 1,19 до 0,59, а остальные - от 0,59 до 0,42 размера зерна. - person ; 18.06.2010
comment
@Harpreet: Вы смотрели мою правку? Вы построили график распределения? Максимальное значение логнормального распределения составляет exp(0.84), а не 0,84, и, таким образом, только 1,3% значений попадают в диапазон, в котором вы ожидаете 90%. Кроме того, что вы имеете в виду под вероятностью происшествий? Если это значение функции плотности вероятности, то есть вероятность получения определенного значения из распределения, я уже рассчитал это для вас как weights. - person Jonas; 18.06.2010
comment
Йонас, я посмотрел на все, что ты сказал. Я имею в виду pdf (когда я сказал вероятность возникновения). На самом деле я не вижу никаких признаков логнормального распределения в данных. По форме это больше похоже на зигзагообразный шум. Как происходит пик при exp (0,84)? Разве это не должно быть log (0.84)? Чтобы избежать дальнейшего усложнения коммуникации, мой вопрос: я хочу разработать логнормальное распределение с диапазоном [0.30,1.19], несколько элементов которого даны в 'D'. Среднее значение должно быть 0,84, а стандартное отклонение как можно меньше. Также указано, что 90% cdf находится между 0,59 и 1,19. - person ; 18.06.2010

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

Выборка отклонения

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

Затем сгенерируйте x ~ LogNormal (mu, sigma) и примите розыгрыш, если lb ‹x‹ ub.

Выборка с обратным преобразованием

Если x ~ LogNormal (mu, sigma) I (lb ‹x‹ ub), то

CDF (x) = phi ((log (x) - mu) / sigma) / (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - mu) / sigma))

Сгенерируйте u ~ Uniform (0,1).

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

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

x = ехр (mu + sigma * phi_inverse (u * (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - mu) / sigma))))

person vad    schedule 18.06.2010
comment
Мое логнормальное распределение усечено. Приведенные здесь размеры зерна взяты из всего имеющегося образца. Хотя размеры зерен соответствуют логнормальному распределению, я не уверен, будут ли эти усеченные значения из всей партии соответствовать тому же распределению. Я не хочу, чтобы мои случайные числа были усечены. Они должны быть от 0 до 1, что соответствует моему процентному содержанию по весу. - person ; 18.06.2010
comment
Вам следует подумать об использовании стандартной терминологии, чтобы избежать путаницы. Когда вы говорите весовые проценты, вы имеете в виду вероятность того, что размер зерна находится между двумя значениями, или вы имеете в виду pdf, связанный с определенным размером зерна? Вы говорите, что ваше распределение усечено, но затем в предпоследней строке вы говорите, что не хотите, чтобы ваши случайные числа были усечены. Это противоречивые утверждения. - person vad; 18.06.2010
comment
Я имею в виду pdf, связанный с определенным размером зерна. Я хочу, чтобы все мои случайные числа (pdf) были сгенерированы, учитывая, что данное распределение завершено. Хотя можно добавить больше значений ВНУТРИ распределения (не за пределами заданного диапазона), но я не знаю, как это сделать. - person ; 18.06.2010
comment
В этом случае вы должны сделать то, что предложил Йонас. Если вы хотите, чтобы ваш PDF-файл был усеченным логнормальным, вычислите PDF-файл, как предлагает Джонас, но затем разделите его на значение на (phi ((log (ub) - mu) / sigma) - phi ((log (lb) - му) / сигма)) - person vad; 18.06.2010
comment
Извините, но я не знаю, что такое «фи», «уб» и «фунт». Вы можете сказать, что это такое? - person ; 18.06.2010
comment
phi - normalcdf со средним значением 0 и std dev 1. lb и ub - это нижняя и верхняя границы для вашей случайной переменной. - person vad; 18.06.2010