Нарисуйте случайные числа из заранее определенной функции вероятности массы в Matlab - PullRequest
2 голосов
/ 29 октября 2019

У меня есть поддержка (supp_epsilon) и функция вероятности (pr_mass_epsilon) в Matlab, построенная следующим образом.

supp_epsilon=[0.005 0.01 0.015 0.02]; 

suppsize_epsilon=size(supp_epsilon,2);

pr_mass_epsilon=zeros(suppsize_epsilon,1);

alpha=1;
beta=4;

for j=1:suppsize_epsilon
    pr_mass_epsilon(j)=betacdf(supp_epsilon(j),alpha,beta)/sum(betacdf(supp_epsilon,alpha,beta));
end

Обратите внимание, что компоненты pr_mass_epsilon суммируют до 1. Теперь я хочу нарисовать n случайных чисел из pr_mass_epsilon. Как я могу это сделать? Я хотел бы код, который работает для любого suppsize_epsilon.

1 Ответ

4 голосов
/ 29 октября 2019

Использование набора инструментов статистики

Функция randsample может делать это напрямую:

result = randsample(supp_epsilon, n, true, pr_mass_epsilon);

Без использования наборов инструментов

Ручной подход:

  1. Создание n выборок равномерной случайной величины в интервале (0,1).
  2. Сравнение каждой выборки с функцией распределения (накопленной суммой функции массы).
  3. Посмотрите, в каком интервале функции распределения находится каждая однородная выборка.
  4. Индекс в массив возможных значений

result = supp_epsilon(sum(rand(1,n)>cumsum(pr_mass_epsilon(:)), 1)+1);

Для вашего примера, с n=1e6 любой из двух подходов дает гистограмму, подобную этой:

histogram(result, 'normalization', 'probability')

enter image description here

...