并行化 Monte Carlo 集成

Parallelize Monte Carlo Integration

我想从概率分布中生成 10 亿个随机点,并使用这些点评估函数以计算 Monte Carlo 积分。问题是我使用的是 MATLAB,对其他编程语言知之甚少。 MATLAB 当然非常慢,我已经讨论了通过在 10 个不同过程中计算 1 亿个点的值来并行化积分的可能性。这是一种可能的方法吗?如果是这样,最好的实现方式是什么?

目前的做法如下:

对于i:N
从分布生成随机数
评估功能 将函数评估添加到临时变量
结束

将临时变量除以N,得到近似的积分。

正在评估的函数如下:
如果生成的点小于数字 B
则为 0 如果生成的点大于等于B,则该点与B的差值。

使用@Arpi 的方法将改为使用 parfor 循环。

看来这是much, much simpler than first suggested. One could solve the problem analytically, by consulting wikipedia。但是 - 我强调这确实不是正确的方法 - 因为这是一个编程站点,所以这里有一个程序:

b = 0.3;
N = 1e9;
batch_size = 1e8;

total = 0;
for ii=1:(N/batch_size)
    total = sum(max(0,rand(batch_size,1)-b));
end
result = total/N;

这需要大约 15 秒到 运行。如果选择更好的批量大小,可能会更快。

请注意,这里的 "distribution" 在区间 [0, 1) 上是统一的,这可能不是我们想要的,但该方法可以扩展到任何分布类型(其中许多是内置在 Matlab 中)。