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

Kel*_*sey 2 random matlab distribution gamma-distribution

我正在改变合成图像的信号强度。我需要信号在0到0.1之间变化,但是我需要使用伽玛分布来做到这一点,以便更多信号落在.01 / .02范围内。问题是我使用的是Matlab 2010版本,但没有“统计工具箱”,gamrnd而该工具库的功能并不包含该工具。

任何帮助都将不胜感激。

EBH*_*EBH 5

您可以使用逆变换采样方法将均匀分布转换为任何其他分布:

P = rand(1000);
X = gaminv(P(:),2,2); % with k = 2 and theta = 2
Run Code Online (Sandbox Code Playgroud)

这是一个小例子:

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

这使:

伽玛分布


编辑:

如果没有统计工具箱,则可以使用Marsaglia的简单转换-拒绝方法,使用rand和来从伽玛分布生成随机数randn

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;
Run Code Online (Sandbox Code Playgroud)

现在Y分布像gamma(a,b)。我们可以使用以下gamrnd功能测试结果:

n = size(Y,1);
X = gamrnd(a,b,n,1);
Run Code Online (Sandbox Code Playgroud)

和直方图Y,并X为:

伽玛dist 2

但是,请记住,伽马分布可能没有满足您的需求,因为它没有特定的上限(即达到无穷大)。因此,您可能要使用其他(有界)分布,例如beta除以10。