蒙特卡罗方法

蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。

基本思想


当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。
工作过程
蒙特卡罗方法的解题过程可以归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。
蒙特卡罗方法解题过程的三个主要步骤:
(1)构造或描述概率过程
对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过 程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为 随机性质的问题。
(2)实现从已知概率分布抽样
构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的一个 概率分布是(0,1)上的均匀分布(或称矩形分布)。 随机数就是具有这种均匀分布的随机变量。 随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种分布的相互独立的随机变数序列。产生 随机数的问题,就是从这个分布的抽样问题。在计算机上,可以用物理方法产生 随机数,但价格昂贵,不能重复,使用不便。另一种方法是用 数学 递推公式产生。这样产生的序列,与真正的 随机数序列不同,所以称为伪随机数,或伪随机数序列。不过,经过多种 统计检验表明,它与真正的 随机数,或随机数序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是我们实现 蒙特卡罗模拟的基本工具。
(3)建立各种估计量
一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种 估计量,相当于对 模拟实验的结果进行考察和登记,从中得到问题的解。
数学应用:
通常蒙特·卡罗方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到 解析解或者根本没有解析解的问题,蒙特·卡罗方法是一种有效的求出 数值解的方法。一般蒙特·卡罗方法在数学中最常见的应用就是蒙特·卡罗积分。

应用领域


蒙特卡罗方法在 金融工程学, 宏观经济学,生物医学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算、核工程)等领域应用广泛。

工作过程


在解决实际问题的时候应用蒙特·卡罗方法主要有两部分工作:
1. 用蒙特·卡罗方法模拟某一过程时,需要产生某一概率分布的 随机变量。
2. 用 统计方法把模型的数字特征估计出来,从而得到实际问题的数值解。

分子模拟计算

使用蒙特·卡罗方法进行分子模拟计算是按照以下步骤进行的:
1. 使用随机数发生器产生一个随机的分子构型。
2. 对此分子构型的其中粒子坐标做无规则的改变,产生一个新的分子构型。
3. 计算新的分子构型的能量。
4. 比较新的分子构型于改变前的分子构型的能量变化,判断是否接受该构型。
若新的分子构型能量低于原分子构型的能量,则接受新的构型,使用这个构型重复再做下一次迭代。 若新的分子构型 能量高于原分子构型的能量,则计算玻尔兹曼因子,并产生一个 随机数。若这个随机数大于所计算出的玻尔兹曼因子,则放弃这个构型,重新计算。 若这个随机数小于所计算出的玻尔兹曼因子,则接受这个构型,使用这个构型重复再做下一次迭代。
5. 如此进行 迭代计算,直至最后搜索出低于所给 能量条件的分子构型结束。

项目管理

项目管理中蒙特·卡罗模拟方法的一般步骤是:
1.对每一项活动,输入最小、最大和最可能估计数据,并为其选择一种合适的先验分布模型;
2.计算机根据上述输入,利用给定的某种规则,快速实施充分大量的 随机抽样
3.对 随机抽样的数据进行必要的数学计算,求出结果
4.对求出的结果进行 统计学处理,求出最小值、最大值以及数学期望值和单位 标准偏差
5.根据求出的统计学处理数据,让计算机自动生成概率分布曲线和累积概率曲线(通常是基于 正态分布的概率累积 S曲线)
6.依据累积概率曲线进行项目 风险分析。

力学

在力学中,蒙特卡罗方法多被用来求解稀薄气体动力学问题,其中最为成功的是澳大利亚G.A.伯德等人发展的直接模拟统计试验法。此法通过在计算机上追踪几千个或更多的模拟分子的运动、碰撞及其与壁面的相互作用,以模拟真实气体的流动。它的基本假设与玻耳兹曼方程一致,但它是通过追踪有限个分子的空间位置和速度来代替计算真实气体中分布函数。模拟的相似条件是流动的克努曾数(K n)相等,即数密度与碰撞截面之积保持常数。对每个分子分配以记录其位置和速度的单元。在模拟过程中分别考虑分子的运动和碰撞,在此平均碰撞时间间隔内,分别计算分子无碰撞的运动和典型碰撞。若空间网格取得足够小,其中任意两个分子都可以互相碰撞。具体决定哪两个刚体分子相撞,是随机取一对分子,计算它们的相对速度,根据此值与最大相对速度的比值和随机取样比较的结果,来决定该对分子是否入选。碰撞后分子的速度根据特定分子模型的碰撞力学和随机取样决定。分子与壁面碰撞后的速度,则根据特定的反射模型和随机取样决定。对于运动分子的位置和速度的追踪和求矩可以得出气体的密度、温度、速度等一些感兴趣的宏观参量。而对于分子与壁面间的动量和能量交换的记录则给出阻力、举力和热交换系数等的数学期望值。    

内容来源:蒙特卡罗算法百度百科


--------------------相关摘录:内容来源于网络----------------------

最简单的例子就是算,随机产生点集,

蒙特卡罗也只是刚开始随机进行预测,但后面的每步迭代都有权重不同。

蒙特卡罗算法和蒙特卡罗方法有一些微妙的不同。本质上蒙特卡罗都指的是Monte Carlo,也就是一个很有名的大赌场,在概率论里边的意思近似等同于“随机”。下边简称为MC。

MC方法指的是用随机来计算一些确定性算法(deterministic algorithm)算起来麻烦/慢的东西。举一个例子,如果你要测量一只猫的体积,但是猫的表面那个曲线非常难以积分(...),而且这只猫高冷地拒绝了你想要把它泡到水里的请求,所以你选择了另一种途径:用一个能在空间中随机(uniformly)产生一种标志粒子的机器,让这个机器在一个包含了猫的正方体内随机产生粒子。假设粒子如果正好在猫的体内或者表皮(在数学上表皮体积为0所以你要去掉表皮也可以)的话,那么这个粒子就无法被观测到,否则就可以被观测到。假设正方体的体积为1立方米,而你在空间中产生了一万个点,最后观测到了9950个点,那么这只猫的体积就可以用这个MC算法测算为5立方分米。

当然了,除了测量猫的体积(?),MC方法还有很多其他的用途。一类非常常见的算法叫Markov Chain Monte Carlo(MCMC)。假设你要求一个概率分布的一些性质(比如均值,方差等等),但是这个概率分布没办法直接算,但是你可以构造一个Markov Chain,而这个Markov Chain的equilibrium distribution就是你想要算的那个概率分布。这时候,你只需要直接让这个Markov Chain跑一定的步数,然后进入equilibrium distribution,这时候你随机取一些作为样本,当抽取的数量足够的时候,就可以用这些样本来模拟最开始要算的概率分布,而你想要算的那些东西可以直接用样本分布来算。

计算机科学里边也有一类MC算法。很多用途广泛的算法是NP甚至复杂度更高的,这时候你想要算出一个确定性的解的话,需要的计算量非常的大,常常超出了你导师/上司能容忍的范围(...),有一些情况下,比如一些算一个数字是不是质数,或者是一些其他的决策问题,就可以用一个MC算法,用少很多的计算时间,来得到一个正确概率足够大(比如90%多一些,但是严格小于1)的解。


  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib.patches as mpatches
  4. import scipy.integrate as integrate
  5. '''''
  6. Monte Carlo method (蒙特卡洛方法,也有翻译成“蒙特卡罗方法”)是以概率和统计的理论、方法为基础的一种数值计算方法,
  7. 将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解,故又称随机抽样法或统计试验法。
  8. 上述就是蒙特卡洛方法的基本概念,比较抽象,下面结合实际工作中的理解,谈一谈对蒙特卡洛方法的一些认识。
  9. (1)数学家冯·诺伊曼(计算机之父)在20世纪40年代中期用驰名世界的赌城摩纳哥的蒙特卡洛来命名这种方法,
  10. 说明该方法与赌博中的随机性、概率性有着天然而密切的联系。几乎涉及到概率相关的复杂数值计算的领域(计算物理、经济金融、统计学、机器学习等)。
  11. (2)蒙特卡洛是一种方法或者说策略,没有什么高深的理论支撑(如果有理论也就只有概率论或统计学中的大数定律了)。
  12. 蒙特卡洛的基本原理简单描述是先大量模拟,然后计算一个事件发生的次数,再通过这个发生次数除以总模拟次数,得到想要的结果。
  13. 例如模拟投N次(随机样本数),统计同时出现6的次数C(C/N即是计算结果)。
  14. (3)蒙特卡洛方法可应用在很多场合(求的是近似解)。模拟样本数越大,越接近与真实值,同时样本数增加会带来计算量的大幅上升。
  15. 实例:蒙特卡洛方法求函数y=x^2在[0,2]区间的积分(即求面积)。
  16. 备注:直接用数学中的定积分公式算更简单精确。
  17. 该红色区域在一个2×4的正方形里面。使用蒙特卡洛方法,随机在这个正方形里面产生大量随机点(数量为N),
  18. 计算有多少点(数量为count)落在红色区域内(判断条件为y
  19. '''
  20. np.random.seed( 12345)
  21. x = np.linspace( 0, 2, 1000) # 绘制曲线
  22. y = x ** 2
  23. plt.plot(x, y)
  24. plt.fill_between(x, y, where=(y > 0), color= 'red', alpha= 0.5) # 填充颜色
  25. # plt.show()
  26. #模拟1000个随机点
  27. N = 1000
  28. points = [[xy[ 0] * 2, xy[ 1] * 4] for xy in np.random.rand(N, 2)]
  29. plt.scatter([x[ 0] for x in points], [x[ 1] for x in points], s= 5, c=np.random.rand(N), alpha= 0.5)
  30. plt.show()
  31. #计算落在红色区域的比重
  32. count = 0
  33. for xy in points:
  34. if xy[ 1] < xy[ 0] ** 2:
  35. count += 1
  36. print((count / N) * ( 2 * 4)) # 2.752
  37. print(integrate.quad( lambda x: x ** 2, 0, 2)[ 0])
  38. '''''
  39. 蒙特卡洛方法有一定的误差,误差的大小与模拟的样本大小直接相关,模拟样本越大,误差越小,但计算量也会大幅上升。
  40. 对于简单问题来说,蒙特卡洛是个“笨”办法。
  41. 但对于涉及复杂、不可解析函数或概率分布的模拟及计算,蒙特卡洛方法是个有效的方法,有时甚至是唯一可行的方法。
  42. '''
  43. '''''
  44. 实例2:套圈圈的游戏,想过为什么你总是套不上吗?用蒙特卡洛方法来算一算。
  45. 1.设物品中心点坐标为(0,0),物品半径为5cm。
  46. '''
  47. #
  48. circle_target = mpatches.Circle([ 0, 0], radius= 5, edgecolor= 'r', fill= False)
  49. plt.xlim( -80, 80)
  50. plt.ylim( -80, 80)
  51. plt.axes().add_patch(circle_target)
  52. # plt.show()
  53. '''''
  54. 2.设投圈半径8cm,投圈中心点围绕物品中心点呈二维正态分布,均值μ=0cm,标准差σ=20cm,模拟1000次投圈过程。
  55. 上图中红圈为物品,散点图为模拟1000次投圈过程中,投圈中心点的位置散布。
  56. 3.计算1000次投圈过程中,投圈套住物品的占比情况。
  57. '''
  58. N = 1000
  59. u, sigma = 0, 20
  60. points = sigma * np.random.randn(N, 2) + u
  61. plt.scatter([x[ 0] for x in points], [x[ 1] for x in points], c=np.random.rand(N), alpha= 0.5)
  62. plt.show()
  63. print(len([xy for xy in points if xy[ 0] ** 2 + xy[ 1] ** 2 < ( 8 - 5) ** 2]) / N)
  64. #输出结果:0.009,即投1000次,有9次能够套住物品,是小概率事件,知道你为什么套不住了吧。
  65. '''''
  66. 蒙特卡洛方法本身不是优化方法,
  67. 与遗传算法、粒子群算法等智能优化算法有相似之处,比如都属于随机近似方法,都不能保证得到最优解等,
  68. 但它们也有着本质的差别。
  69. 一是层次不一样,蒙特卡洛只能称之为方法,遗传算法等则属于仿生智能算法,比蒙特卡洛方法要复杂。
  70. 二是应用领域不同,蒙特卡洛是一种模拟统计方法,如果问题可描述成某种统计量的形式,就可以用蒙特卡洛方法解决;
  71. 遗传算法等适用于大规模的组合优化问题(选址问题、排班问题、管理调度、路线优化)等,及复杂函数求最值、参数优化等。
  72. '''

可以参考阅读的帖子:蒙特卡罗算法是什么?

阮一峰老师的蒙特卡罗算法入门

code - python - MC蒙特卡洛方法 

你可能感兴趣的:(蒙特卡罗方法)