集成|利用Python纯手工实现蒙特卡洛集成( 二 )


我们只选择随机数(在限制之间) , 在这些点上评估函数 , 将它们加起来 , 然后按已知因子进行缩放 。 我们完了 。
好 。 我们还在等什么?让我们用一些简单的Python代码来证明这一主张 。
尽管获得了所有成功和名声 , 但基本构想却看似简单且易于展示 。
Python代码 用简单的平均数代替复杂的数学
如果我们要计算以下形式的积分-任何积分 ,
集成|利用Python纯手工实现蒙特卡洛集成
本文插图

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

其中U代表0到1之间的统一随机数 。 请注意 , 我们如何通过简单地将一堆数字相加并取它们的平均值来代替复杂的积分过程!
在任何现代计算系统 , 编程语言甚至Excel之类的商业软件包中 , 您都可以使用此统一的随机数生成器 。 查看我有关此主题的文章 ,
如何从头开始生成随机变量(不使用库) 我们通过一个简单的伪随机数生成器算法 , 展示了如何使用它来生成重要的随机数…
我们只选择随机数(在限制之间) , 在这些点上评估函数 , 将它们加起来 , 然后按已知因子进行缩放 。 我们完了 。
函数
这是一个Python函数 , 该函数接受另一个函数作为第一个参数 , 两个积分极限以及一个可选整数 , 以计算由参数函数表示的定积分 。
集成|利用Python纯手工实现蒙特卡洛集成
本文插图

该代码看起来可能与上面的等式(或您在教科书中可能看到的其他版本)略有不同 。 那是因为我通过在10个间隔内分布随机样本来使计算更加准确 。
在我们的特定示例中 , 参数函数如下所示:
我们可以通过简单地将积分传递给monte_carlo_uniform()函数来计算积分 ,
如您所见 , 在这里 , 我们在积分极限a = 0和b = 4 之间抽取了100个随机样本 。
无论如何 , 计算有多好?
该积分无法解析计算 。 因此 , 无论如何 , 我们需要将蒙特卡洛方法的准确性与另一种数值积分技术进行比较 。 integrate.quad()为此 , 我们选择了Scipy 函数 。
现在 , 您可能还在想- 随着采样密度的变化 , 精度会发生什么变化 。 这种选择显然会影响计算速度-如果选择降低的采样密度 , 则需要增加数量 。
因此 , 我们在一定范围的采样密度下模拟了相同的积分 , 并将结果绘制在金标准之上-Scipy函数在下图中以水平线表示 ,
集成|利用Python纯手工实现蒙特卡洛集成
本文插图

因此 , 我们在低样品密度阶段观察到一些小的扰动 , 但是随着样品密度的增加 , 它们会很好地平滑 。 在任何情况下 , 与Scipy函数返回的值相比 , 绝对误差都非常小-约为0.02% 。
蒙特卡洛技巧绝妙地发挥了作用!
集成|利用Python纯手工实现蒙特卡洛集成
本文插图

速度如何? 但这和Scipy方法一样快吗?更好?更差?
我们尝试通过运行100个运行的100个循环(总共10,000个运行)来找出并获取摘要统计信息 。
集成|利用Python纯手工实现蒙特卡洛集成
本文插图

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

尽管这种速度优势取决于许多因素 , 但可以肯定的是 , 在计算效率方面 , 蒙特卡洛技术并不算懈怠 。
我们在低样品密度阶段观察到一些小扰动 , 但是随着样品密度的增加它们会很好地平滑
漂洗 , 重复 , 冲洗和重复…
对于像蒙特卡洛积分这样的概率技术 , 毋庸置疑 , 数学家和科学家几乎永远不会只停顿一次 , 而是要重复计算多次并取平均值 。


推荐阅读