Рисовать случайные числа из пользовательской смеси на Matlab? - PullRequest
0 голосов
/ 29 октября 2018

Я хочу генерировать случайные числа из смеси распределений Гамбеля в Matlab, различающихся по местоположению и масштабу. Не могли бы вы посоветовать, как это сделать?


Что я знаю (очень мало)

1) В Matlab есть готовый пакет для рисования из смеси гауссиан. Например,

clear 

rng default

m=-3;

mu_a = [m, m, m];
sigma_a = [1 0.1 0.5; 0.1 10 0.9; 0.5 0.9 20];

mu_b = -mu_a;
sigma_b= sigma_a;

MU = [mu_a;mu_b];
SIGMA = cat(3,sigma_a,sigma_b);
w = [1/2 1/2]; %equal weight 0.5
obj = gmdistribution(MU,SIGMA,w);

N = 10^4; %number draws
values = random(obj,N); 

2) В Matlab есть готовый пакет, который можно извлечь из Gumbel. Смотри здесь

В общем, я не смог найти код Matlab для рисования из пользовательской смеси в Matlab.

1 Ответ

0 голосов
/ 29 октября 2018

Допустим, у вас есть смесь из 3 распределений Гамбеля, каждое со своими mu и sigma и относительными weight (весовая сумма равна 1), так что общее распределение:

weight(1) * Gumbel(mu(1),sigma(1)) + weight(2) * Gumbel(mu(2),sigma(2)) + weight(3) * Gumbel(mu(3),sigma(3))

Затем получение случайного значения из этого распределения является двухэтапным процессом:

  1. Случайно выберите одно из 3 распределений, чтобы нарисовать число.
  2. Произвольно выбрать значение из данного распределения.

Вы можете реализовать это следующим образом:

mu = [1, 2, 3];
sigma = [0.9, 1.5, 2.1];
weight = [1, 2, 1.5]; weight = weight/sum(weight);

k = rand; % a random value in the range [0, 1];
k = find(k < cumsum(weight), 1, 'first');
random_value = evrnd(mu(k), sigma(k)); % Random value from the Gumbel distribution

Вышеприведенное обобщает любое количество распределений и любой тип распределения.

Вы можете векторизовать вышеизложенное для рисования N случайных значений, используя:

N = 100;
k = rand(N,1); % a random value in the range [0, 1];
[~, k] = max(k < cumsum(weight), [], 2); % find doesn't vectorize nicely, this is an ugly workaround...
random_value = evrnd(mu(k), sigma(k)); % N random values from the Gumbel distributions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...