Нарисуйте случайные числа из пользовательской функции плотности вероятности в Matlab

Я хочу выбрать R случайные числа из пользовательской функции плотности вероятности в Matlab.

Это выражение функции плотности вероятности, оцененной как x.

введите здесь описание изображения

Я думал об использовании slicesample

R=10^6;
f =  @(x) 1/(2*pi^(1/2))*(1/(x^(3/2)))*exp(-1/(4*x));
epsilon= slicesample(0.3,R,'pdf',f,'thin',1,'burnin',1000);

Однако это не работает, потому что я получаю сообщение об ошибке

Error using slicesample (line 175)
The step-out procedure failed.

Я попытался изменить начальное значение и значения параметров thin и burning, но это не сработало. Не могли бы вы посоветовать, как заставить slicesample работать, или альтернативные решения для выборки случайных чисел из пользовательской функции плотности вероятности в Matlab?


person TEX    schedule 21.05.2020    source источник


Ответы (1)


Пусть X будет случайной величиной, распределенной в соответствии с вашим целевым PDF-файлом. Применяя изменение переменной y = 1 / x и используя известная теорема для функции случайной величины, распределение Y = 1 / X признается как Гамма-распределение с параметрами α = 1/2, β = 1/4.

Следовательно, достаточно создать случайную величину гаммы (используя gamrnd) с теми параметры и возьмем обратное. Обратите внимание, что определение гамма-распределения в Matlab использует параметры A = α, B = 1 / β.

R = 1e5; % desired sample size
x = 1./gamrnd(1/2, 4, [1 R]); % result

Проверять:

histogram(x, 'Normalization', 'pdf', 'BinEdges', 0:.1:10)
hold on
f = @(x) 1/2/sqrt(pi)./x.^(3/2).*exp(-1/4./x); % target pdf
fplot(f, 'linewidth', .75)

введите здесь описание изображения

person Luis Mendo    schedule 21.05.2020