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

4
我有一个非负函数f定义在单位正方形S = [0,1] x [0,1]上,如下所示: enter image description here 我的问题是,如何使用MATLAB根据概率密度函数f生成来自S的二维随机向量?

我认为,除非你的密度是可分离的(因此你的两个组件是独立的随机变量),否则这是一个非常困难的问题。你知道如何在纸上解决这个问题吗?如果你知道纸上的算法,那么你就能编写代码了。 - Andras Deak -- Слава Україні
@AndrasDeak,很不幸我不知道如何在纸上完成这个任务。我只想根据某些概率分布生成一个随机向量,而我所能做的就是使用Matlab中预定义的pdf函数。 - mononono
3
我会采用拒绝采样的方法。另请参考此答案,虽然语言不同,但可以作为指南。 - Luis Mendo
你会如何离散化它?考虑到这是MATLAB中的2D矩阵,必须以某种方式进行离散化。因此,一个简单的解决方案是生成一个带有randn的2D矩阵,并对其进行归一化(假设您也知道所有元素的总和)。由于所有元素都被常数归一化,随机性将得到保留。我是否漏掉了什么,因为这将满足积分,对吗? - akamath
1
@akamath,你忽略了OP需要一个特定的分布:) "我有一个非负函数f",他们只是没有告诉我们它是什么。而且他们这样做是正确的:如果它不由独立的函数组成,那么这并不真正有什么区别。 - Andras Deak -- Слава Україні
1
@LuisMendo的建议听起来很不错。选择一个均匀随机点,然后看看另一个均匀随机点是否命中(重新)归一化的概率密度(就像你会做“p概率”的事情一样)。如果符合条件,则保留该点,否则将其丢弃。 - Andras Deak -- Слава Україні
2个回答

1

拒绝采样

路易斯·门多提出的建议非常好,因为它适用于几乎所有分布函数。根据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

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

1

ICDF

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

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

第一个ICDF1将均匀分布的随机样本映射到您的随机分布的第一维的样本值。

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

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

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

这种解决方案的巨大优势在于,它不会拒绝任何样本,潜在速度更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接