蒙特卡洛方法的数学基础-1

  • 蒙特卡洛方法的数学基础-1

概率论

Bayes 公式

P(A_i|B)=\frac{P(A_iB)}{P(B)}=\frac{P(B|A_i)P(A_i)}{\sum_j P(B|A_j)P(A_j)}

常用分布

Binominal Distribution

\begin{matrix} P(k)=\frac{N!}{k!(N-k)!}p^k(1-p)^{N-k}\\ E(k)=Np\\ D(k)=Np(1-p) \end{matrix}

Poisson Distribution

\begin{matrix} P(k)=\frac{\lambda^k}{k!}e^{-k}\\ E(k)=\lambda\\ D(k)=\lambda \end{matrix}

Gaussian Distribution N(X;\mu,\sigma)

\begin{matrix} f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{1}{2}\frac{(x-\mu)^2}{\sigma^2}}\\ \\ \end{matrix}

P(a\leq x\leq b)=\Phi(\frac{b-\mu}{\sigma})-\Phi(\frac{a-\mu}{\sigma})=2\Phi(\frac{b-\mu}{\sigma})-1

Exponential Distribution

\begin{matrix} f(x)=\frac{1}{\lambda}e^{-x/\lambda}\\ F(z)=1-e^{-z/\lambda}\\ \end{matrix}

Uniform Distribution

\begin{matrix} f(x)=\frac{1}{a-b}\\ E(x)=\frac{a+b}{2}\\ D(x)=\frac{(b-a)^2}{12} \end{matrix}

大数定理

  • 均匀概率分布随机地取N个数xi 函数值之和的算术平均收敛于函数的期望值
  • 算术平均收敛于真值

E(\bar{x})=E(x)=\mu

中心极限定理

  • n个相互独立分布各异的随机变量的 总和服从正态分布
  • 置信水平下的统计误差

N(\mu,\sigma^2)=\frac{1}{\sigma \sqrt{2\pi}}exp[\frac{-(x-\mu)^2}{2\sigma^2}]

D(\bar{x})=\frac{D(x)}{N}=\frac{\sigma^2}{N}

Monte Carlo方法简单应用

案例:Buffon 投针实验

案例:投点法求定积分

任意分布的伪随机变量的抽样

反函数直接抽样法

\begin{matrix} 0\leq F(x)=\int_{-\infty}^x f(x)dx \leq 1\\ def:\zeta =F(\eta) \\ \eta = F^{-1}(\zeta) \end{matrix}

变换抽样法

dim=1

\begin{matrix} f(x)dx=g(y)dy\\ g(y)=f(x^{-1}(y))\cdot \begin{Vmatrix} \frac{dx}{dy} \end{Vmatrix} \end{matrix}

dim=2

\begin{matrix} x=g_1(u,v)\,\,\,\ y=g_2(u,v)\\ f(x,y)=g(u(x,y),v(x,y))\cdot \begin{Vmatrix} \frac{\partial u}{\partial x} & \frac{\partial u}{\partial y}\\ \frac{\partial v}{\partial x} & \frac{\partial v}{\partial y} \end{Vmatrix} \end{matrix}

改进的Maraglia方法
import numpy as np
import matplotlib.pyplot as pltnp.random.seed(0)Num = 10000
x = np.zeros(Num)
y = np.zeros(Num)
z = np.zeros(Num)Times = 0
while Times < Num:u,v = np.random.rand(2)w = (2*u-1)**2 + (2*v-1)**2if w<=1:z[Times] = (-2*np.log(w)/w)**0.5        x[Times] = u * z[Times]y[Times] = v * z[Times]Times += 1else:continuefig = plt.figure(figsize=(12, 6))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)ax1.hist(x, np.arange(0, max(x), 1))
ax1.set_title("distribution x")ax2.hist(y, np.arange(0, max(y), 1))
ax2.set_title("distribution y")plt.savefig("3.jpg")

舍选抽样法

...

复合抽样法


f(x)=\int_{-\infty}^{+\infty}g(x|y)h(y)dy

  • 依据概率密度函数h(y)抽样y_h
  • 依然条件概率密度函数g(x|y_h)抽样x_g

\zeta_f=x_{g(x|y_h)}


加分布与减分布抽样法

  • 加分布抽样

f(x)=\sum_nh_n(x)p_n其中0<p_n<1,\sum_np_N=1,\int_{-\infty}^{+\infty}h_n(x)=1

  • 取\zeta \sim U[0,1],解对n的不等式

\sum_{i=1}^{n-1}p_i < \zeta \leq \sum_{i=1}^np_i

  • 对,对应的hn(x) 抽样得 \zeta = \zeta_{h_n}

  • 减分布抽样

乘加与乘减分布抽样法

...

反函数近似抽样法

近似替代F^{-1}(y)\approx Q(y)

最小二乘拟合 F^{-1}(y)\approx Q(y)=a+by+cy^2+\alpha (1-y)^2lny+\beta y^2ln(1-y)

极限近似法

...

蒙特卡洛方法处理定积分

近似积分公式

  • 近似积分公式在某种意义上是对区间内某些函数值的加权平均
    • 蒙卡方法的目的是优化样本点的选择(位置和权重)
  • 矩形积分方法\int_a^bf(x)dx\approx \sum_{i=1}^N f(x_{i-1})h(The Leftpoint Rule)
    • 1阶近似
  • 矩形积分方法\int_a^bf(x)dx\approx \sum_{i=1}^N f(x_{i})h(The Rightpoint Rule)
    • 1阶近似
  • 矩形积分方法\int_a^bf(x)dx\approx \sum_{i=1}^N f(\frac{x_{i}+x_{i-1}}{2})h(The Midpoint Rule)
    • 2阶近似
  • 梯形积分方法\int_a^bf(x)dx\approx \sum_{i=1}^{N-1} f(x_{i})h + \frac{h}{2}(f(x_0)+f(x_N))(The Trapezoidal Rule)
    • 2阶近似
  • Simpson's Rule \int_\alpha^\beta f(x)dx \approx \frac{\beta-\alpha}{6}[f(\alpha)+4f(\frac{\alpha+\beta}{2})+f(\beta)]
    • 4阶近似

蒙特卡洛积分思路

  • iid 
    • independent and identically distributed

\begin{matrix} I=\int_a^b g(x)dx\\ I=(b-a)\int_a^b g(x)\frac{dx}{b-a}\\ I=(b-a)<g(x)>,x\sim U[a,b]\\ I\approx(b-a)\frac{\sum_ig(x_i)}{N} \end{matrix}


\begin{matrix} I=(b-a)(\tilde{y}\pm \frac{\tilde{S}}{\sqrt{N}})\\ I=\tilde{I}\pm \tilde{\sigma}(\tilde{I}) \end{matrix}

  • example 

\int_a^b (x^2+e^x )dx

import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integratenp.random.seed(0)
a = 0
b = 5
N = 100000f = lambda x:x**2 + np.exp(x)
result1 = integrate.quad(f, a, b)points = np.random.rand(N)*(b-a) + a
ybar = sum(f(points))/N
Sbar = (sum((points-ybar)**2)/N)**0.5 
result2 = ((b-a)*ybar, (b-a)*Sbar/N**0.5)X = np.linspace(a, b, N+1)
result3 = f(X[0]) + f(X[N])
flag = 1
for i in range(1, N-1):if flag == 1:result3 += 4*f(X[i])flag *= -1elif flag == -1:result3 += 2*f(X[i])flag *= -1else:print("ERROR!")result3 *= (b-a)/N/3print("result1:", result1)
print("result2:", result2)
print("result3:", result3)

result1: (189.07982576924329, 2.099207760611269e-12)
result2: (188.98624801068067, 0.5586055984291508)
result3: 189.06826542000084
>>> 


  • 如何评价哩,只能说,蒙卡方法至少能积出正确的答案,关键是速度慢啊
  • 好吧,有人说是代码写得差,嗯 合理
  • 改一下
import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integratenp.random.seed(0)
a = 0
b = 5
N = 100000f = lambda x:x**2 + np.exp(x)
result1 = integrate.quad(f, a, b)points = np.random.rand(N)*(b-a) + a
ybar = sum(f(points))/N
Sbar = (sum((points-ybar)**2)/N)**0.5 
result2 = ((b-a)*ybar, (b-a)*Sbar/N**0.5)X = np.linspace(a, b, N+1)
result3 = f(X)
coeff = np.ones(N+1)
coeff[1::2] = 4
coeff[2::2] = 2
result3 *= coeff
result3 = sum(result3)result3 *= (b-a)/N/3print("result1:", result1)
print("result2:", result2)
print("result3:", result3)
  • 测一下用时吧,时间复杂度都是同阶的(大误,这是Python的numpy 特性)
import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate
import timenp.random.seed(0)
a = 0
b = 5
N = 100000f = lambda x:x**2 + np.exp(x)
s1 = time.time()
for i in range(100):result1 = integrate.quad(f, a, b)
e1 = time.time()s2 = time.time()
for i in range(100):points = np.random.rand(N)*(b-a) + aybar = sum(f(points))/NSbar = (sum((points-ybar)**2)/N)**0.5 result2 = ((b-a)*ybar, (b-a)*Sbar/N**0.5)
e2 = time.time()X = np.linspace(a, b, N+1)
coeff = np.ones(N+1)
coeff[1::2] = 4
coeff[2::2] = 2
s3 = time.time()
for i in range(100):result3 = f(X)result3 *= coeffresult3 = sum(result3)result3 *= (b-a)/N/3
e3 = time.time()print("result1:", result1, "used time:", round(e1 - s1, 2))
print("result2:", result2, "used time:", round(e2 - s2, 2))
print("result3:", result3, "used time:", round(e3 - s3, 2))

result1: (189.07982576924329, 2.099207760611269e-12) used time: 0.0
result2: (188.83626394308098, 0.5580722224407848) used time: 1.8
result3: 189.0827159885614 used time: 0.9
>>> 

  • 蒙卡在这里,精度低,速度慢......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于nRF7002-DK的NFC功能切换系统(nRF Connect SDK+NFC)

目录 项目介绍硬件介绍项目设计开发环境及工程目录总体流程图硬件初始化NFC功能实现文本记录安卓应用打开按键切换功能 功能展示项目总结 &#x1f449; 【Funpack2-6】基于nRF7002-DK的NFC功能切换系统 &#x1f449; Github: EmbeddedCamerata/nRF7002-DK-nfc-function-switc…

ADS放大器模型参数含义

ADS放大器模型参数含义 S21 : Forward Transmission Coefficient, use xj*y, polar(x,y), dbpolar(x,y) for complex value 增益&#xff0c;X是增益大小&#xff0c;y是相位 S11 : Forward Reflection Coefficient, use xj*y, polar(x,y), dbpolar(x,y), vswrpolar(x,y) for …

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

C语言——贪吃蛇小游戏

目录 一、ncurse 1.1 为什么需要用ncurse&#xff1a; 1.2 ncurse的输入输出&#xff1a; 1.2.1 如何使用ncurse&#xff1a; 1.2.2 编译ncurse的程序&#xff1a; 1.2.3 测试输入一个按键ncurse的响应速度&#xff1a; 1.3 ncurse上下左右键获取&#xff1a; 1.3.1 如…

TypeScript 从入门到进阶之基础篇(一) ts类型篇

系列文章目录 文章目录 系列文章目录前言一、安装必要软件二、TypeScript 基础类型1.基础类型之 数字类型 number2.基础类型之 字符串类型 string3.基础类型之 布尔类型 boolean4.基础类型之 空值类型 void5.基础类型之 null 、undefined类型6.基础类型之 任意类型 any &#x…

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…

canvas-绘图库fabric.js简介

一般情况下简单的绘制&#xff0c;其实canvas原生方法也可以满足&#xff0c;比如画个线&#xff0c;绘制个圆形、正方形、加个文案。 let canvas document.getElementById(canvas);canvas.width 1200;canvas.height 600;canvas.style.width 1200px;canvas.style.height 6…

R绘制箱线图

代码大部分来自boxplot()函数的帮助文件&#xff0c;可以通过阅读帮助文件&#xff0c;调整代码中相应参数看下效果&#xff0c;进而可以理解相应的作用&#xff0c;帮助快速掌握barplot()函数的用法。 语法 Usage(来自帮助文件) barplot(height, ...)## Default S3 method: …

就只说 3 个 Java 面试题

在面试时&#xff0c;即使是经验丰富的开发人员&#xff0c;也可能会发现这是一些很棘手的问题&#xff1a; 1、Java中“transient”关键字的用途是什么&#xff1f;如何才能实现这一目标&#xff1f; 在 Java 中&#xff0c;“transient”关键字用于指示类的特定字段不应包含…

使用RKDevTool将update.img完整镜像进行解包,得到单独分区的镜像

(1)使用开发工具高级功能的解包 导入xx.img,然后点击解包(2)在Output/Android/Image得到想要的image

Linux关于memory cgroup的几个要点

概述 本文讲述memory cgroup比较容易误解的一些逻辑&#xff0c;如果不太经常使用和解决问题的话&#xff0c;对于memory cgroup的认知会比较浅显&#xff1a;cgroup memory用来限制进程的内存使用&#xff0c;但是我们进一步想如下的问题&#xff1a; 进程的内存可以分很多类…

Vue的路由使用,Node.js下载安装及环境配置教程 (超级详细)

前言&#xff1a; 今天我们来讲解关于Vue的路由使用&#xff0c;Node.js下载安装及环境配置教程 一&#xff0c;Vue的路由使用 首先我们Vue的路由使用&#xff0c;必须要导入官方的依赖的。 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务https://www.bootcdn.cn/ <…

IP协议的相关特性

IP协议相关特性 报头结构 报文结构解释 4位版本号:指定IP协议的版本,对于IPV4来说,就是四位. 4位首部长度:IP头部的长度是多少个32bit,也就是Length4的字节数,4bit表示的最大的数是15,因此IP头部最大长度是60. 8位服务类型:3位优先权字段&#xff08;已经弃用&#xff09;&…

安全生产知识竞赛活动小程序界面分享

安全生产知识竞赛活动小程序界面分享

linux内核分析:进程通讯方式

信号 一旦有信号产生,我们就有下面这几种,用户进程对信号的处理方式。 1.执行默认操作。Linux 对每种信号都规定了默认操作,例如,上面列表中的 Term,就是终止进程的意思。Core 的意思是 Core Dump,也即终止进程后,通过 Core Dump 将当前进程的运行状态保存在文件里面…

Python画图系列——折线图

好看的折线图 import numpy as np import matplotlib.pyplot as plt# 生成随机数据 # np.random.seed(42) # 设置随机种子以确保可重复性 sample_numbers np.arange(1, 21) # 生成1到20的样本编号random_data np.random.rand(20) # 生成20个随机数&#xff0c;范围在0到1之…

淘宝商品详情数据采集

淘宝商品详情数据采集的方法如下&#xff1a; 确定采集目标&#xff1a;明确要采集的商品信息&#xff0c;如商品标题、价格、销量、评论、图片等。选择采集工具&#xff1a;可以选择Scrapy框架、Java的WebMagic框架等。编写爬虫程序&#xff1a;进入目标文件夹&#xff0c;输…

无涯教程-JavaScript - POWER函数

描述 POWER函数返回加到幂的数字的输出。 语法 POWER (number, power)争论 Argument描述Required/OptionalNumber 基数。 它可以是任何实数。 RequiredPowerThe exponent to which the base number is raised.Required Notes 可以使用" ^"运算符代替POWER来指示…