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

这篇具有很好参考价值的文章主要介绍了蒙特卡洛方法的数学基础-1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

概率论

Bayes 公式

常用分布

Binominal Distribution

Poisson Distribution

Gaussian Distribution 

Exponential Distribution

Uniform Distribution

蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

大数定理

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

中心极限定理

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

Monte Carlo方法简单应用

案例:Buffon 投针实验

案例:投点法求定积分

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

反函数直接抽样法

变换抽样法

dim=1

dim=2

改进的Maraglia方法
import numpy as np
import matplotlib.pyplot as plt

np.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)**2
    if w<=1:
        z[Times] = (-2*np.log(w)/w)**0.5        
        x[Times] = u * z[Times]
        y[Times] = v * z[Times]
        Times += 1
    else:
        continue

fig = 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")

蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

舍选抽样法

...

复合抽样法


蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

  • 依据概率密度函数抽样
  • 依然条件概率密度函数抽样

加分布与减分布抽样法

  • 加分布抽样

其中蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

  • 取\zeta \sim U[0,1],解对n的不等式
  • 对,对应的hn(x) 抽样得 \zeta = \zeta_{h_n}
  • 减分布抽样

乘加与乘减分布抽样法

...

反函数近似抽样法

近似替代

最小二乘拟合 蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

极限近似法

...

蒙特卡洛方法处理定积分

近似积分公式

  • 近似积分公式在某种意义上是对区间内某些函数值的加权平均
    • 蒙卡方法的目的是优化样本点的选择(位置和权重)
  • 矩形积分方法(The Leftpoint Rule)
    • 1阶近似
  • 矩形积分方法(The Rightpoint Rule)
    • 1阶近似
  • 矩形积分方法蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy(The Midpoint Rule)
    • 2阶近似
  • 梯形积分方法蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy(The Trapezoidal Rule)
    • 2阶近似
  • Simpson's Rule 蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy
    • 4阶近似

蒙特卡洛积分思路

  • iid 
    • independent and identically distributed

  • example 

蒙特卡洛方法的数学基础-1,# 蒙特卡洛方法,python,算法,数学建模,抽象代数,numpy

import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate

np.random.seed(0)
a = 0
b = 5
N = 100000

f = 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 *= -1
        
    elif flag == -1:
        result3 += 2*f(X[i])
        flag *= -1

    else:
        print("ERROR!")
        
result3 *= (b-a)/N/3

print("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 integrate

np.random.seed(0)
a = 0
b = 5
N = 100000

f = 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/3

print("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 time

np.random.seed(0)
a = 0
b = 5
N = 100000

f = 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) + a
    ybar = sum(f(points))/N
    Sbar = (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 *= coeff
    result3 = 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
>>> 
文章来源地址https://www.toymoban.com/news/detail-732534.html

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

到了这里,关于蒙特卡洛方法的数学基础-1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蒙特卡洛方法的收敛性和误差

    目录 1.收敛性 2.误差 3.减少方差的各种技巧 4.效率 5.优缺点 蒙特卡罗方法作为一种计算方法,其收敛性与误差是普遍关心的一个重要问题。由此可以总结出蒙特卡洛方法的优缺点。

    2024年02月06日
    浏览(40)
  • Python学习28:计算圆周率——蒙特卡洛法

    描述 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 蒙特卡洛(M

    2024年02月08日
    浏览(50)
  • 强化学习9——免模型预测算法介绍(蒙特卡洛方法和时步差分方法)

    对于大部分情况来说,环境是未知的,也就是说状态转移概率未知,对于这种情况的算法称为 免模型预测 算法。免模型算法与环境不断交互学习,但是需要大量的运算。 蒙特卡罗方法通过重复随机抽选,之后运用统计概率此方法来从抽样结果中归纳我们想要得到的数值估计

    2024年02月02日
    浏览(47)
  • 【Python】项目管理中蒙特卡洛模拟的Python实现(进度管理的例子)

    周末从早到晚讲了一天~ 一不小心搞得田辛老师都断更了。 今天呢,田辛老师来给大家继续讲一个著名的项目管理工具:蒙特卡洛模拟。 当然,田辛老师既然发到CSDN上面,无论如何要给出关于蒙特卡洛模拟的Python实现啦。 下面就是我们今天的代码执行结果。 蒙特卡洛模拟是

    2024年02月02日
    浏览(46)
  • 蒙特卡洛算法

    定义 :蒙特卡洛算法是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解,故又称随机抽样法或统计实验法。 适用范围 :可以较好的解决多重积分计算、微分方程求解、积

    2024年02月11日
    浏览(66)
  • 蒙特卡洛算法详解

    蒙特卡洛算法是20世纪十大最伟大的算法之一,阿法狗就采用了蒙特卡洛算法。 蒙特卡洛方法也称为 计算机随机模拟方法,它源于世界著名的赌城——摩纳哥的Monte Carlo(蒙特卡洛)。 它是基于对大量事件的统计结果来实现一些确定性问题的计算。其实质就是将问题转化为一个

    2024年02月02日
    浏览(48)
  • 蒙特卡洛树搜索(MCTS)详解

    蒙特卡洛树搜索是一种经典的树搜索算法,名镇一时的 AlphaGo 的技术背景就是结合蒙特卡洛树搜索和深度策略价值网络,因此击败了当时的围棋世界冠军。它对于求解这种大规模搜索空间的博弈问题极其有效,因为它的核心思想是 把资源放在更值得搜索的分枝上 ,即 算力集

    2024年01月18日
    浏览(58)
  • 【机器学习】强化学习(三)蒙特卡洛算法

    策略迭代算法和价值迭代算法为什么可以得到理论上的最优解,在实际问题中使用价值有限? 无模型算法 三、蒙特卡洛算法 蒙特卡洛(Monte Carlo)方法是一种基于样本的强化学习算法,它通过执行和学习代理(也就是我们编程的AI)环境交互的样本路径来学习。它不需要初始知

    2024年01月19日
    浏览(57)
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块

          猛戳订阅!  👉 《一起玩蛇》🐍 💭 写在前面: 本篇博客将介绍经典的伪随机数生成算法,我们将  重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Python 的 random 模块。   本篇博客还带有练习,无聊到喷水的练习,咳咳…… 学完前

    2024年02月04日
    浏览(48)
  • 多数问题求解之蒙特卡洛与分治法

    多数问题(Majority Problem)是一个有多种求解方法的经典问题,其问题定义如下: 给定一个大小为 n n n 的数组,找出其中出现次数超过 n / 2 n/2 n /2 的元素 例如:当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] [5, 3, 5, 2, 3, 5, 5] [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] ,则 5 5 5 是多数(majority)。 本文将

    2024年03月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包