通俗易懂的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)>0∫abp(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)dx−J2
由我们之前讨论的辛钦大数定理,我们可以用
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^=N1∑i=1Nηi=N1∑i=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
limn→∞P{∣JN^−J∣<N3Dη}=0.997
由中心极限定理,误差
δ
=
J
^
N
−
J
\delta = \hat J_N - J
δ=J^N−J随着
N
N
N的增大逐渐减小,但是误差却是与
1
N
\frac{1}{\sqrt{N}}
N1成反比。这说明在
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
(∫ab∣f(x)∣dx)2≤∫abp(x)f2(x)dx∫abp(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)=∫ab∣f(x)∣dx∣f(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 ∫ab∣f(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=N−11i=1∑N(p(ζi)f(ζi))2−J^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^N−N+11(p(ζN+1)f(ζN+1)−J^N)D^N+1=D^N−N+11(p2(ζN+1)f2(ζN+1)−D^N)D^η,N=D^N−J^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代码的实现过程下次再描述。