我想从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中提取。参见here
通常,我找不到要从Matlab中的自定义混合物绘制的任何Matlab代码。
答案 0 :(得分:2)
假设您有3个Gumbel分布的混合,每个分布都有自己的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))
然后从此分布中提取随机值是一个两步过程:
您可以这样实现:
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