如何在 MATLAB 中生成二维随机向量?
How to generate a 2D random vector in MATLAB?
我在单位正方形 S = [0,1] x [0,1]
上定义了一个非负函数 f
使得
我的问题是,如何使用MATLAB根据概率密度函数f
从S
生成二维随机向量?
拒绝抽样
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 代码,假设您已经定义了 ICDF1
和 ICDF2
samples=ICDF1(rand(n,1));
samples(:,2)=ICDF2(samples,rand(n,1));
此解决方案的最大优势在于,它不会拒绝任何样本,速度可能要快得多。
我在单位正方形 S = [0,1] x [0,1]
上定义了一个非负函数 f
使得
我的问题是,如何使用MATLAB根据概率密度函数f
从S
生成二维随机向量?
拒绝抽样
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 代码,假设您已经定义了 ICDF1
和 ICDF2
samples=ICDF1(rand(n,1));
samples(:,2)=ICDF2(samples,rand(n,1));
此解决方案的最大优势在于,它不会拒绝任何样本,速度可能要快得多。