文章转自:http://blog.csdn.net/xianlingmao/article/details/7768833
版权归原作者!

通常,我们会遇到很多问题无法用分析的方法来求得精确解,例如由于式子特别,真的解不出来;

一般遇到这种情况,人们经常会采用一些方法去得到近似解(越逼近精确解越好,当然如果一个近似算法与精确解的接近程度能够通过一个式子来衡量或者有上下界,那么这种近似算法比较好,因为人们可以知道接近程度,换个说法,一般一个近似算法被提出后,人们通常都会去考察或寻求刻划近似程度的式子)。

本文要谈的随机模拟就是一类近似求解的方法,这种方法非常的牛逼哦,它的诞生虽然最早可以追溯到18xx年法国数学家蒲松的投针问题(用模拟的方法来求解\pi的问题),但是真正的大规模应用还是被用来解决二战时候美国佬生产原子弹所碰到的各种难以解决的问题而提出的蒙特卡洛方法(Monte Carlo),从此一发不可收拾。

本文将分为两个大类来分别叙述,首先我们先谈谈随机模拟的基本思想和基本思路,然后我们考察随机模拟的核心:对一个分布进行抽样。我们将介绍常用的抽样方法,1. 接受-拒绝抽样;2)重要性抽样;3)MCMC(马尔科夫链蒙特卡洛方法)方法,主要介绍MCMC的两个非常著名的采样算法(metropolis-hasting算法和它的特例Gibbs采样算法)。

一. 随机模拟的基本思想

我们先看一个例子:现在假设我们有一个矩形的区域R(大小已知),在这个区域中有一个不规则的区域M(即不能通过公式直接计算出来),现在要求取M的面积? 怎么求?近似的方法很多,例如:把这个不规则的区域M划分为很多很多个小的规则区域,用这些规则区域的面积求和来近似M,另外一个近似的方法就是采样的方法,我们抓一把黄豆,把它们均匀地铺在矩形区域,如果我们知道黄豆的总个数S,那么只要我们数数位于不规则区域M中的黄豆个数S1,那么我们就可以求出M的面积:M=S1*R/S。

另外一个例子,在机器学习或统计计算领域,我们常常遇到这样一类问题:即如何求取一个定积分:, 如归一化因子等。

如何来求解这类问题呢?当然如果定积分可以解析求出,直接求出即可,如果不能解析求出,只能求取近似解了,常用的近似方法是采用蒙特卡洛积分,即把上述式子改写为:

那么把f(x)/g(x)作为一个函数,而把g(x)看做是[a,b]上的一个概率分布,抽取n个样本之后,上述式子可以继续写为:,当n趋向无穷大的时候,根据大数定理,上述式子是和要求的定积分式子是相等的,因此可以用抽样的方法来得到近似解。

通过上述两个例子,我们大概能够理解抽样方法解决问题的基本思想,其基本思路就是要把待解决的问题转化为一种可以通过某种采样方法可以解决的问题,至于怎么转化,还是挺有创造性,没有定法。因此随机模拟方法的核心就是如何对一个概率分布得到样本,即抽样(sampling)。因此下一节,我们将介绍常用的抽样方法。

(pku,sewm,shinning)

二. 常见的抽样方法

2.0 直接抽样法

略,因为较为简单,而且只能解决很简单的问题,一般是一维分布的问题。

2.1 接受-拒绝抽样(Acceptance-Rejection sampling)

又简称拒绝抽样,直观地理解,为了得到一个分布的样本,我们通过某种机制得到了很多的初步样本,然后其中一部分初步样本会被作为有效的样本(即要抽取的分布的样本),一部分初步样本会被认为是无效样本舍弃掉。这个算法的基本思想是:我们需要对一个分布f(x)进行采样,但是却很难直接进行采样,所以我们想通过另外一个容易采样的分布g(x)的样本,用某种机制去除掉一些样本,从而使得剩下的样本就是来自与所求分布f(x)的样本。

它有几个条件:1)对于任何一个x,有f(x)<=M*g(x); 2) g(x)容易采样;3) g(x)最好在形状上比较接近f(x)。具体的采样过程如下:

  1. 对于g(x)进行采样得到一个样本xi, xi ~ g(x);

  2. 对于均匀分布采样 ui ~ U(a,b);

  3. 如果ui<= f(x)/[M*g(x)], 那么认为xi是有效的样本;否则舍弃该样本; (# 这个步骤充分体现了这个方法的名字:接受-拒绝)

  4. 反复重复步骤1~3,直到所需样本达到要求为止。

这个方法可以如图所示:

(说明:这是从其他地方弄来的图,不是自己画的,符号有些和文中不一致,其中\pi(x) 就是文中的f(x),q(x)就是文中的g(x) )

2.2 重要性抽样(Importance sampling)

重要性采样和蒙特卡洛积分密切相关,看积分:

\inf f(x) dx = \inf f(x)(1/g(x))*g(x) dx, 如果g(x)是一个概率分布,从g(x)中抽取N个样本,上述的式子就约等于(1/N) \sum f(xi)*(1/g(xi))。这相当于给每个样本赋予了一个权重,g(xi)大意味着概率大,那么N里面含有这样的样本xi就多,即这些样本的权重大,所以称为重要性抽样。

抽样的步骤如下:

  1. 选择一个容易抽样的分布g(x), 从g(x)中抽取N个样本;
  2. 计算(1/N)* \sum f(xi)*(1/g(xi)),从而得到近似解。

(pku,sewm,shinning)

2.3 MCMC抽样方法

无论是拒绝抽样还是重要性采样,都是属于独立采样,即样本与样本之间是独立无关的,这样的采样效率比较低,如拒绝采样,所抽取的样本中有很大部分是无效的,这样效率就比较低,MCMC方法是关联采样,即下一个样本与这个样本有关系,从而使得采样效率高。MCMC方法的基本思想是:通过构建一个markov chain使得该markov chain的稳定分布是我们所要采样的分布f(x)。如果这个markov chain达到稳定状态,那么来自这个chain的每个样本都是f(x)的样本,从而实现抽样的目的。这里存在一个核心问题,如何构建满足要求的markov chain?(什么是markov chain,什么是稳定分布,请查资料,这里假设读者已知。)
在本文,我们介绍两个著名MCMC抽样方法,它们能够方便地构建满足要求的markov chain。

A). Metropolis-Hasting算法

这个算法是两个作者的合称,但不是同一篇论文的,一个是1953年,另外一个是197x年对1953年的工作进行了一些扩展,所以以这两位作者的名字来命名这个算法。

假设要采样的概率分布是\pi(x),现在假设有一个概率分布p(y|x),使得\pi(x)p(y|x) = \pi(y)*p(x|y)成立,称细致平衡公式,这个细致平衡公式是markov chain能达到稳定分布的必要条件。因此关键是构建出一个概率分布p(y|x)使得它满足细致平衡。现在假设我们有一个容易采样的分布q(y|x)(称为建议分布),对于目前的样本x,它能够通过q(y|x)得到下一个建议样本y,这个建议样本y按照一定的概率被接受或者不被接受,称为比率\alpha(x, y) = min{1, q(x|y)\pi(y)/[q(y|x)\pi(x)]}。即如果知道样本xi,如何知道下一个样本x_{i+1}是什么呢?就是通过q(y|xi)得到一个建议样本y,然后根据\alpha(xi, y)决定x_{i+1}=y 还是x_{i+1}=xi。可以证明分布q(y|x)\alpha(x,y)满足细致平衡,同时可以证明这样抽取得到的样本是分布\pi(x)的样本。具体的步骤如下:

  1. 给定一个起始样本x_0和一个建议分布q(y|x);

  2. 对于第i个样本xi,通过q(y|xi)得到一个建议样本y;计算比率\alpha(xi, y)= min{1, q(xi|y)\pi(y)/[q(y|xi)\pi(xi)]};

  3. 抽取一个均匀分布样本ui ~ U(0,1),如果ui <= \alpha(xi,y),则x_{i+1} = y;否则x_{i+1} = xi;

  4. 重复步骤2~3,直到抽取到想要的样本数量为止。

如果,建议分布q(y|x) 满足:q(y|x) = q(x|y),即对称,这个时候比率\alpha(x, y) = min{1, \pi(y)/\pi(x)}就是1953年最原始的算法,后来hasting把这个算法扩展了,不要求建议分布式对称的,从而得到了上述的算法。然而这个算法有一个缺点,就是抽样的效率不高,有些样本会被舍弃掉。从而产生了Gibbs算法。

B). Gibbs采样算法

Gibbs算法,很简单,就是用条件分布的抽样来替代全概率分布的抽样。例如,X={x1,x2,…xn}满足分布p(X),如何对p(X)进行抽样呢?如果我们知道它的条件分布p(x1|X_{-1}),…,p(xi|X_{-i}),….,其中X_{-i}表示除了xi之外X的所有变量。如果这些条件分布都是很容易抽样的,那么我们就可以通过对条件分布的抽样来对全概率分布p(X)进行抽样。

Gibbs采样算法的步骤:

  1. 给定一个初始样本X0={x10,x20,…,xn0}

2.已知一个样本Xi={x1i,x2i,…,xni},对于x1_{i+1}进行抽样,x1_{i+1} ~ p(x1|Xi_{-1})

  1. 对于x2_{i+1}进行抽样,x2_{i+1} ~ p(x2|x1_{i+1}, x3i,…xni)

……………………………………………………….

4.对于xn_{i+1}进行抽样,xn_{i+1} ~ p(xn|x1_{i+1}, x2_{i+1},…x_{n-1}_{i+1})

5.步骤2~4可以得到X的一个样本,然后重复步骤2~4可以不断地得到X的样本。

当然无论是metropolis-hasting算法还是gibbs算法,都有一个burn in的过程,所谓burn in的过程就是因为这个两个算法本身都是markov chain的算法,要达到稳定状态需要一定的步骤才能达到,所以需要一个burn in过程,只有在达到平衡状态时候得到的样本才能是平衡状态时候的目标分布的样本,因此,在burn in过程中产生的样本都需要被舍弃。如何判断一个过程是否达到了平衡状态还没有一个成熟的方法来解决,目前常见的方法是看是否状态已经平稳(例如画一个图,如果在较长的过程中,变化已经不大,说明很有可能已经平衡)当然这个方法并不能肯定一个状态是否平衡,你可以举出反例,但是却是实际中没有办法的办法。

可以证明Gibbs算法是metropolis-hasting算法的一个特例,即比率\alpha(x,y) = 1的一个特列。具体证明,此处略。

(pku,sewm,shinning)

随机模拟的基本思想和常用采样方法(sampling)相关推荐

  1. 【统计分析】(task5) 金融量化分析与随机模拟(通过随机模拟估计看涨期权的报酬分布)

    内容总结 学习datawhale的gitmodel教程.小郭为了锁定价格波动风险,签订合约即买进看涨期权:提前给榴莲超市2块权利金,现在榴莲30元一块(期权的标的资产),下个月能用20元买到一块榴莲( ...

  2. UA MATH575B 数值分析下 统计物理的随机模拟方法4

    UA MATH575B 数值分析下 统计物理的随机模拟方法4 这一讲介绍MCMC方法,这个方法最早出现在Metropolis在1953年发在J Chem Phys上的Equation of state ...

  3. 2021-04-09 随机模拟—蒙特卡洛方法 Matlab代码实现

    随机模拟-蒙特卡洛方法 Matlab代码实现 蒙特卡洛方法 蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出 ...

  4. 随机模拟_随机模拟可帮助您掌握统计概念

    随机模拟 模拟有助于提炼概念 (Simulation helps distilling concepts) 掌握与统计相关的概念可能很困难 (Grasping statistics-related c ...

  5. 蒙特卡洛随机模拟的MATLAB实例解析纪录

    蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法. 假设我们有个y=x^2的表达式,如何用MC方法求得函数在[0,1]区间的定积分呢 ...

  6. 基于启发式算法与单目优化和马尔科夫模型的进出口公司的货物装运策略——整数线性规划 随机模拟

    目录 进出口公司的货物装运策略 摘要 一.问题的重述 1问题的背景 2问题的提出 3目的及意义 二.符号说明 三.模型假设 四.建模准备与问题分析 4.1 线性整数规划 4.2 三维空间分割启发式算法 ...

  7. GitModel|Task04|随机模拟

    目录 动手学随机模拟 1. 如何通过随机模拟估计看涨期权的报酬分布 1.1 金融知识:股票与看涨期权 1.2 问题分析与确定建模思路 1.3 如何模拟股票价格:布朗运动 1.4 如何更真实地模拟股票价 ...

  8. 算法创作|烂头背枪双人情况游戏随机模拟

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 对于烂头背枪这个游戏,相信00后的同学并不陌生,这是幼时的回忆,这个游戏本身,有烂头,枪,虎 ...

  9. 蒙特卡洛随机模拟—综合评价

    文章目录 1 随机模拟型综合评价概述 2 基于随机模拟的综合评价步骤 2.1 问题描述 2.2 自主优势量矩阵计算 2.3 具体步骤 2.4 综合评价计算 3 Python实现 1 随机模拟型综合评价 ...

最新文章

  1. android 不同activity之间传递数据
  2. pycharm conda 环境 切换 linux_【Python专题(一)】python环境搭建
  3. 在sql当中为了让数据做缓存做with as的操作
  4. java程序的开发步骤为,开发与运行Java程序需要经过的三个主要步骤为: ( )、( )、( )...
  5. 获取request的json数组对象
  6. 杭电 4907 Task schedule ·
  7. R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
  8. IIS 如何用同一IP解析不同域名到同一服务器
  9. SpringCloud与Ribbon整合的时候是如何提供RestTemplate负载均衡功能?
  10. ACM算法竞赛入门 概述
  11. 企业信息化与BI系统建设规划
  12. 迅雷下载百度网盘的资源
  13. 史上最详细清样/校样(Proof)处理流程--Hindawi(二)
  14. word自动编号与文字间距太大怎么办
  15. EM算法在直线分类与灭点检测中的应用(关于一篇文章的读后感)
  16. No silver bullet——没有银弹理论
  17. mysql中where in用法
  18. 鼎捷t100架构_新合发集团借助鼎捷T100信息化全面升级!
  19. 关于录制短视频点播不能播放问题的总结
  20. 无法将maven 编译部署src/main/java下的资源文件

热门文章

  1. ISA Server 2004 SP2新特性(上)
  2. Oracle云安全服务半年收获100万用户
  3. CRLF line terminators导致shell脚本报错:command not found --转载
  4. phpstorm 10 注册码
  5. LeetCode 74. Search a 2D Matrix
  6. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现
  7. c/c++中指针数组和数组指针的区别
  8. keras可视化模型
  9. Django学习笔记---第一天
  10. web播放器-jwplayer