Как вы генерируете случайные числа из бимодальной гауссовской функции плотности вероятности в 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);
Другие вопросы по тегам