在 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 集成通过重要性采样更有用。阅读 作为一个很好的例子。
我正在做关于数值积分的演讲的一部分。虽然演讲本身将涉及更好的数值积分形式(主要是重要性抽样和分层抽样),但我在部分内容中提到 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 集成通过重要性采样更有用。阅读