蒙特卡罗方法

那么“蒙特卡罗”是一种什么特性呢?我们知道,既然是随机算法,在采样不全时,通常不能保证找到最优解,只能说是尽量找。那么根据怎么个“尽量”法儿,我们我们把随机算法分成两类:
  • 蒙特卡罗算法:采样越多,越近似最优解;
  • 拉斯维加斯算法:采样越多,越有机会找到最优解;

举个例子,假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。这个挑苹果的算法,就属于蒙特卡罗算法——尽量找好的,但不保证是最好的

而拉斯维加斯算法,则是另一种情况。假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。这个试钥匙的算法,就是拉斯维加斯的——尽量找最好的,但不保证能找到

所以你看,这两个词并不深奥,它只是概括了随机算法的特性,算法本身可能复杂,也可能简单。这两个词本身是两座著名赌城,因为赌博中体现了许多随机算法,所以借过来命名。

这两类随机算法之间的选择,往往受到问题的局限。如果问题要求在有限采样内,必须给出一个解,但不要求是最优解,那就要用蒙特卡罗算法。反之,如果问题要求必须给出最优解,但对采样没有限制,那就要用拉斯维加斯算法。
==================

蒙特卡罗是一类随机方法的统称。这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在(放弃随机采样,而采用类似全采样这样的确定性方法)获得真正的结果之前,无法知道目前得到的结果是不是真正的结果。

举例说明,一个有10000个整数的集合,要求其中位数,可以从中抽取m<10000个数,把它们的中位数近似地看作这个集合的中位数。随着m增大,近似结果是最终结果的概率也在增大,但除非把整个集合全部遍历一边,无法知道近似结果是不是真实结果。

==================

蒙特卡罗方法——一个例子

任何通过生成合适的随机数来解决问题,并观察遵循某些属性的数字部分的方法都可以归类为蒙特卡罗方法。

 

我们来做一个有趣的练习,尝试使用笔和纸来找出π的价值。我们绘制一个单位长度的正方形,并绘制一个单位长度为半径的四分之一圆。现在,我们手头有个 C3PO 机器人可以帮到我们。机器人的任务是在正方形上随机放置尽可能多的点,放上 3000 次,得到如下这张图:

 

 每次将点放入圆圈时,C3PO 都需要计数。因此,π的值将由下列公式给出:

 

 其中 N 是一个数据点放在圆内部的次数,可以看到,除了计算没有落入圆内部的随机点数外没有任何其它操作,然后选一个比率来近似 π 的值。


 
==================
蒙特卡罗算法——大家听说过蒙特卡罗求π吧?就是画一个正方形和内切圆,随机撒点,数一下点落在园内和正方形内的数量之比,就是二者面积之比π/4。
所以蒙特卡罗就是求面积的方法。
而积分是曲线下的面积
所以蒙特卡罗就是求积分的方法
而均值就是概率密度与自变量乘积的积分
所以蒙特卡罗就是求均值的方法
而期望就是均值
所以蒙特卡罗就是求期望的方法
而最优值往往接近或就是期望
所以蒙特卡罗就是求最优值的方法
==================
import random
import numpy as np
import math

N = 10000
sum = 0
for i in range(N):
        rg = random.gauss(0,1)
        if rg > 1 or rg < -1:
                continue
        sum += np.exp(rg + 0.5 * (rg**2))

sum *= math.sqrt(2 * math.pi)
sum /= N

print(sum)

这段代码求e^x在[-1,1]之间的积分,使用正态分布抽样

 

 

 

==================

蒙特卡洛估算定积分的Python实现

https://mp.weixin.qq.com/s/mDeggkPAAHBGg8bUH55mdQ
 
==================
链接:https://www.zhihu.com/question/20254139
 
posted @ 2020-02-25 15:43  emanlee  阅读(806)  评论(0编辑  收藏  举报