蒙特卡洛算法

一 蒙特卡罗算法简介

蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,它是一种思想或者方法的统称,而不是严格意义上的算法。蒙特卡罗方法的起源是1777年由法国数学家布丰(Comte de Buffon)提出的用投针实验方法求圆周率(具体算法见文末的好文推荐),在20世纪40年代中期,由于计算机的发明结合概率统计理论的指导,从而正式总结为一种数值计算方法,其主要是用随机数来估算计算问题。

蒙特卡罗算法基本思想

投针实验这个例子有点晦涩,换个简单的图文并茂的例子–求圆周率。计算圆周率时可以考虑将一个单位圆放在一个正方形中,从而将求解圆周率转化为计算出圆和正方形面积的比例。

蒙特卡罗方法的基本思想是这样:假想你有一袋豆子,把豆子均匀地朝这个正方形上撒,然后数落在圆内的豆子数占正方形内豆子数的比例,即可计算出圆的面积,近而计算出 π π π。而且当豆子越小,撒的越多的时候,结果就越精确。蒙特卡罗的理论依据是概率论中的大数定律

蒙特卡罗算法的基本步骤

蒙特卡罗算法一般分为三个步骤,包括构造随机的概率的过程,从构造随机概率分布中抽样,求解估计量。

1 构造随机的概率过程

对于本身就具有随机性质的问题,要正确描述和模拟这个概率过程。对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程了。它的某些参数正好是所要求问题的解,即要将不具有随机性质的问题转化为随机性质的问题。如本例中求圆周率的问题,是一个确定性的问题,需要事先构造一个概率过程,将其转化为随机性问题,即豆子落在圆内的概率,而π就是所要求的解。

2 从已知概率分布抽样

由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量,就成为实现蒙特卡罗方法模拟实验的基本手段。如本例中采用的就是最简单、最基本的(0,1)上的均匀分布,而随机数是我们实现蒙特卡罗模拟的基本工具。

3 求解估计量

实现模拟实验后,要确定一个随机变量,作为所要求问题的解,即无偏估计。建立估计量,相当于对实验结果进行考察,从而得到问题的解。如求出的近似π就认为是一种无偏估计。

估计读者读完这三个带有严重概率统计学的段落依旧一头雾水,不着急,结合python实例就明白了。

二 求圆周率 π π π的python实例演示

借助计算机程序可以生成大量均匀分布的坐标点,接着统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出的近似值。

import random
import math
import getopt
import sys
import matplotlib.pyplot as plt

def main():
    total = 0
    print('Start experiment: ')
    n = 0

 #Repeat try the estimate pi, until break it down manually
 while True:
        n=int(input(sys.argv))
 for i in range(n):
            x = random.uniform(-1,1)
            y = random.uniform(-1,1)
 #x^2 + y^2 <=1, means (x, y) in the cycle
 if math.sqrt(x ** 2 + y ** 2) <= 1.0:
                total += 1
                plt.plot(x, y, 'ro')
 # x^2 + y^2 > 1, means (x, y) out of the cycle
 else:
                plt.plot(x, y, 'b*')
        mypi = 4.0 * total / n
 #plot the x, y and close it after 5 seconds
        plt.ion()
        plt.pause(5)
        plt.close()

        print('Iteration Times = ', n, 'PI estimate value = ', mypi)
        print('math.pi = ', math.pi)
        print('Errors = ', abs(math.pi - mypi) / math.pi)

用上述代码,我们用不同数量的随机点(100,100,0,10000)来计算 π π π。实验结果如下。PIestimate 表示估计值,Errors表示与标准π的差。

100个点时:PIestimate= 3.2,Errors= 0.0186。

1000个点时:PIestimate= 3.448,Errors= 0.0975。

10000个点:PIestimate= 3.486,Errors= 0.110。

由上述结果貌似会误导读者得到一个点越多反而估算越不准确的结论,这正是希望大家不要想当然的认为点越多越精确的直觉影响。但,总体而言,为什么没有达到点越多越精确,是因为我们的点还没有到某个量级。一般情况下,蒙特卡罗算法的特点是,采样越多,越近似最优解,而永远不是最优解。

三 算法的优缺点

其优点比较明显,尤其对于具有统计性质的问题可以直接进行解决,对于连续性的问题也不必进行离散化处理。其缺点也很显然,对于确定性问题转化成随机性问题做的估值处理,丧失精确性,得到一个接近准确的N值也不太容易。

四 算法的应用

蒙特·卡罗算法在数学、增强学习、金融工程学,宏观经济学,计算物理学等领域应用广泛。

求解积分问题

对被积分函数的变量在某一区间内进行随机均匀抽样,然后对抽样点的函数值求平均,从而可以得到函数积分的近似值。此种方法的理论基础是概率论的中心极限定理,其不随积分维数的改变而改变。

求解圆周率问题

蒙特卡罗方法可用于近似计算圆周率,如本例所示。

机器学习

蒙特卡洛算法也常用于机器学习,特别强化学习算法。一般情况下,针对得到的样本数据集创建相对模糊的模型,通过蒙特卡罗方法对于模型中的参数进行选取,使之于原始数据的残差尽可能的小,从而达到创建模型拟合样本的目的。

金融领域

用随机过程理论进行理论建模,在必要时使用蒙特卡罗算法对模型做数值模拟,比如预测未来收益和走势,感兴趣的读者可以阅读好文推荐的内容。当然,一个复杂的问题不可能依靠一个蒙特卡罗模拟就解决,需要大量的其他方法如随机过程、机器学习相关方法、博弈论涉及的方法等。

总结

蒙特卡罗算法的应用相当广泛,计算思想也十分简单,这种简单明了而性价比极高的算法是数学的无穷魅力之一。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code Writers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值