How to| 进行蒙特卡洛模拟

蒙特卡洛方法利用随机生成的数字或事件来模拟随机过程,并对复杂的结果进行估计. 例如,它可用于金融系统的建模,通信网络的模拟,以及在物理学中计算高维积分等. 蒙特卡洛模拟可以利用 Wolfram 语言内置的随机数生成函数直接构建.

随机数序列是一个非常简单的蒙特卡洛模拟. 例如,从均值为0的一个正态分布独立生成的随机数列表可以模拟白噪声的进程.

RandomVariateNormalDistribution 联合使用,生成一个数值序列,序列由20个服从均值为0、标准偏差为1的正态分布的数值组成:

ListPlot 对数据做图:

现在可以根据数据构建一个随机漫步过程:

将0追加于数列首位,使游走从零开始:

使用 Accumulate 将数据按依次叠加,然后用 ListLinePlot 对结果做图:

下述定义将前面的指令放在一起,您可以用于模拟多个随机漫步并分析它们的性质.

定义一个函数 randomWalk,它可生成长度为 n 的随机漫步:

这里,用 Table 创建五个长度均为100的随机漫步,然后用 ListLinePlot 实现它们的可视化:

现在,生成1000个长度均为100的游走. 由于不必看到输出,因此用一个分号(;)抑制其输出:

现在,您可以对随机漫步的各个方面进行描述性统计的计算. 这里分析的是每个游走的最终位置.

使用 [[ ]]Part 函数的简写形式)得到每个随机漫步的最终数据点:

计算这1000个随机漫步最终数据点的各种统计量:

    

蒙特卡洛方法也可用于常数或数值积分的近似求值. 例如,下面求 的近似值:具体方法是,在包围半径为1的圆环的正方形内生成随机点,然后利用正方形面积与圆面积的关系得到近似值.

在由{-1,-1}{1,1}界定的正方形内生成10,000个点:

查看生成的点:

要求 的近似值,将正方形面积乘以点落在以原点为圆心、半径为1的圆内的百分比.

将正方形的面积(4)乘以点在圆内的分数:

使用较多的点,或将多个近似值求平均,通常会得到较好的近似结果.

定义函数 approxPi,根据样本量为 的样本来近似 值:

使用100万个点来近似 值:

将50个来自大小为10000的样本的近似值进行平均来近似 值:

    

蒙特卡洛模拟非常适用于系统性质非常复杂的情形. 在进行贝叶斯分析时,您往往希望将分布混合,两种分布的参数前后相继生成一个二元分布. 由于个体分布是相关联的,点必须迭代生成,并插入另一个分布中,从而从二元分布中抽样.

这种混合类型称作吉布斯抽样器. 在一个迭代周期后,所产生的点将将接近混合分布. 迭代周期被称作预烧期(Burn-In Period).

比如,您可能有一个均值已知的正态分布,但标准偏差未知. 但您知道标准偏差服从一种 β 分布,该 β 分布的一个形状参数已知,而另一个形状参数与均值已知的正态分布相关.

定义一个函数,根据该正态分布产生随机数:

定义一个函数,生成该 β 分布的随机数. β 分布的第二个形状参数将是一个正态变量的绝对值:

可以对二元分布的点进行模拟,方法是首先选择正态标准偏差的开始值,然后按序产生正态和 β 分布的随机数. 正态变量利用正态标准偏差的开始值生成. 然后将该正态变量作为 β 分布的未知形状参数,从而产生一个 β 变量. 再然后将该 β 变量用作新正态分布的未知标准偏差,依次类推. 该过程进行一定次数的迭代后,最终的正态和 β 变量是模拟点的坐标.

以标准偏差.5作为开始值,并使用1000次迭代作为预烧期,产生500个点:

ListPlot 作出最终所得到的点的视图:

Histogram3D 实现点的密度的可视化:

用蒙特卡洛方法进行模拟的其它例子包括优化和高维迭代. NMinimizeNIntegrate 有使用这些技术进行优化和数值积分的方法.