Как вы генерируете случайные числа из бимодальной гауссовской функции плотности вероятности в MATLAB?
Как вы генерируете числа из бимодального гауссова PDF в MATLAB?
Для унимодального симметричного гауссовского PDF это действительно просто:
x=randn(1000,1);
Но теперь я хочу нарисовать 1000 чисел из гауссовского PDF, который имеет два пика (или два средних). Как мне это сделать?
2 ответа
Вы можете сгенерировать бимодальное нормальное (гауссово) распределение, комбинируя два нормальных распределения с различным средним и стандартным отклонением (как объяснено в этом комментарии).
В MATLAB вы можете сделать это несколькими способами:
Для начала нам нужно указать среднее значение (mu
) и стандартное отклонение (sigma
), которые характеризуют наши нормальные распределения, обычно отмечаются как N(mu, sigma)
,
Нормальное распределение: N(-1, 0.5)
mu_a = -1; % Mean (a).
sigma_a = 0.5; % Standard deviation (a).
Нормальное распределение б: N(2, 1)
mu_b = 2; % Mean (b).
sigma_b = 1; % Standard deviation (b).
Наконец, давайте определим размер наших случайных векторов:
sz = [1e4, 1]; % Size vector.
Теперь давайте сгенерируем бимодальные случайные значения путем объединения двух векторов нормально распределенных случайных чисел:
ВАРИАНТ 1: использование randn
x_1 = [sigma_a*randn(sz) + mu_a, sigma_b*randn(sz) + mu_b];
ВАРИАНТ 2: использование normrnd
x_2 = [normrnd(mu_a, sigma_a, sz), normrnd(mu_b, sigma_b, sz)];
ВАРИАНТ 3: использование random
x_3 = [random('Normal', mu_a, sigma_a, sz), random('Normal', mu_b, sigma_b, sz)];
Давайте представим результаты:
subplot(1, 3, 1); histogram(x_1);
subplot(1, 3, 2); histogram(x_2);
subplot(1, 3, 3); histogram(x_3);
Я предлагаю вам альтернативу, которая использует gmdistribution:
% Means (X1 -> -0.5 and X2 -> 1.2)
m = [-0.5; 1.2];
% Standard Deviations (X1 -> 2.1 and X2 -> 1.3)
s = cat(3,2.1,1.3);
% Weights (X1 and X2 Equally Weighted 0.5)
w = ones(1,2) / 2;
% Create the Gaussian Mixture Model...
gmd = gmdistribution(m,s,w);
% Draw 1000 random numbers from it...
x = random(gmd,1000);
% Plot a histogram...
histogram(x,100);