如何在MATLAB中生成2D随机向量?

时间:2016-02-07 02:34:12

标签: matlab random-sample probability-density

我在单位正方形f上定义了非负函数S = [0,1] x [0,1] enter image description here

我的问题是,如何根据概率密度函数S使用MATLAB从f生成2D随机向量?

2 个答案:

答案 0 :(得分:1)

拒绝抽样

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

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

答案 1 :(得分:1)

<强> ICDF

除了拒绝抽样之外,还有一种不同的方法可以在更加数学的水平上解决这个问题,但是你需要先坐下来先做一些数学计算才能得到更好的解决方案。对于1维分布,您通常使用ICDF(反向累积密度函数)函数进行采样,只需使用syms <- c("ACWI","ITOT","IJR","EFA","EEM","AGG","MUB", "TIP","TLH","TLT","HYG","EMB","IYR","GSG","GLD") lapply(syms, function(s) Return.calculate(Ad(getSymbols(s, auto.assign = FALSE) )['2015-12-31::2016'])[-1L]) 来获取随机样本。

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

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

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

以下是一些matlab代码,假设您已经定义了<label>Visiting Date :</label> <?php $date = strtotime('Today'); $days = 7; $i = 1; echo '<select name="visiting_date">'; while ($i <= $days ) { echo '<option value="'.$date.'">'.date('l d M Y', $date). '</option>'; $date = strtotime( date('Y-m-d', $date) . ' + 1 Days'); $i++; } echo '</select>'; ?> ICDF(rand(n,1))

ICDF1

这个解决方案的最大优点是,它不会拒绝任何样本,可能会更快。