蒙特卡罗法(Python实现)

Hello,大家好,我是茶哩,我们来学习一个有意思的算法,蒙特卡罗方法。


蒙特卡罗法

  • 简介
  • 工作原理
  • 基本步骤
  • 求圆周率π的python实例

简介

蒙特卡罗法(统计模拟方法)是通过从概率模型的随机抽样进行近似数值计算的方法。蒙特卡罗是一个赌场的名字,是一类基于概率的模型的统称。

工作原理

  • 不断随机抽样
  • 逐渐逼近结果

一般来说,采样越多,越近似最优解,而永远不是最优解。

基本步骤

蒙特卡罗算法的基本步骤

蒙特卡罗算法一般分为三个步骤,包括构造随机的概率的过程,从构造随机概率分布中抽样,求解估计量。

1 构造随机的概率过程
要求解一个确定性的问题,需要事先构造一个概率过程,将其转化为随机性问题,即随机点落在圆内的概率,而π就是所要求的解。

2 从已知概率分布抽样
由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量,就成为实现蒙特卡罗方法模拟实验的基本手段。如本例中采用的就是最简单、最基本的(0,1)上的均匀分布,而随机数是我们实现蒙特卡罗模拟的基本工具。

3 求解估计量
实现模拟实验后,要确定一个随机变量,作为所要求问题的解,即无偏估计。建立估计量,相当于对实验结果进行考察,从而得到问题的解。如求出的近似π就认为是一种无偏估计。

求圆周率π的python实例

将一个单位圆(1x1)放在一个正方形中,通过计算圆的面积和正方形的面积之比,进而得到圆周率。
向该正方形随机散点,则每个点落在单位圆上的概率为 π ∗ 0. 5 2 π*0.5^2 π0.52 / 1 ∗ 1 1*1 11=0.25π,假设总散点数为S,落在圆内的点数为N。只要实验次数足够多,就越逼近近似值。
因此,当 S 足够大时,我们可以简单认为:0.25π = N/S ,即π = 4N/S

import numpy as np
import random 

S = [1e4,1e5,1e6,1e7]# 试验总次数
r = 0.5 #半径

for i in S:
    N = 0 # 落在圆内的试验点的个数
    for j in range(int(i)):
        x = random.random() # 获取0-1之间的随机数
        y = random.random() # 获取0-1之间的随机数
        d = np.sqrt((x-0.5)**2+(y-0.5)**2) # 计算试验点到圆心的欧式距离的平方
        if d<=r: # 通过比较试验点到圆心的欧式距离与圆半径的大小,判断该点是否在圆内
            N+=1
        else:
            pass
    PI = 4*N/i
    print("实验总次数:{}\tPI:{}".format(i,PI))

蒙特卡罗法(Python实现)_第1张图片
参考:
https://zhuanlan.zhihu.com/p/150729238


你可能感兴趣的:(数学建模常用模型【持续更新】,深入浅出机器学习,python,概率论,机器学习)