通俗易懂的MonteCarlo积分方法(五)

本文探讨了如何提高Monte Carlo积分方法的精度,通过选择合适的概率密度函数p(x)来减小方差Dη,并介绍了利用辛钦大数定理和中心极限定理来估算误差。此外,提出了一个迭代算法来动态估计积分值J和方差Dη,并给出了在满足一定精度要求时停止算法的条件。最后,提到了使用MCMC方法生成所需分布的随机数。
摘要由CSDN通过智能技术生成

通俗易懂的MonteCarlo积分方法(五)

​ 这次主要目的是想办法提高 M o n t e C a r l o MonteCarlo MonteCarlo的计算精度。

​ 如果我们要求解一个定积分:
J = ∫ a b f ( x ) d x J = \int_a^bf(x)dx J=abf(x)dx
​ 在求解这个定积分之前我们先假设我们可以产生在 [ a , b ] [a,b] [a,b]上的具有给定密度函数 p ( x ) p(x) p(x)的独立随机变量 ζ \zeta ζ

​ 那么这个 p ( x ) p(x) p(x) [ a , b ] [a,b] [a,b]上就满足以下条件:
p ( x ) > 0 ∫ a b p ( x ) d x = 1 p(x)>0\\ \int_a^bp(x)dx = 1 p(x)>0abp(x)dx=1
​ 如果我们设定随机变量 η = f ( x ) p ( x ) \eta = \frac{f(x)}{p(x)} η=p(x)f(x),那么 η \eta η的均值如下:
E η = ∫ a b f ( x ) p ( x ) p ( x ) d x = J E\eta = \int_a^b\frac{f(x)}{p(x)}p(x)dx=J Eη=abp(x)f(x)p(x)dx=J
​ 那么 η \eta η的方差如下:
D η = E η 2 − ( E η ) 2 = ∫ a b f 2 ( x ) p ( x ) d x − J 2 D\eta = E\eta^2-(E\eta)^2 = \int_a^b\frac{f^2(x)}{p(x)}dx-J^2 Dη=Eη2(Eη)2=abp(x)f2(x)dxJ2
​ 由我们之前讨论的辛钦大数定理,我们可以用 J N ^ = 1 N ∑ i = 1 N η i = 1 N ∑ i = 1 N f ( ζ i ) p ( ζ i ) \hat{J_N} = \frac{1}{N}\sum_{i = 1}^{N}\eta_i = \frac{1}{N}\sum_{i=1}^N\frac{f(\zeta_i)}{p(\zeta_i)} JN^=N1i=1Nηi=N1i=1Np(ζi)f(ζi)来近似描述 J J J

​ 我们由中心极限定理可知:
l i m n → ∞ P { ∣ J N ^ − J ∣ < 3 D η N } = 0.997 lim_{n\rightarrow \infty}P\{|\hat{J_N}-J|<\frac{3\sqrt{D\eta}}{\sqrt{N}}\} = 0.997 limnP{JN^J<N 3Dη }=0.997
​ 由中心极限定理,误差 δ = J ^ N − J \delta = \hat J_N - J δ=J^NJ随着 N N N的增大逐渐减小,但是误差却是与 1 N \frac{1}{\sqrt{N}} N 1成反比。这说明在 N N N特别大时候,再增大 N N N时数值误差就会减少的比较小。

​ 因此误差随着 N N N的增加时,数值误差的改进就会特别小。这就是 M o n t e C a r l o MonteCarlo MonteCarlo方法最大的弊端。

​ 现在我们再考虑在提高精度,减少误差的另一种办法,就是通过:选取合适的 p ( x ) p(x) p(x)来使得 D η \sqrt{D\eta} Dη 尽可能的小。

​ 我们由柯西不等式可知:
( ∫ a b ∣ f ( x ) ∣ d x ) 2 ≤ ∫ a b f 2 ( x ) p ( x ) d x ∫ a b p ( x ) d x = ∫ a b f 2 ( x ) p ( x ) d x = E η 2 = D η + J 2 (\int_a^b|f(x)|dx)^2\leq \int_a^b\frac{f^2(x)}{p(x)}dx\int_a^bp(x)dx = \int_a^b\frac{f^2(x)}{p(x)}dx =E \eta^2= D\eta+J^2 (abf(x)dx)2abp(x)f2(x)dxabp(x)dx=abp(x)f2(x)dx=Eη2=Dη+J2
​ 当且仅当 p ( x ) = ∣ f ( x ) ∣ ∫ a b ∣ f ( x ) ∣ d x p(x) = \frac{|f(x)|}{\int_a^b|f(x)|dx} p(x)=abf(x)dxf(x)时上述等式成立,此时 D η = 0 D\eta = 0 Dη=0成立。

​ 但是我们这个时候选取得 p ( x ) p(x) p(x)不现实。因为我们要计算 ∫ a b ∣ f ( x ) ∣ d x \int_a^b|f(x)|dx abf(x)dx,相比于 ∫ a b f ( x ) d x \int_a^bf(x)dx abf(x)dx,本身就需要巨大得计算量。

​ 因此我们可以选择一个合适的算法来求较优 p ( x ) p(x) p(x)。比如说,我们可以考虑 p ( x ) p(x) p(x) ∣ f ( x ) ∣ |f(x)| f(x)的极值附近增加较快,而在不明显的地方取 p ( x ) p(x) p(x)近似为常数。

​ 假设我们的 p ( x ) p(x) p(x)已经选定了,由于 J J J我们不知道时多少,因此我们用统计的方法估计 D η D\eta Dη。估计方法如下:
D η ≈ D ^ η , N = 1 N − 1 ∑ i = 1 N ( f ( ζ i ) p ( ζ i ) ) 2 − J ^ N 2 D\eta \approx \hat D_{\eta,N} = \frac{1}{N-1}\sum_{i=1}^N(\frac{f(\zeta_i)}{p(\zeta_i )})^2-\hat J_N^2 DηD^η,N=N11i=1N(p(ζi)f(ζi))2J^N2
​ 而相关的 J ^ N \hat J_N J^N D ^ η , N \hat D_{\eta,N} D^η,N可以由下面的算法决定:
{ J ^ 0 = 0 , D ^ 0 = 0 J ^ N + 1 = J ^ N − 1 N + 1 ( f ( ζ N + 1 ) p ( ζ N + 1 ) − J ^ N ) D ^ N + 1 = D ^ N − 1 N + 1 ( f 2 ( ζ N + 1 ) p 2 ( ζ N + 1 ) − D ^ N ) D ^ η , N = D ^ N − J ^ N 2 \begin{cases}\hat J_0 = 0,\hat D_0 = 0\\\hat J_{N+1} = \hat J_N - \frac{1}{N+1}(\frac{f(\zeta_{N+1})}{p(\zeta_{N+1})}-\hat J_N)\\ \hat D_{N+1} = \hat D_N-\frac{1}{N+1}(\frac{f^2(\zeta_{N+1})}{p^2(\zeta_{N+1})}-\hat D_N)\\ \hat D_{\eta,N} = \hat{D}_N-\hat{J}^2_N\end{cases} J^0=0,D^0=0J^N+1=J^NN+11(p(ζN+1)f(ζN+1)J^N)D^N+1=D^NN+11(p2(ζN+1)f2(ζN+1)D^N)D^η,N=D^NJ^N2
​ 设定一个偏差 ϵ \epsilon ϵ,这个算法在以下条件时有满足 0.997 0.997 0.997的概率达到结束。
3 D η , N N ≤ ϵ 3\sqrt{\frac{D_{\eta,N}}{N}} \leq \epsilon 3NDη,N ϵ
​ 以上的算法的关键时产生服从我们设定的在 [ a , b ] [a,b] [a,b]上任意分布 p ( x ) p(x) p(x)的随机数。这是一个很复杂的问题,一般是用 M C M C MCMC MCMC来产生分布为 p ( x ) p(x) p(x)随机数。这个算法的 p y t h o n python python代码的实现过程下次再描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值