蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法
蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。


概念

蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值

通过一个简单的例子,可以帮助我们很快地了解。在中学的数学课上,学习概率的相关内容时,就有这样的题目:正方形内部有一个相切圆,若是往正方形区域扔一个小石头,其落在圆内的的概率是多少?

解答过程很简单,用圆的面积除以正方形的面积就行了,为 蒙特卡洛树 怎么反向传播_概率统计

那这跟蒙特卡罗方法有什么关系呢?现在已经知道了一个概率值,但是这里面有一个数其实是不确定的,那就是 蒙特卡洛树 怎么反向传播_蒙特卡洛树 怎么反向传播_02(一个无限不循环小数),如果让你求它的近似值(精确到某一位),该怎么做呢?

蒙特卡洛树 怎么反向传播_随机数_03


现在就轮到蒙特卡罗方法出场了,通过概率来求值,在正方形中随机放置大量的点,比如 10000 个,这样每一个点落在圆内的概率就是 蒙特卡洛树 怎么反向传播_概率统计,将落在圆内点的数量比上所有点的数量,就可以把这个概率的具体值求出来,再乘 4 就是 蒙特卡洛树 怎么反向传播_蒙特卡洛树 怎么反向传播_02

点的数量越多精确度就越高,在求解一些无精确值的问题时可以发挥很大的作用,比如一些曲线围成图形的面积、积分问题等。而均值是概率密度与自变量乘积的积分,期望就是均值,最优值往往接近或就是期望,所以蒙特卡罗就是求最优值的方法


案例解读

使用 MatLab 语言

求一个简单的面积问题:蒙特卡洛树 怎么反向传播_MatLab_06蒙特卡洛树 怎么反向传播_MatLab_07

x = 0:0.25:12;
y1 = x.^2;
y2 = 12-x;
plot(x, y1, x, y2)
xlabel('x');
ylabel('y');
legend('y1=x^2', 'y2=12-x');
title('绘制');
axis([0 15 0 15]);
text(3, 9, '交点');
grid on

% 随机生成点
x = unifrnd(0, 12, [1, 10000000]);
y = unifrnd(0, 9, [1, 10000000]);
frequency = sum(y<x.^2 & x<=3)+sum(y<12-x & x>=3);
area = 12*9*frequency/10^7

图形如下:

蒙特卡洛树 怎么反向传播_概率统计_08


结果:

蒙特卡洛树 怎么反向传播_蒙特卡洛树 怎么反向传播_09