数学理论—— 蒙特卡洛近似
1. 圆周率估算
1.1 理论
- 边长为2的正方形的横坐标范围为[-1,1],纵坐标为[-1,1]。
- 数据点(x,y)的横坐标从[-1,1]中均匀抽样得到,纵坐标从[-1,1]中均匀抽样得到,则数据点落在圆内的概率为: p = A 2 A 1 = π 4 p=\frac{A_2}{A_1}=\frac{\pi}{4} p=A1A2=4π
- 计算误差为:
o
(
1
n
)
o(\frac{1}{\sqrt{n}})
o(n1)
则计算圆周率的流程为:
- 设定一个大数n,计数器m。
- for i = 1 to n: x ← [ − 1 , 1 ] y ← [ − 1 , 1 ] m ← m + 1 ( 当 x 2 + y 2 ≤ 1 时 ) x\gets[-1,1]\\y\gets[-1,1]\\ \\m\gets m+1(当x^2+y^2≤1时) x←[−1,1]y←[−1,1]m←m+1(当x2+y2≤1时)
- π ← 4 m n \pi \gets \frac{4m}{n} π←n4m
1.2 代码实现
import random
n = 10000000
m = 0
for i in range(n):
x = random.uniform(-1,1)
y = random.uniform(-1,1)
if x**2 + y**2 <= 1:
m += 1
print(4*m/n)
3.1415656
2. 近似积分
2.1 一元积分(univariate)
- 计算如下积分: I = ∫ a b f ( x ) d x I=\int_a^b{f(x)}d_x I=∫abf(x)dx
- 从[a,b]中进行n次抽样,得到: x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn
- 计算: Q n = ( b − a ) ⋅ 1 n ⋅ ∑ i = 1 n f ( x i ) Q_n=(b-a)\cdot \frac{1}{n}\cdot \sum_{i=1}^n f(x_i) Qn=(b−a)⋅n1⋅i=1∑nf(xi)
- 可用Qn去近似积分I,因为大数定律可以保证其误差反比于:
n
\sqrt n
n
代码为:
import random
def f(x):
return x**2
a = -1
b = 1
n = 100000000
sum_num = 0
for i in range(n):
x = random.uniform(a,b)
sum_num += f(x)
Q = (b-a)* sum_num / n
print(Q)
结果为:
0.6666073503023225
2.2 多元积分(multivariate)
求取积分: I = ∫ Ω f ( X ) d X I=\int_{\Omega}f(X)d_X I=∫Ωf(X)dX
- 从 Ω \Omega Ω中进行n次抽样,得到: X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn
- 计算: V = ∫ Ω d X V=\int_\Omega d_X V=∫ΩdX
- 计算: Q n = V ⋅ 1 n ⋅ ∑ i = 1 n f ( X i ) Q_n=V\cdot \frac{1}{n}\cdot \sum_{i=1}^n f(X_i) Qn=V⋅n1⋅i=1∑nf(Xi)
- 可用Qn去近似积分I,因为大数定律可以保证其误差反比于:
n
\sqrt n
n
求取下式积分: f ( x , y ) = { 1 , x 2 + y 2 ≤ 1 0 , o t h e r w i s e Ω = [ − 1 , 1 ] ⋅ [ − 1 , 1 ] I = ∫ Ω f ( x , y ) d x d y f(x,y)=\left\{ \begin{aligned} 1&, x^2+y^2≤1 \\ 0&,otherwise \end{aligned} \right.\\ \Omega=[-1,1]\cdot[-1,1]\\I=\int_{\Omega}f(x,y)d_xd_y f(x,y)={10,x2+y2≤1,otherwiseΩ=[−1,1]⋅[−1,1]I=∫Ωf(x,y)dxdy
代码为:
def f(x,y):
if x**2 + y**2 <= 1:
return 1
return 0
a1 = -1
a2 = -1
b1 = 1
b2 = 1
n = 10000000
sum_num = 0
for i in range(n):
x = random.uniform(a1,b1)
y = random.uniform(a2,b2)
sum_num += f(x,y)
V = 2*2
Q = V*sum_num / n
print(Q)
3.1415416
3 期望估计(Estimate of Expection)
- X为d维随机变量
- P(X)为X的概率密度函数: P ( X ) ← p r o b a b i l i t y d e n s i t y f u n c t i o n P(X)\gets probability\quad density\quad function P(X)←probabilitydensityfunction
-
∫
R
P
(
X
)
d
X
=
1
\int_RP(X)d_X=1
∫RP(X)dX=1
计算f(X)的期望:
- 依据P(X)进行随机抽样,得到: X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn
- 计算: Q n = 1 n ⋅ ∑ i = 1 n f ( X i ) Q_n=\frac{1}{n}\cdot \sum_{i=1}^n f(X_i) Qn=n1⋅i=1∑nf(Xi)
- Q n ≈ E X ∼ P [ f ( X ) ] Q_n\approx E_{X\sim P}[f(X)] Qn≈EX∼P[f(X)]
代码为:
n = 10000000
sum_num = 0
for i in range(n):
x = random.normalvariate(2,1)
sum_num += x
print(sum_num/n)
2.000336379227587
本文部分内容为参考此视频。
by CyrusMay 2022 04 04
生命是华丽错觉
时间是贼偷走一切
————五月天(如烟)————