如何在 MATLAB 中生成二维随机向量?

How to generate a 2D random vector in MATLAB?

我在单位正方形 S = [0,1] x [0,1] 上定义了一个非负函数 f 使得

我的问题是,如何使用MATLAB根据概率密度函数fS生成二维随机向量?

拒绝抽样

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

我知道这个解决方案不是一个快速实施,但我想从一个尽可能简单的实施开始,以确保拒绝抽样的概念变得清晰。

ICDF

除了拒绝抽样之外,还有一种不同的方法可以在更数学的层面上解决这个问题,但您需要先坐下来做一些数学运算,以得出更好的解决方案。对于一维分布,您通常使用 ICDF(反向累积密度函数)函数进行采样,只需使用 ICDF(rand(n,1)) 即可获得随机样本。

如果您设法进行数学运算,则可以改为在 matlab 中为 PDF 函数定义两个函数 ICDF1(第一维的 ICDF)和 ICDF2(第二维的 ICDF)。

第一个 ICDF1 会将 unifrom 随机分布样本映射到随机分布第一维的样本值。

第二个 ICDF2 会将 ICDF1 和均匀分布样本的输出映射到您想要的解决方案。

这是一些 matlab 代码,假设您已经定义了 ICDF1ICDF2

samples=ICDF1(rand(n,1));
samples(:,2)=ICDF2(samples,rand(n,1));

此解决方案的最大优势在于,它不会拒绝任何样本,速度可能要快得多。