初学者都能看懂的蒙特卡洛方法以及python实现

2023-05-16

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
经常有同学私信或留言询问相关问题,V号bitcarmanlee。github上star的同学,在我能力与时间允许范围内,尽可能帮大家解答相关问题,一起进步。

1.什么是蒙特卡洛方法(Monte Carlo method)

蒙特卡罗方法也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
20世纪40年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。
与它对应的是确定性算法。

2.蒙特卡洛方法的基本思想

通常蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。

3.蒙特卡洛求定积分

蒙特卡洛方法的一个重要应用就是求定积分。来看下面的一个例子(参考文献2)
这里写图片描述

当我们在[a,b]之间随机取一点x时,它对应的函数值就是f(x)。接下来我们就可以用f(x) * (b - a)来粗略估计曲线下方的面积,也就是我们需要求的积分值,当然这种估计(或近似)是非常粗略的。
这里写图片描述

在此图中,做了四次随机采样,得到了四个随机样本 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,并且得到了这四个样本的 f ( x i ) f(x_i) f(xi)的值分别为 f ( x 1 ) , f ( x 2 ) , f ( x 3 ) , f ( x 4 ) f(x_1), f(x_2), f(x_3), f(x_4) f(x1),f(x2),f(x3),f(x4)。对于这四个样本,每个样本能求一个近似的面积值,大小为 f ( x i ) ∗ ( b − a ) f(x_i)*(b-a) f(xi)(ba)。为什么能这么干么?对照图下面那部分很容易理解,每个样本都是对原函数f的近似,所以我们认为 f ( x ) f(x) f(x)的值一直都等于 f ( x i ) f(x_i) f(xi)

按照图中的提示,求出上述面积的数学期望,就完成了蒙特卡洛积分。

如果用数学公式表达上述过程:
S = 1 4 ( f ( x 1 ) ( b − a ) + f ( x 2 ) ( b − a ) + f ( x 3 ) ( b − a ) + f ( x 4 ) ( b − a ) ) = 1 4 ( b − a ) ( f ( x 1 ) + f ( x 2 ) + f ( x 3 ) + f ( x 4 ) ) = 1 4 ( b − a ) ∑ i = 1 4 f ( x i ) \begin{aligned} S & = \frac{1}{4}(f(x_1)(b-a) + f(x_2)(b-a) + f(x_3)(b-a) + f(x_4)(b-a)) \\ & = \frac{1}{4}(b-a)(f(x_1) + f(x_2) + f(x_3) + f(x_4)) \\ & = \frac{1}{4}(b-a) \sum_{i=1}^4 f(x_i) \end{aligned} S=41(f(x1)(ba)+f(x2)(ba)+f(x3)(ba)+f(x4)(ba))=41(ba)(f(x1)+f(x2)+f(x3)+f(x4))=41(ba)i=14f(xi)

对于更一般的情况,假设要计算的积分如下:
I = ∫ a b g ( x ) d x I = \int _a ^ b g(x) dx I=abg(x)dx
其中被积函数 g ( x ) g(x) g(x)在[a,b]内可积。如果选择一个概率密度函数为 f X ( x ) f_X(x) fX(x)的方式进行抽样,并且满足 ∫ a b f X ( x ) d x = 1 \int _a ^ b f_X(x)dx = 1 abfX(x)dx=1,那么令 g ∗ ( x ) = g ( x ) f X ( x ) g^*(x) = \frac{g(x)}{f_X(x)} g(x)=fX(x)g(x),原有的积分可以写成如下形式:
I = ∫ a b g ∗ ( x ) f X ( x ) d x I = \int _a ^ b g^*(x) f_X(x)dx I=abg(x)fX(x)dx

那么我们求积分的步骤应该是:
1.产生服从分布律 F X F_X FX的随机变量 X i ( i = 1 , 2 , ⋯   , N ) X_i(i = 1, 2, \cdots,N) Xi(i=1,2,,N)
2.计算均值
I ‾ = 1 N ∑ i = 1 N g ∗ ( X i ) \overline I = \frac{1}{N} \sum_{i = 1}^N g^*(X_i) I=N1i=1Ng(Xi)
此时有 I ‾ ≈ I \overline I \approx I II

当然实际应用中,我们最常用的还是取 f X f_X fX为均匀分布:
f X ( x ) = 1 b − a , a ≤ x ≤ b f_X(x) = \frac{1}{b - a}, a \le x \le b fX(x)=ba1,axb
此时
g ∗ ( x ) = ( b − a ) g ( x ) g^*(x) = (b-a)g(x) g(x)=(ba)g(x)
代入积分表达式有:
I = ( b − a ) ∫ a b g ( x ) 1 b − a d x I = (b-a) \int_a^b g(x) \frac{1}{b-a}dx I=(ba)abg(x)ba1dx

最后有
I ‾ = b − a N ∑ i = 1 N g ( X i ) \overline I = \frac{b-a}{N}\sum_{i=1}^Ng(X_i) I=Nbai=1Ng(Xi)

如果从直观上理解这个式子也非常简洁明了:
在[a,b]区间上按均匀分布取N个随机样本 X i X_i Xi,计算 g ( X i ) g(X_i) g(Xi)并取均值,得到的相当于Y坐标值,然后乘以 ( b − a ) (b-a) (ba)为X坐标长度,得到的即为对应矩形的面积,即积分值。

4.蒙特卡洛方法python实例

首先看一个经典的用蒙特卡洛方法求 π \pi π值。

import random


def calpai():
    n = 1000000
    r = 1.0
    a, b = (0.0, 0.0)
    x_neg, x_pos = a - r, a + r
    y_neg, y_pos = b - r, b + r

    count = 0
    for i in range(0, n):
        x = random.uniform(x_neg, x_pos)
        y = random.uniform(y_neg, y_pos)
        if x*x + y*y <= 1.0:
            count += 1

    print (count / float(n)) * 4

简单介绍下思路:
正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生n个点,计算它们与中心点的距离,并且判断是否落在圆的内部。若这些点均匀分布,则圆周率 pi=4 * count/n, 其中count表示落到圆内投点数 n:表示总的投点数。

然后看一个求定积分的例子。
假设我们想求 ∫ 0 1 x 2 d x \int_0^1 x^2 dx 01x2dx的值。具体代码如下。

def integral():
    n = 1000000
    x_min, x_max = 0.0, 1.0
    y_min, y_max = 0.0, 1.0

    count = 0
    for i in range(0, n):
        x = random.uniform(x_min, x_max)
        y = random.uniform(y_min, y_max)
        # x*x > y,表示该点位于曲线的下面。所求的积分值即为曲线下方的面积与正方形面积的比。
        if x*x > y:
            count += 1

    integral_value = count / float(n)
    print integral_value

代码运行的结果为:

0.332665

由此可见,与解析值的结果误差还是比较小的。

参考文献:

1.https://zh.wikipedia.org/wiki/蒙地卡羅方法
2.http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/monte-carlo-methods-in-practice/monte-carlo-integration
3.https://blog.csdn.net/baimafujinji/article/details/53869358

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初学者都能看懂的蒙特卡洛方法以及python实现 的相关文章

  • docker 通过python方式调用YOLO镜像

    这篇blog记录下配置的yolov3的docker环境 xff08 cuda9 43 cudnn7 43 ubuntu16 04 xff09 可以pull我的镜像 已经pull在docker hub上了 docker pull cheney
  • IMAXB6充电器使用教程

    视频地址 xff1a http blog sina com cn s blog 130ac99cd0102vegw html 做个笔记 B6充电器介绍 xff1a B6充电器是一台多功能充电器 xff0c 它支持双输入 xff0c 是运用内
  • STM32寄存器_GPIO操作

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 模式配置寄存器CRL和CRH二 端口输入数据寄存器 GPIOx IDR x 61 A E 三 端口输出数据寄存器 GPI
  • 相机几何学——相机投影矩阵( Camera Projection Matrix)

    相机投影矩阵为P xff0c 是MTMC任务中每个标定好的摄像机所配备的参数 总是忘记关于它的基本性质 xff0c 现在写在这里 1 P矩阵的维度是3 4 2 相机成像过程可以描述为x 61 PX xff0c 其中X是一个4 1的向量 xf
  • ROS消息传递——std_msgs

    转自 xff1a ROS学习 xff08 四 xff09 ROS消息传递 std msgs 经常看到 xff1a from std msgs msg import String xff0c 这 std msgs 究竟是什么东西 xff0c
  • 多目录工程的CmakeLists.txt编写(自动添加多目录下的文件)

    实现类似于vs中工程的CMakeLists txt的编写 功能为main cpp调用hello cpp 的hello 函数 xff0c world cpp的world 函数 使用自动添加多目录下的文件 xff0c 用add library方
  • 最容易理解的对卷积(convolution)的解释

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学
  • 使用STM32F103做CAN的收发通信

    下面也是搭建嵌入式系统所必须的一个部分 参考网站 xff1a https www cnblogs com craigtao p 3645148 html https blog csdn net qq 29413829 article det
  • 解决matlab遇到的“错误使用 mex未找到支持的编译器或 SDK。”

    解决matlab遇到的 错误使用 mex未找到支持的编译器或 SDK 因为coco数据集转pascal数据集需要用到matlab的以下代码 xff1a span class token function mex span span clas
  • STM32开发 数据包环形队列

    目录 前言一 构建环形队列结构体二 队列初始化三 读写数据1 队列满判断2 队列空判断3 队列写入数据4 队列读取数据 四 实际使用 前言 环形队列的理论知识网上有很多文章 xff0c 这里我就仅通过代码分享一下使用经验 xff0c 在我的
  • 静态链接库lib和动态链接库ddl的区别和联系

    静态链接库lib和动态链接库ddl的区别 联系 xff1a 都是在链接阶段使用的 区别 xff1a 不同的是静态链接库中的代码会直接放到exe中 xff0c 而动态链接库在使用时才会被加载到这个exe执行的内存空间 xff0c 所以使用静态
  • 单片机与上位机的串行通信

    写在前面 这篇博客主要记录下单片机是如何通过TXD RXD与上位机进行数据交换的 先介绍下51单片机中与串口通信有关的各种寄存器 首先 xff0c 上位机如果要发送数据给单片机 xff0c 单片机接收到数据之后 xff0c 会存入到SBUF
  • 【C++知识】关于迭代器失效的几种情况

    前言 关于面试时有被问到过这类问题 xff0c 当时由于只一知半解 xff0c 回答的不是特别好 xff0c 所以今天自己特意来实验一下 希望能帮助大家有同样疑惑的人解答疑惑 xff01 目录 关于迭代器失效的几种情况 1 序列式容器迭代器
  • Yolov3+C+++opencv+VS2015成功检测

    nbsp 前言 nbsp nbsp nbsp 最近在用yolov3进行目标检测 也有一个多星期了 想把最近做出的一些成果记录下来 供大家参考下 我的运行环境是C opencv VS2015 yolov3 下面将简单介绍下yolo的一些思想
  • simulink之S函数

    s函数是system Function的简称 xff0c 用它来写自己的simulink模块 xff08 够简单吧 xff0c xff0c 详细的概念介绍大伙看帮助吧 xff09 可以用matlab C C 43 43 Fortran Ad
  • win10解决未安装任何音频输出设备

    最近刚刚更新了一下win10系统 xff0c 开始啥问题没有 xff0c 晚上睡觉关机后 xff0c 第二天开机 xff0c 小喇叭处有一个红叉 xff0c 显示未安装任何音频输出设备 查看了微软的官网以及百度了很多解决方法 xff0c 电
  • Quadcopter控制

    1 问题描述 四旋翼飞行器对角线上的两个电机旋转方向相同 xff0c 另一对与之旋转方向相反 这是使推力 xff0c 滚转 xff0c 俯仰 xff0c 偏航相互独立控制的必要条件 这可以使我们命令其中的一个动作而不影响其他动作 实际上 x
  • 入门级都能看懂的softmax详解

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学
  • LQR制导

    LQR制导 引言 在ardupilot中固定翼飞机横航向位置控制 xff08 制导律 xff09 采用L1制导律 xff0c 最近想将一些其他的控制理论用于ardupilot代码中 xff0c 通过ardupilot论坛 xff0c 看到已
  • 2022年度总结

    年度总结 参加工作的第一年很快就过去了 xff0c 从四月份离校到公司 xff0c 直到农历腊月27回家 xff0c 工作了9个月的时间 xff0c 总的来说工作和学习的差别还是很大的 xff0c 从学生到社畜的转换还是花了一段时间的 接下

随机推荐

  • HTTP基本认证

    在HTTP中 xff0c 基本认证 xff08 英语 xff1a Basic access authentication xff09 是允许http用户代理 xff08 如 xff1a 网页浏览器 xff09 在请求时 xff0c 提供 用
  • c# 设置代理服务器发送http请求

    span class token keyword using span span class token namespace System span span class token punctuation span span class
  • Blaze:高性能C++数学库

    Blaze xff1a 高性能C 43 43 数学库 本文译自 xff1a Blaze A high performance C 43 43 math library Blaze是一个用于密集和稀疏算法的开源 高性能 C 43 43 数学库
  • c/c++编译:使用CMAKE进行跨平台开发

    前言 本文介绍跨平台cmake的编写 xff0c 主要是linux和windows用cmake对项目的编译 这是一个通用模板 xff0c 能够应用到更加复杂的项目中 xff0c 项目例子用https blog csdn net qq 364
  • 对于应用层HTTP协议的学习

    lt start gt 在TCP IP协议栈中 xff0c HTTP协议处于应用层 xff0c 它在最顶层进行数据报转发给应用进程 xff0c 它是最靠近用户的那一层 它的默认端口号为80 HTTP协议是基于请求响应的协议 xff0c 那么
  • 编程开发环境搭建

    全部目录 下载 amp 安装官方下载Vs2019其它历史 版本下载 开始使用安装C 43 43 的工作负载 xff08 环境 xff09 打开vs后有这些模板创建出一个控制台应用程序更多参考文档 使用手册c 43 43 参考手册Visual
  • c++创建第一个控制台程序

    目录 创建控制台应用程序打印出Hello World 空项目创建vs自带打印的创建桌面向导 自定义创建 了解代码 抛转引玉减少为什么 什么是 include 它是预处理指令什么是iostream 它是c 43 43 标准库头件 编写前的了解
  • python3-操作SQLite、创建表、添加数据、查询数据

    SQLlte数据类型 SQLite能保存什么样的数据类型 可以保存空值 整数 浮点数 字符串和blob 什么是blob xff1f xff1f 是二进制大对象 例如图片 音乐 zip文件 什么是游标 游标是在数据库中用来移动和执行查询的对象
  • 初学者都能看懂的95%置信区间

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学
  • c# WindowForm练习项目主窗体设计

    窗体分割器 SpliContainer分割器 在项目主窗体分割成左右俩部分 设置边框线属性 MonthCalendar月历控件 添加程序所需要的按钮 退出 修改密码 添加会员 按钮 固定好左边的容器 组件 ImageList 按钮太多添加图
  • C#-WinForm班级下拉框数据绑定

    前台展示 后台方法 span class hljs keyword using span System span class hljs keyword using span System Collections Generic span c
  • C#--WinForm项目主窗体设计

    主窗体基本设置 大小 颜色 去边框 出现的位置 Panel控件 背景图 颜色 布局 xff1a Label标签 文本 字体 背景颜色 布局 按钮 布局 文本 字体颜色 背景色 底部panel 绑定控件边框 颜色 用label标签导入图标 S
  • C# -- 实现WinForm程序的密码修改

    修改窗体程序密码的示例 实现分析 前台弹出修改窗体 编写后台方法 xff0c 调用通用数据访问类Update方法 数据验证 xff0c 判断原密码是否与旧密码符合 xff0c 俩次输入的新密码是否一致 更新程序全局变量 前台弹出修改窗体 编
  • C#--WinForm--表格数据控件DataGridView--绑定模式

    官方文档 DataGridView控件提供了一种强大而灵活的以表格形式显示数据的方式 用户可以使用DataGridView控件来显示少量数据的只读视图 xff0c 也可以对其进行缩放以显示特大数据集的可编辑视图 扩展DataGridView
  • ASP.NET--网站配置、发布与部署

    网站发布前的配置信息 配置文件下载 网站发布的基本步骤 写好的项目 在本机上发布 打开目录查看 xff1a 部署网站 安装IIs 打开控制面板 程序和功能 启用或关闭Windows功能 安装后 返回控制面板 管理工具 双击打开 xff1a
  • c/c++ hash表 (哈希表、字典表)

    表 1 表 存储数据 key gt value 2 表存储数据结构的困难 怎么查找 一个一个key去比较去查找 xff1f 61 61 效率不高 3 Hash算法加快查找 将字符串的key 转成整数 使用整数找到对应的value Hash算
  • c/c++ UDP通讯

    UDP通讯 1 无连接的 不需要反复的确认和握手等待 根本不关心对方是否存在 2 不可靠 可能有丢包 和先发后到 3 UDP通讯快速 占用系统资源少 4 UDP提供作为传输层协议的最基本功能 将其他的交给用户自己来管理 UDP服务端 1 创
  • c#程序流程控制与调试技术

    If选择结构 为什么要使用关系运算符 简单If 选择结构1 逻辑运算符
  • 特征融合之基于贝叶斯理论的特征融合算法

    参考文献 xff1a 1 刘渭滨 邹智元 邢薇薇 模式分类中的特征融合方法 J 北京邮电大学学报 2017 04 5 12 2 Ma A J Yuen P C Lai J H Linear Dependency Modeling for C
  • 初学者都能看懂的蒙特卡洛方法以及python实现

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学