拒绝采样
路易斯·门多提出的建议非常好,因为它适用于几乎所有分布函数。根据this answer的建议,我编写了m的代码。
使用这种方式进行拒绝采样的一个重要点是,您必须知道范围内概率密度函数的最大值。如果您高估了最大值,您的代码将只会运行得更慢。如果您低估了它,它将产生错误的数字!
这个想法是,您可以采样许多均匀分布的点,并根据点的概率密度接受或拒绝。
pdf=@(x).5.*x(:,1)+3./2.*x(:,2);
maximum=2; %Right maximum for THIS EXAMPLE.
%If you are unable to determine the maximum of your
%function within the [0,1]x[0,1] range, please give an example.
result=[];
n=10;
while (size(result,1)<n)
%1. sample random point:
val=rand(1,2);
%2. Accept with probability pdf(val)/maximum
if rand<pdf(val)/maximum
%append to solution
result(end+1,:)=val;
end
end
ICDF
除了拒绝采样外,还有一种不同的方法可以更数学化地解决这个问题,但您需要先进行一些数学计算,以得到更好的解决方案。对于一维分布,通常使用ICDF(反累积密度函数)函数来进行采样,只需使用ICDF(rand(n,1))
即可获得随机样本。
如果您能够进行数学计算,则可以在matlab中为您的PDF函数定义两个函数ICDF1(第一维的ICDF)和ICDF2(第二维的ICDF)。
第一个ICDF1将均匀分布的随机样本映射到您的随机分布的第一维的样本值。
第二个ICDF2将ICDF1的输出和均匀分布的样本映射到您的预期解决方案。
以下是一些matlab代码,假设您已经定义了ICDF1
和ICDF2
samples=ICDF1(rand(n,1));
samples(:,2)=ICDF2(samples,rand(n,1));