答案 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
这个解决方案的最大优点是,它不会拒绝任何样本,可能会更快。