How to| 进行蒙特卡洛模拟

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

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

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

In[2]:=
Click for copyable input
Out[2]=

ListPlot 对数据做图:

In[2]:=
Click for copyable input
Out[2]=

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

In[3]:=
Click for copyable input
Out[3]=

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

In[4]:=
Click for copyable input
Out[4]=
In[5]:=
Click for copyable input
Out[5]=

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

In[13]:=
Click for copyable input
Out[13]=

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

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

In[36]:=
Click for copyable input

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

In[15]:=
Click for copyable input
Out[15]=

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

In[16]:=
Click for copyable input

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

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

In[17]:=
Click for copyable input

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

In[18]:=
Click for copyable input
Out[18]=
    

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

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

In[19]:=
Click for copyable input

查看生成的点:

In[20]:=
Click for copyable input
Out[20]=

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

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

In[21]:=
Click for copyable input
Out[21]=

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

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

In[22]:=
Click for copyable input

使用100万个点来近似 值:

In[23]:=
Click for copyable input
Out[23]=

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

In[24]:=
Click for copyable input
Out[24]=
    

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

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

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

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

In[25]:=
Click for copyable input

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

In[26]:=
Click for copyable input

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

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

In[27]:=
Click for copyable input

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

In[28]:=
Click for copyable input
Out[28]=

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

In[29]:=
Click for copyable input
Out[29]=

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

New to Mathematica? Find your learning path »
Have a question? Ask support »