如何在MATLAB中从双峰高斯概率密度函数中生成随机数?

5
你如何在MATLAB中从双峰高斯分布PDF生成数字呢?
对于单峰对称高斯分布PDF,这非常容易:
x=randn(1000,1); 

现在我想从一个有两个峰值(或两个均值)的高斯分布中抽取1000个数字。我该怎么做呢?


3
高斯分布总是单峰的。你是指高斯混合分布吗?你可以从混合成分中之一绘制样本x1,另一组样本x2则从第二个绘制。然后结合起来得到混合物的一个样本。每个成分的绘制次数取决于它在混合物中的权重。 - mikkola
2个回答

4
你可以通过将两个具有不同均值和标准差的正态分布组合在一起(如this comment中所述)来生成双峰正态(高斯)分布。
在MATLAB中,你可以通过以下几种方式实现:
首先,我们需要指定描述我们的正态分布的均值(mu)和标准偏差(sigma),通常表示为N(mu, sigma)
正态分布a:N(-1, 0.5)
mu_a = -1;      % Mean (a).
sigma_a = 0.5;  % Standard deviation (a).

正态分布 b: 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);

bimodal normal distributions


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);

太棒了Tommaso!这应该是被接受的答案,因为gmdistribution函数是正确的工具。 - codeaviator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接