首页 > 解决方案 > 从 Matlab 上的自定义混合物中绘制随机数?

问题描述

我想从 Matlab 中不同位置和规模的 Gumbel 分布的混合中生成随机数。你能建议如何做到这一点吗?


我知道的(很少)

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 代码。

标签: matlab

解决方案


假设您混合了 3 个 Gumbel 分布,每个分布都有自己的musigma和相对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

推荐阅读