我正在改变合成图像的信号强度。我需要信号在 0 和 0.1 之间变化,但我需要使用伽马分布来做到这一点,以便它们中的更多落在 .01/.02 范围内。问题是我使用的是 2010 版的 Matlab,没有统计工具箱,它的库中没有该gamrnd
功能。
非常感谢任何和所有帮助。
我正在改变合成图像的信号强度。我需要信号在 0 和 0.1 之间变化,但我需要使用伽马分布来做到这一点,以便它们中的更多落在 .01/.02 范围内。问题是我使用的是 2010 版的 Matlab,没有统计工具箱,它的库中没有该gamrnd
功能。
非常感谢任何和所有帮助。
您可以使用逆变换采样方法将均匀分布转换为任何其他分布:
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
这使:
编辑:
如果没有统计工具箱,您可以使用Marsaglia 的简单转换拒绝方法从 gamma 分布中生成随机数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;
现在Y
像 gamma(a,b) 一样分布。我们可以使用gamrnd
函数测试结果:
n = size(Y,1);
X = gamrnd(a,b,n,1);
Y
和的直方图X
是:
但是,请记住,伽马分布可能不适合您的需求,因为它没有特定的上限(即趋于无穷大)。因此,您可能想要使用另一个(有界)分布,例如 beta 除以 10。