Допустим, у вас есть смесь из 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))
Затем получение случайного значения из этого распределения является двухэтапным процессом:
- Случайно выберите одно из 3 распределений, чтобы нарисовать число.
- Произвольно выбрать значение из данного распределения.
Вы можете реализовать это следующим образом:
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