任意函数的蒙特卡罗模拟

机器算法验证 蒙特卡洛 不可缺少的
2022-03-10 09:09:41

我熟悉近似 PDF 积分的 MC 方法。但在这个问题上,我很好奇我们如何将这些方法用于其他问题。例如评估我选择这个函数是因为分析评估积分是微不足道的;我只是好奇如何设计一个 MC 模拟来近似分析可以找到的值。01x2dx

编辑@Periwinkle,我找到了下面的代码片段(为了便于阅读而对其进行了清理)并发布在下面。

def mc_int(upper, lower, size, func):
  uniform_samples = np.random.uniform(low=lower, high=upper, size=size)
  transformed_samples = func(uniform_samples)
  expected_value = np.average(transformed_samples) * (upper - lower)
  return expected_value

def f(x):
  return x**2

mc_int(lower=0, upper=1, size=1000, func=f)
>>>
0.3333     

根据您的评论,我不明白为什么upper - lower需要按比例缩放。你能解释一下吗?

3个回答

绘制,iid 均匀分布在单位正方形中。计算这些对中有多少满足,让这个数字是然后 n(x,y)y<x2k

P(Y<X2)=[0,1]2Iy<x2d(x,y)=01x2dxkn.

模拟人生

代码:

xx <- seq(0,1,by=.01)
plot(xx,xx^2,type="l",lwd=3)

n_sims <- 1e4
set.seed(1)
sims <- cbind(runif(n_sims),runif(n_sims))
index <- sims[,2]<sims[,1]^2
points(sims,pch=19,cex=0.4,col=c("red","black")[index+1])

sum(index)/length(index)

的著名练习的变体(实际上是,通过在单位正方形中使用四分之一圆)。ππ4

的代表

I=01x2dx
作为一个随机变量的期望是相当开放的,因为选择一个统一的(0,1)变量U这样
I=E[U2]
不是唯一的选择。对于任何严格的正概率密度f超过(0,1), 表示
I=01x2f1(x)f(x)dx
持有,意思是
I=Ef[X2f1(X)]
可以在蒙特卡洛方案中利用:
I=limn1ni=1nXi2f1(Xi)Xif(x)
的(形式上)最优选择是 Beta密度,因为得到的蒙特卡罗近似方差为零。fB(2,1)

的黎曼近似,其中有足够的矩形来近似积分。然后进行蒙特卡罗积分,其中积分区间中均匀选择的点被替换为矩形底的中心。01x2dx=1/3

# Riemann approx with m rectangles
m = 1000; a = 0; b = 1
w = (b-a)/m  # rectangle widths
d = seq(a+w/2,b-w/2, len=m) # centers
h = d^2  # rectangle heights
sum(w*h) # rectamg;e areas
[1] 0.3333332

# MC emulates Riemann 
# with random uniform grid 
m = 10^6;  a=0;  b=1
w = (b-a)/m   # "average width"
d = runif(m, a, b)
h = d^2
sum(w*h)
[1] 0.3332943

附录 1: @Dave 评论中的每个问题:的密度函数的 MC 近似值,以验证它是否集成为一。Beta(2,2)

# Approx integration: BETA(2,2) density 
m = 10^6;  a=0;  b=1
w = (b-a)/m 
d = runif(m, a, b)
h = dbeta(d, 2, 2)  # BETA(2,2) PDF
sum(w*h)
[1] 1.000299  # aprx 1

附录2:关于将MC扩展到多个维度。

假设我们要验证标准二元正态分布下单位平方中我们将点均匀地随机放置在单位平方中,并将它们对应的密度相加:0.34132=0.1165

set.seed(1234)
m = 10^4; u1=runif(m); u2 = runif(m)
h = dnorm(u1)*dnorm(u2)
mean(h)                 # mc aprx
[1] 0.1163528
diff(pnorm(c(0,1)))^2   # exact
[1] 0.1165162

此外,我们发现的三角形内标准二元正态分布我们在三角形中均匀随机放置点,将对应的密度值相加,乘以三角形面积的[精确值可以通过对称获得,使用 45 度旋转。]0.0677(0,0),(0,1),(1.0).1/2

h.acc = h[u1+u2<=1]
.5*mean(h.acc)                # mc aprx
[1] 0.06768097
diff(pnorm(c(sqrt(1/2),0)))^2 # exact
[1] 0.06773003

或许请参阅 此问答以了解其他 MC 集成方法。