首页 > 其他分享 >机器学习:蒙特卡罗方法

机器学习:蒙特卡罗方法

时间:2022-10-20 10:03:27浏览次数:68  
标签:count 机器 构型 学习 计算 随机 蒙特卡罗 方法


蒙特卡罗方法(英语:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和​​电子计算机​​​的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用​​随机数​​​(或更常见的​​伪随机数​​)来解决很多计算问题的方法。

20世纪40年代,在科学家​​冯·诺伊曼​​​(John von Neumann)、​​斯塔尼斯拉夫·乌拉姆​​​(Stanisław Marcin Ulam)和​​尼古拉斯·梅特罗波利斯​​​(Nicholas Constantine Metropolis)于​​洛斯阿拉莫斯国家实验室​​​为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在​​摩纳哥​​​的​​蒙特卡洛​​赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。

与它对应的是​​确定性算法​​。

蒙特卡罗方法在​​金融工程学​​​、​​宏观经济学​​​、​​生物​​​​医学​​​、​​计算物理学​​​(如​​粒子输运​​​计算、​​量子热力学​​​计算、​​空气动力学​​​计算)、​​机器学习​​等领域应用广泛。

基本思想[​​编辑​​]

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

另一种类型是所求解问题可以转化为某种随机分布的特征数,比如​​随机事件​​​出现的​​概率​​​,或者​​随机变量​​​的​​期望值​​​。通过随机抽样的方法,以随机事件出现的​​频率​​​估计其​​概率​​​,或者以​​抽样​​​的​​数字特征​​​估算​​随机变量​​​的​​数字特征​​,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。

假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。蒙特卡罗方法基于这样的思想:假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候,结果就越精确。借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。

工作过程[​​编辑​​]

 

使用蒙特卡罗方法估算π值. 放置30000个随机点后,π的估算值与真实值相差0.07%.

在解决实际问题的时候应用蒙特卡罗方法主要有两部分工作:

  1. 用蒙特卡罗方法模拟某一过程时,需要产生各种​​概率分布​​​的​​随机变量​​。
  2. 用统计方法把模型的​​数字特征​​估计出来,从而得到实际问题的数值解。

分子模拟计算的步骤[​​编辑​​]

使用蒙特卡罗方法进行分子模拟计算是按照以下步骤进行的:

  1. 使用​​随机数生成器​​​产生一个随机的分子​​构型​​。
  2. 对此分子构型的其中粒子坐标做无规则的改变,产生一个新的分子构型。
  3. 计算新的分子构型的能量。
  4. 比较新的分子构型与改变前的分子构型的能量变化,判断是否接受该构型。
  • 若新的分子构型能量低于原分子构型的能量,则接受新的构型,使用这个构型重复再做下一次​​迭代​​。
  • 若新的分子构型能量高于原分子构型的能量,则计算玻尔兹曼因子,并产生一个随机数。
  • 若这个随机数大于所计算出的​​玻尔兹曼因子​​,则放弃这个构型,重新计算。
  • 若这个随机数小于所计算出的玻尔兹曼因子,则接受这个构型,使用这个构型重复再做下一次迭代。
  1. 如此进行迭代计算,直至最后搜索出低于所给能量条件的分子构型结束。

在数学中的应用[​​编辑​​]

通常蒙特卡罗方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特卡罗方法是一种有效的求出数值解的方法。一般蒙特卡罗方法在数学中最常见的应用就是蒙特卡罗积分。下面是蒙特卡罗方法的两个简单应用:

积分[​​编辑​​]

非权重蒙特卡罗积分,也称确定性抽样,是对被积函数变量区间进行随机均匀抽样,然后对抽样点的函数值求平均,从而可以得到函数积分的近似值。此种方法的正确性是基于​​概率论​​​的​​中心极限定理​​。当抽样点数为m时,使用此种方法所得近似解的统计误差只与m有关(与

机器学习:蒙特卡罗方法_蒙特卡洛

正相关),不随积分维数的改变而改变。因此当积分维度较高时,蒙特卡罗方法相对于其他数值解法更优。

圆周率[​​编辑​​]

蒙特卡罗方法可用于近似计算圆周率:让计算机每次随机生成两个0到1之间的数,看以这两个实数为横纵坐标的点是否在单位圆内。生成一系列随机点,统计单位圆内的点数与总点数,(圆面积和正方形面积之比为PI:4,PI为圆周率),当随机点获取越多时,其结果越接近于圆周率(然而准确度仍有争议:即使取10的9次方个随机点时,其结果也仅在前4位与圆周率吻合​​[来源请求]​​)。用蒙特卡罗方法近似计算圆周率的先天不足是:第一,计算机产生的随机数是受到存储格式的限制的,是离散的,并不能产生连续的任意实数;上述做法将平面分割成一个个网格,在空间也不是连续的,由此计算出来的面积当然与圆或多或少有差距。

在机器学习中的应用[​​编辑​​]

蒙特卡洛算法也常用于机器学习,特别是​​强化学习​​的算法中。一般情况下,针对得到的样本数据集创建相对模糊的模型,通过蒙特卡洛方法对于模型中的参数进行选取,使之于原始数据的残差尽可能的小。从而达到创建模型拟合样本的目的。

机器学习:蒙特卡罗方法_随机数_02

蒙特卡洛方法python实例

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

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:表示总的投点数。

然后看一个求定积分的例子。

假设我们想求

机器学习:蒙特卡罗方法_迭代_03

的值。具体代码如下。

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

 

标签:count,机器,构型,学习,计算,随机,蒙特卡罗,方法
From: https://blog.51cto.com/u_15302822/5777693

相关文章

  • eBPF学习
    重要网站https://ebpf.io/https://www.bolipi.com/ebpf/index技术专题入门BPFandXDPReferenceGuideCO-REBPFCO-REreferenceguideBPF的可移植性和CO-RE......
  • 【机器学习】支持向量机分类
    前言支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。SVM尝试寻找一个最优决策边界,使距离两个类别最近的......
  • 机器学习中用随即森林(决策树)预测缺失值
    训练集和测试集的划分Ytrain:指的是缺失值那行所对应的有值的部分Ytest:指的是缺失值,需要预测的部分(一般的监督学习不会预测Ytest,因为我们是预测该缺失的数据,所以Ytest不用......
  • Vue面试题37:如何处理Vue项目中的错误?(总结自B站up主‘前端杨村长’视频,仅供自用学习)
    分析这是一个综合应用题目,在项目中我们常常需要将App的异常上报,此时错误处理就很重要了;这里要区分错误的类型,进而针对性做收集。然后将收集到的错误信息上报服务器;......
  • 学习记录17面对对象
    多态封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。将零散的数据和行为封装成一个整体继承:由于封装的东西越来越多,并且很多的属性和方法是重复的,代码复用性......
  • chap 5函数 第四小组 学习小结
      什么是函数?通俗易懂的来说,函数就是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。指的是独立......
  • 算法 - 线段树学习笔记
    前言:此文章为线段树基础知识可供学习参考咳咳,进入正题:我们在做题的时候可能会遇到给定一个数组同时给出一个值进行修改或是区间性的操作这里以单点修改和区间查询......
  • Chap4 循环结构 第八小组 学习心得
    循环结构的相应知识    循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环,是编程中必不可少......
  • 通过c语言逆向学习php
    通过c语言逆向学习php静态语言:需要编译器编译之后,生成一个机器能识别的语言,动态语言:shell-->把shell命令或者控制语句写入到某文件中,然后直接执行1:c语言是一个强类型......
  • 超几何函数学习笔记
    参考:具体数学1.超几何函数HYPERGEOMETPICFUNCTIONS定义:\[F\left(\begin{gathered}a_1,\cdots,a_m\\b_1,\cdots,b_n\end{gathered}\middle|z\right)=F(a_1,\cdots,a_m......