例子 1:假设有随机变量 x,定义域 X,其概率密度函数为 p(x),f(x) 为定义在 X 上的函数,目标是求函数 f(x) 关于密度函数 p(x) 的数学期望 。蒙特卡洛法根据概率分布 p(x) 独立地抽样 n 个样本 x1,x2,…..xn,得到近似的 f(x) 期望为:
其实这个的理解就是要求一个拥有概率密度的函数期望值
期望=积分(每个点的密度函数*每个点的价值函数)
例子 2: 假设我们想要求解 h(x) 在 X 上的积分:
我们将 h(x) 分解成一个函数 f(x) 和一个概率密度函数 p(x) 的乘积,进而又将问题转换为求解函数 f(x) 关于密度函数 p(x) 的数学期望 :
这里的Ep(x)是相当于把整个分布当时了概率分布,即总发生概率为1.
这里,f(x) 表示为 ,则有:
更一般的,假设我们想要求解 ,熟悉积分的同学肯定已经知道答案为 ,那么如何用采样的方法来得到这个值呢?
令 ,0<x<10,那么 。
下面是代码:
'''import random
num=1000000
sum=0
for i in range(0,num):
x=random.uniform(0,10)
sum+=x*x*10
sum/=1000000
print(sum)'''
import random
numSamples=10000
samples=[random.uniform(0,10)for _ in range(numSamples)]
f_samples=[10*sample**2 for sample in samples]
result=1/10000.0*sum(f_samples)
print(result)
result=333.10527012455066
random.uniform(x,y)表示在[x,y)之间生成一个 实数
对于复杂的 h(x),这种方法计算起来显然就更加方便了(特别是忘记积分怎么算的同学)。
蒙特卡洛方法其实就是利用大数定理通过大量统计来算出最后的值。
到这里为止,我们简单的介绍了蒙特卡洛方法,但是依旧没有提到要怎么利用复杂的概率密度函数进行采样。接下来我们来看一下接受-拒绝法(accept-reject sampling method),它也是蒙特卡洛法中的一种类型适用于不能直接抽样的情况。