您的位置 首页 > 娱乐休闲

利用Python纯手工实现蒙特卡洛集成

一个著名的赌场启发技巧,用于数据科学,统计和所有科学。如何在Python中完成?

什么是蒙特卡洛积分?

实际上,蒙特卡洛是举世闻名的赌场的名称,该赌场位于举世闻名的法国里维埃拉摩纳哥城邦(也称为公国)的同名地区。

事实证明,赌场激发了著名科学家的思想,发明了一种有趣的数学技术来解决统计,数值计算,系统仿真中的复杂问题。

当时高浓缩铀中的链反应动力学为科学家们提供了难以想象的复杂理论计算。即使像约翰·冯·诺依曼(John Von Neumann),斯坦尼斯拉夫·乌兰(Stanislaw Ulam),尼古拉斯都会(Nicholas Metropolis)这样的天才头脑也无法以传统方式解决它。因此,他们转向了奇妙的随机数世界,让这些概率量驯服了最初难以处理的计算。

令人惊讶的是,这些随机变量可以解决计算问题,这阻碍了确定性确定性方法的发展。不确定因素实际上赢了。

就像蒙特卡洛游戏世界中的不确定性和随机性规则一样。这就是这种特殊绰号的灵感来源。

如今,它是广泛领域中使用的一种技术

  • 供应链物流
  • 药物开发
  • 统计学习和建模
  • 图像处理
  • 大型系统仿真
  • 天文学等

尽管获得了所有成功和名声,但基本构想却看似简单且易于展示。我们在本文中使用一组简单的Python代码对其进行演示。

这项技术的最早和最著名的用途之一是曼哈顿计划。

棘手的积分

尽管常规的蒙特卡洛模拟技术的范围要广泛得多,但在此我们特别关注蒙特卡洛积分技术。

它只不过是一种计算复杂的定积分的数值方法,它缺乏闭合形式的解析解。

我们要计算,

对于不确定形式的积分,要获得封闭形式的解决方案并非易事或完全不可能。但是数值逼近总是可以给我们定积分作为和。

这是函数的图

黎曼和

的总分类下有许多这样的技术。这个想法只是将曲线下的区域分成矩形或梯形小块,通过简单的几何计算对其进行近似,然后将这些分量求和。

为了简单说明,我展示了只有5个等距间隔的这种方案。

实际上,对于程序员朋友来说,有一个现成的,可以快速准确地进行此计算。

随机走会怎么样?

如果我告诉您不需要统一地选择间隔,并且实际上我可以完全概率地选择100%随机间隔来计算相同的积分该怎么办?

我选择的样本可能像这样……

或这个…

我们没有时间或范围来证明其背后的理论,但是可以证明,通过相当大量的随机抽样,我们实际上可以以足够高的精度计算积分!

我们只选择随机数(在限制之间),在这些点上评估函数,将它们加起来,然后按已知因子进行缩放。我们完了。

好。我们还在等什么?让我们用一些简单的Python代码来证明这一主张。

尽管获得了所有成功和名声,但基本构想却看似简单且易于展示。

Python代码

用简单的平均数代替复杂的数学

如果我们要计算以下形式的积分-任何积分,

我们只用以下平均值代替积分的"估计",

其中U代表0到1之间的统一随机数。请注意,我们如何通过简单地将一堆数字相加并取它们的平均值来代替复杂的积分过程!

在任何现代计算系统,编程语言甚至Excel之类的商业软件包中,您都可以使用此统一的随机数生成器。查看我有关此主题的文章,

如何从头开始生成随机变量(不使用库)

我们通过一个简单的伪随机数生成器算法,展示了如何使用它来生成重要的随机数…

我们只选择随机数(在限制之间),在这些点上评估函数,将它们加起来,然后按已知因子进行缩放。我们完了。

函数

这是一个Python函数,该函数接受另一个函数作为第一个参数,两个积分极限以及一个可选整数,以计算由参数函数表示的定积分。

该代码看起来可能与上面的等式(或您在教科书中可能看到的其他版本)略有不同。那是因为我通过在10个间隔内分布随机样本来使计算更加准确。

在我们的特定示例中,参数函数如下所示:

我们可以通过简单地将积分传递给monte_carlo_uniform()函数来计算积分,

如您所见,在这里,我们在积分极限a = 0和b = 4 之间抽取了100个随机样本。

无论如何,计算有多好?

该积分无法解析计算。因此,无论如何,我们需要将蒙特卡洛方法的准确性与另一种数值积分技术进行比较。in()为此,我们选择了Scipy 函数。

现在,您可能还在想- 随着采样密度的变化,精度会发生什么变化。这种选择显然会影响计算速度-如果选择降低的采样密度,则需要增加数量。

因此,我们在一定范围的采样密度下模拟了相同的积分,并将结果绘制在金标准之上-Scipy函数在下图中以水平线表示,

因此,我们在低样品密度阶段观察到一些小的扰动,但是随着样品密度的增加,它们会很好地平滑。在任何情况下,与Scipy函数返回的值相比,绝对误差都非常小-约为0.02%。

蒙特卡洛技巧绝妙地发挥了作用!

速度如何?

但这和Scipy方法一样快吗?更好?更差?

我们尝试通过运行100个运行的100个循环(总共10,000个运行)来找出并获取摘要统计信息。

在此特定示例中,蒙特卡洛计算的运行速度是Scipy积分方法的两倍!

尽管这种速度优势取决于许多因素,但可以肯定的是,在计算效率方面,蒙特卡洛技术并不算懈怠。

我们在低样品密度阶段观察到一些小扰动,但是随着样品密度的增加它们会很好地平滑

漂洗,重复,冲洗和重复…

对于像蒙特卡洛积分这样的概率技术,毋庸置疑,数学家和科学家几乎永远不会只停顿一次,而是要重复计算多次并取平均值。

这是来自10,000次运行实验的分布图。

如您所见,该图几乎类似于,这一事实不仅可以用来获取平均值,而且可以围绕该结果构造。


置信区间

4的正负2的置信区间是一个范围的值,我们可以肯定我们的真实值位于...

www.ma


特别适用于高维积分

尽管为了简单起见(出于教学目的),我们坚持使用单变量积分,但可以将同一思想轻松扩展到具有多个变量的高维积分。

与基于Riemann和的方法相比,Monte Carlo方法在这种更高的维度上尤为突出。对于蒙特卡洛方法,可以以更有利的方式优化样本密度,以使其更快地进行而不会影响准确性。

用数学术语来说,该方法的收敛速度与维数无关。在机器学习方面,当涉及复杂的积分计算时,蒙特卡洛方法是克服维数诅咒的最好朋友。

与基于Riemann和的方法相比,Monte Carlo方法在这种更高的维度上尤为突出。

总结

我们介绍了蒙特卡洛积分的概念,并说明了它与常规数值积分方法的区别。我们还展示了一组简单的Python代码,用于评估一维函数并评估技术的准确性和速度。

种类更广泛,令人兴奋,并以无所不在的方式用于与人工智能,数据科学和统计建模有关的领域。

例如,DeepMind著名的Alpha Go程序使用了Monte Carlo搜索技术,从而在游戏Go的高维空间中提高了计算效率。在实践中可以找到许多这样的例子。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“利用Python纯手工实现蒙特卡洛集成”边界阅读