How to| 进行蒙特卡洛模拟
随机数序列是一个非常简单的蒙特卡洛模拟. 例如,从均值为0的一个正态分布独立生成的随机数列表可以模拟白噪声的进程.
将 RandomVariate 与 NormalDistribution 联合使用,生成一个数值序列,序列由20个服从均值为0、标准偏差为1的正态分布的数值组成:
| In[1]:= | 
复制到剪切板 |
| Out[1]= | 
|
用 ListPlot 对数据做图:
| In[2]:= | 
复制到剪切板 |
| Out[2]= | 
|
现在可以根据数据构建一个随机漫步过程:
| In[3]:= | 
复制到剪切板 |
| Out[3]= | 
|
将0追加于数列首位,使游走从零开始:
| In[4]:= | 
复制到剪切板 |
| Out[4]= | 
|
| In[5]:= | 
复制到剪切板 |
| Out[5]= | 
|
使用 Accumulate 将数据按依次叠加,然后用 ListLinePlot 对结果做图:
| In[6]:= | 
复制到剪切板 |
| Out[6]= | 
|
下述定义将前面的指令放在一起,您可以用于模拟多个随机漫步并分析它们的性质.
定义一个函数 randomWalk,它可生成长度为 n 的随机漫步:
| In[7]:= | 
复制到剪切板 |
这里,用 Table 创建五个长度均为100的随机漫步,然后用 ListLinePlot 实现它们的可视化:
| In[8]:= | 
复制到剪切板 |
| Out[8]= | 
|
现在,生成1000个长度均为100的游走. 由于不必看到输出,因此用一个分号(;)抑制其输出:
| In[9]:= | 
复制到剪切板 |
现在,您可以对随机漫步的各个方面进行描述性统计的计算. 这里分析的是每个游走的最终位置.
使用 [[ ]](Part 函数的简写形式)得到每个随机漫步的最终数据点:
| In[10]:= | 
复制到剪切板 |
计算这1000个随机漫步最终数据点的各种统计量:
| In[11]:= | 
复制到剪切板 |
| Out[11]= | 
|
蒙特卡洛方法也可用于常数或数值积分的近似求值. 例如,下面求
的近似值:具体方法是,在包围半径为1的圆环的正方形内生成随机点,然后利用正方形面积与圆面积的关系得到近似值.
在由{-1,-1} 和 {1,1}界定的正方形内生成10,000个点:
| In[1]:= | 
复制到剪切板 |
查看生成的点:
| In[2]:= | 
复制到剪切板 |
| Out[2]= | 
|
要求
的近似值,将正方形面积乘以点落在以原点为圆心、半径为1的圆内的百分比.
将正方形的面积(4)乘以点在圆内的分数:
| In[3]:= | 
复制到剪切板 |
| Out[3]= | 
|
使用较多的点,或将多个近似值求平均,通常会得到较好的近似结果.
定义函数 approxPi,根据样本量为
的样本来近似
值:
| In[4]:= | 
复制到剪切板 |
使用100万个点来近似
值:
| In[5]:= | 
复制到剪切板 |
| Out[5]= | 
|
将50个来自大小为10000的样本的近似值进行平均来近似
值:
| In[6]:= | 
复制到剪切板 |
| Out[6]= | 
|
蒙特卡洛模拟非常适用于系统性质非常复杂的情形. 在进行贝叶斯分析时,您往往希望将分布混合,两种分布的参数前后相继生成一个二元分布. 由于个体分布是相关联的,点必须迭代生成,并插入另一个分布中,从而从二元分布中抽样.
这种混合类型称作吉布斯抽样器. 在一个迭代周期后,所产生的点将将接近混合分布. 迭代周期被称作预烧期(Burn-In Period).
比如,您可能有一个均值已知的正态分布,但标准偏差未知. 但您知道标准偏差服从一种 β 分布,该 β 分布的一个形状参数已知,而另一个形状参数与均值已知的正态分布相关.
定义一个函数,根据该正态分布产生随机数:
| In[1]:= | 
复制到剪切板 |
定义一个函数,生成该 β 分布的随机数. β 分布的第二个形状参数将是一个正态变量的绝对值:
| In[2]:= | 
复制到剪切板 |
可以对二元分布的点进行模拟,方法是首先选择正态标准偏差的开始值,然后按序产生正态和 β 分布的随机数. 正态变量利用正态标准偏差的开始值生成. 然后将该正态变量作为 β 分布的未知形状参数,从而产生一个 β 变量. 再然后将该 β 变量用作新正态分布的未知标准偏差,依次类推. 该过程进行一定次数的迭代后,最终的正态和 β 变量是模拟点的坐标.
以标准偏差.5作为开始值,并使用1000次迭代作为预烧期,产生500个点:
| In[3]:= | 
复制到剪切板 |
用 ListPlot 作出最终所得到的点的视图:
| In[4]:= | 
复制到剪切板 |
| Out[4]= | 
|
用 Histogram3D 实现点的密度的可视化:
| In[5]:= | 
复制到剪切板 |
| Out[5]= | 
|
用蒙特卡洛方法进行模拟的其它例子包括优化和高维迭代. NMinimize 与 NIntegrate 有使用这些技术进行优化和数值积分的方法.