我在单位平方 f
上定义了一个非负函数 S = [0,1] x [0,1]
使得
我的问题是,如何使用 MATLAB 根据概率密度函数 S
从 f
生成二维随机向量?
最佳答案
拒绝抽样
Luis Mendo 提出的建议非常好,因为它几乎适用于所有分布函数。基于 this answer 我为 m 编写了代码。
以这种方式使用拒绝采样时的一个重点是,您必须知道范围内 pdf 的最大值。如果您高估了最大值,您的代码只会运行得更慢。如果您低估它,它将创建错误的数字!
这个想法是您对许多均匀分布的点进行采样并根据点的概率密度接受。
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
我知道这个解决方案不是一个快速的实现,但我想从一个尽可能简单的实现开始,以确保拒绝采样的概念变得清晰。