本文主要介绍蒙特卡罗模拟算法,以及如何通过Python来模拟问题。

文章目录

  • 什么是蒙特卡罗(Monte Carlo)方法?
  • 案例1: π\piπ的计算
    • 如何使用蒙特卡罗方法计算圆周率π\piπ ?
    • Python模拟计算
  • 案例2: 定积分的计算
    • 问题描述
    • Python模拟计算
  • 案例3: 排队上厕所问题
    • 问题描述
    • Python模拟
  • 小结

什么是蒙特卡罗(Monte Carlo)方法?

蒙特卡罗(Monte Carlo)方法,又称随机抽样统计试验方法,是通过使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。

蒙特卡罗解题归结为三个主要步骤:

  1. 构造或描述概率过程;
  2. 实现从已知概率分布抽样;
  3. 建立各种估计量。

接下来我们介绍3个简单的案例,看一下如何在实际问题中应用这3个步骤进行求解。

案例1: π\piπ的计算

如何使用蒙特卡罗方法计算圆周率π\piπ ?

正方形内部有一个相切的圆,假设圆形的半径为rrr,那么正方形的边长则为2r2r2r,因此,圆形和正方形的面积之比为:

πr24r2=π4\frac{\pi r^2}{4r^2} = \frac{\pi}{4} 4r2πr2​=4π​

现在,在正方形内部,随机产生一系列的点,计算他们与中心点的距离,从而判断是否落在圆的内部,从而:

落在圆内部点数总点数=π4\frac{落在圆内部点数}{总点数} = \frac{\pi}{4} 总点数落在圆内部点数​=4π​

即可估算出圆周率π\piπ的大小。

Python模拟计算

Step1 构造或描述概率过程

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circler = 1  # 半径
a, b = (0.0, 0.0)  # 圆心# 正方形边界
xmin, xmax = a-1, a+1
ymin, ymax = b-1, b+1

Step2 实现从已知概率分布抽样

由于每个点落入不同位置的概率是一致的,所以我们使用均匀分布进行抽样。

# 随机抽取n个点
n = 10000# 在正方形范围内,随机抽取n个点
x = np.random.uniform(xmin, xmax, n)
y = np.random.uniform(ymin, ymax, n)

Step3 建立各种估计量

# 计算每个点到圆心的距离
d = np.sqrt((x - a) ** 2 + (y - b) ** 2)
# 圆内点的个数
res = sum(np.where(d<r, 1, 0))  # 距离小于半径即为圆内# pi
pi = res / n * 4

模拟结果:

3.1572

可以看到,模拟结果和π\piπ还是比较接近的,我们可以通过增大样本点的个数nnn,使得这个估计结果更加精确。

把所有点画出来:

# 绘制正方形
fig = plt.figure(figsize=(10, 10))
axes = fig.add_subplot(1, 1, 1)
plt.plot(x, y, 'ro', markersize=1)
plt.axis('equal')# 绘制圆形
circle = Circle(xy=(a, b), radius=r, alpha=0.5, color='gray')
axes.add_patch(circle)
plt.grid(True, linestyle='--', linewidth=0.8)

案例2: 定积分的计算

问题描述

计算y=x2y=x^2y=x2在[0, 1]区间的定积分,也就是下图中的阴影面积大小。

按照蒙特卡罗模拟的思想,我们可以计算有多少点落在积分范围内(判断条件高度y<x2y \lt x^2y<x2),落在阴影范围内的点数跟所有抽样点数的比值就是所要求的积分值。

Python模拟计算

Step1 构造或描述概率过程

# 正方形边界
xmin, xmax = 0.0, 1.0
ymin, ymax = 0.0, 1.0# 函数曲线
def f(x):return x ** 2

Step2 实现从已知概率分布抽样

由于每个点落入不同位置的概率是一致的,所以我们使用均匀分布进行抽样。

# 随机抽取n个点
n = 10000# 在正方形范围内,随机抽取n个点(均匀分布)
x = np.random.uniform(xmin, xmax, n)
y = np.random.uniform(ymin, ymax, n)

Step3 建立各种估计量

# 统计落在函数图像下方点的数目
res = sum(np.where(y < f(x), 1, 0)) # 计算积分的近似值
integral = res / n

模拟结果:

0.3302

我们实际计算一下,跟模拟结果进行对比:

∫01x2dx=13x3∣01=13\int_0^1 x^2dx = \frac{1}{3}x^3\bigg|_0^1 = \frac{1}{3} ∫01​x2dx=31​x3∣∣∣∣​01​=31​

可以看到模拟结果还是相对准确的。

把所有点画出来:

# 绘制正方形
fig = plt.figure(figsize=(10, 10))
axes = fig.add_subplot(1, 1, 1)
plt.plot(x, y, 'ro', markersize=1)
plt.axis('equal')# 绘制函数曲线
xi = np.linspace(0, 1, 100)
yi = xi ** 2
plt.plot(xi, yi, '--k')
plt.fill_between(xi, yi, 0, color='gray', alpha=0.5, label='area')  # 填充曲线下的区域

案例3: 排队上厕所问题

问题描述

一场电影结束后会有20个人想要上厕所,假设只有一个厕所,同时:

  • 这20个人会在0-10分钟内全部到达厕所;
  • 每个人上厕所的时间在1-3分钟之内;

求开始时间、结束时间、等待时间、上厕所时长和厕所空闲时间分布情况。

Python模拟

Step1 构造或描述概率过程

starting_time = [0] * num  # 每个人的开始时间
finish_time = [0] * num  # 每个人的结束时间
waiting_time = [0] * num  # 每个人的等待时间
empty_time = [0] * num  # 厕所的空闲时间

Step2 实现从已知概率分布抽样

num = 20  # 人数
arriving_time = np.random.uniform(0, 10, size=num)  # 到达厕所时长分布
arriving_time.sort()  # 按照到达厕所时间从小到大排序
working_time = np.random.uniform(1, 3, size=num)  # 上厕所时长分布

Step3 建立各种估计量

# 初始化第一个数据
starting_time[0] = arriving_time[0]
finish_time[0] = starting_time[0] + working_time[0]
waiting_time[0] = starting_time[0] - arriving_time[0]  # 0for i in range(1, num):last_people_finish_time = finish_time[i-1]# 到达时间早于上一个人的结束时间if arriving_time[i] < last_people_finish_time:starting_time[i] = last_people_finish_timewaiting_time[i] = last_people_finish_time - arriving_time[i]empty_time[i] = 0# 到达时间晚于等于上一个人的结束时间else:starting_time[i] = arriving_time[i]waiting_time[i] = 0empty_time[i] = arriving_time[i] - last_people_finish_timefinish_time[i] = starting_time[i] + working_time[i]

模拟结果可视化:

# 等待曲线
plt.plot(starting_time, label='starting')
plt.plot(finish_time, label='finish')
plt.plot(waiting_time, label='waiting')
plt.plot(empty_time, label='empty')
plt.plot(working_time, label='working')plt.legend()

小结

本文首先介绍蒙特卡罗模拟算法的思想,及其求解问题的3个步骤。

接着,通过3个简单的案例讲解了如何使用Python实现蒙特卡罗模拟算法。

说明:本文问题来源于网易云课堂的数据分析师(python)课程。

如何通过Python实现蒙特卡罗模拟算法相关推荐

  1. 基于蒙特卡罗模拟的股票风险价值VaR测算

    基于蒙特卡罗模拟的股票风险价值VaR测算 前言:如果各位观看博客的想学的,可以通过Tushare金融数据注册链接注册账号,在获得相关数据集,这是本人的分享链接注册后,我可以获得50积分,谢谢各位支持. ...

  2. 蒙特卡罗模拟——数学的“蛮”与“巧”

    Mathematics is principally a tool to meditate,rather than to compute. 数学主要是一种思考的工具,而不是计算工具. 蒙特卡罗模拟是现 ...

  3. 在 Python 中使用蒙特卡罗方法预测股票价格,使用蒙特卡罗模拟确定明年 SPY 最有可能的价格

    股票市场是历史上研究最多的领域之一.几十年来,人们一直在努力预测未来的价格.大多数人(如果不是全部)都在为这项任务而苦苦挣扎,因为股票市场是一个随机过程.由于其随机性,随机过程本质上很难或不可能准确预 ...

  4. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

  5. Python实现的导弹跟踪算法,燃!

    巴以冲突,想必都有关注. 有这么一个导弹拦截场面: 作者:半壶砂 https://www.cnblogs.com/halfsand/p/7976636.html 这里涉及拦截导弹的自动跟踪.最近,看到 ...

  6. python分子化学模拟_python简单实现gillespie模拟

    由于专业需求,需要做主方程的随机模拟.在网上并没有找到适合的Python实现,遂自己写了一个,分享一下源码.至于gillespie算法本身就不介绍了,有需要的读者自然会懂,没需要的读者不建议去懂. 源 ...

  7. python中文教程github_GitHub - Virile-Tao/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...

    Python 算法与数据结构视频教程 课程简介 数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛.目前关于 Python 算法和数据结构的系统中文资料比较欠缺, 笔者尝试录制视频 ...

  8. 蒙特卡罗模拟概述(Monte Carlo Simulation)

    Overview 蒙特卡洛(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于"随机数"的计算方法.这一方法源于美国在第二次世界大战中研制原子弹的"曼哈顿计 ...

  9. 蒙特卡洛粒子滤波定位算法_蒙特卡罗定位算法(基于粒子滤波的定位算法) ——原理、理解与仿真...

    1 算法原理 1.1 机器人定位问题 关于机器人定位,有三大问题,它们分别是: (1)"全局定位":指初始位置未知,机器人靠自身运动确定自己在地图中的位姿. (2)"位姿 ...

  10. python模拟淘宝登陆_【Python】selenium模拟淘宝登录

    # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By f ...

最新文章

  1. Mybatis操作主体流程
  2. selenium启动Firefox示例
  3. SAP XS Engine 里的 HANA live report metadata
  4. 注册表被黑客篡改 怎样修复_使用快速注册表黑客设置Office 2007配色方案
  5. no ip domain-lookup 什么意思
  6. 阅读目录(置顶)(长期科技领域知识)
  7. 查看远程Redis服务器的版本
  8. NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析
  9. Cisco ppp链路单双认证
  10. dw1820网卡支持linux吗,黑苹果驱动DW1820A无线网卡教程
  11. 机器视觉入门知识总结
  12. android屏幕测试工具,OLED屏幕纯色测试工具
  13. JAVA+=运算程序诡异事件
  14. Django REST framework学习笔记
  15. zabbix_get [71696]: Check access restrictions in Zabbix agent configuration
  16. YOLOv3目标检测算法——通俗易懂的解析
  17. java stackoverflowerror与outofmemoryerror区别
  18. 如何让联系人头像显示联系人姓名的第一个汉字
  19. InstallShield 2010打包安装程序,安装完成后执行某个程序
  20. php内存不够,php内存不足怎么办

热门文章

  1. 多元统计之因子分析模型及Python分析示例
  2. 基于卷积神经网络的mnist手写体识别
  3. 2022-2028年全球与中国基于汽车摄像头的ADAS行业深度分析
  4. win32实现两个透明窗口联动
  5. Win32屏幕保护程序
  6. 文档下载道客巴巴豆丁网原创力文档代下载Word PPT文件下载
  7. 如何判断函数极值点与拐点
  8. 入职与离职手续、五险一金、档案
  9. 不会安装Lomboz?直接下载eclipse JEE吧。
  10. U盘安装fedora 9