如何在没有统计工具箱的情况下从伽马分布中绘制随机数?

时间:2017-01-31 20:42:58

标签: matlab random distribution gamma-distribution

我正在改变合成图像的信号强度。我需要信号在0和0.1之间变化,但我需要使用伽玛分布来做这个,这样它们中的更多会落在.01 / .02范围内。问题是我使用的是没有统计工具箱的2010版Matlab,它没有gamrnd函数作为其库的一部分。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:5)

您可以使用Inverse transform sampling method将统一分配转换为任何其他分发:

P = rand(1000);
X = gaminv(P(:),2,2); % with k = 2 and theta = 2

这是一个小小的演示:

for k = [1 3 9]
    for theta = [0.5 1 2]
        X = gaminv(P(:),k,theta);
        histogram(X,50)
        hold on
    end
end

给出了:

gamma dist

修改

如果没有统计工具箱,您可以使用Marsaglia's simple transformation-rejection method通过randrandn生成伽马分布中的随机数:

N = 10000; % no. of tries
% distribution parameters:
a = 0.5;
b = 0.1;
% Marsaglia's simple transformation-rejection:
d = a - 1/3;
x = randn(N,1);
U = rand(N,1);
v = (1+x./sqrt(9*d)).^3;
accept = log(U)<(0.5*x.^2+d-d*v+d*log(v));
Y = d*(v(accept)).*b;

现在Y像gamma(a,b)一样分发。我们可以使用gamrnd函数测试结果:

n = size(Y,1);
X = gamrnd(a,b,n,1);

YX的直方图是:

gamma dist 2

但是,请记住,伽玛分布可能不符合您的需求,因为它有no specific upper bound(即进入无限远)。所以你可能想要使用另一个(有界)分布,比如beta除以10。