在 R 中进行简单 Monte Carlo 集成时的错误结果

Wrong result when doing simple Monte Carlo integration in R

我正在做关于数值积分的演讲的一部分。虽然演讲本身将涉及更好的数值积分形式(主要是重要性抽样和分层抽样),但我在部分内容中提到 Monte Carlo 来自均匀分布的积分抽样。

我发现:

mean(sin(runif(1e8, 0, pi)))

给出的答案是 0.636597,而不是预期的 1。这个答案似乎与增加样本量非常一致,我不确定为什么会有这么多错误。其他计算如:

mean(sin(runif(1e6, 0, 2 * pi)))

给出0.0005398996,更接近0的预期答案。

谁能帮我看看为什么

mean(sin(runif(1e8, 0, pi)))

给出的答案如此不准确?这是用户错误,还是从均匀分布中抽样时的预期错误?

我回来是为了让我的回答完整,以防未来的读者需要了解其中的逻辑。请注意,如您的问题所述,真实值为 2 而不是 1。


所以,您只是计算样本的平均函数值,但忘记乘以区间长度。

set.seed(0); pi * mean(sin(runif(1000, 0, pi)))
# [1] 2.001918

就是你需要的。


这个结果的一个确定性观点是mean value theorem for integral,或者说是黎曼和积分的近似。

所以我们也可以做到

pi * mean(sin(seq(0, pi, length = 1000)))
# [1] 1.997998

Monte Carlo 集成通过重要性采样更有用。阅读 作为一个很好的例子。