首页 > 其他分享 >Markov Chain Monte Carlo(MCMC) 方法

Markov Chain Monte Carlo(MCMC) 方法

时间:2023-04-27 20:24:09浏览次数:49  
标签:Monte MCMC Chain frac 算法 alpha pi 马氏链

Monte Carlo 方法

假设我们要求一个原函数并不明确的函数\(f(x)\)的在某个区间\([a,b]\)上的积分

\(\theta = \int_{a}^b f(x)dx\)

因为\(f(x)\)的原函数不知道,所以无法用牛顿-莱布尼茨公式计算。这里采用一种称为monte carlo的方法来模拟近似求解,它的思想如下,首先将待求的式子化为

\(\theta = \int_a^b f(x)dx = \int_a^b \frac{f(x)}{p(x)}p(x)dx=E_{x\sim p(x)}[\frac{f(x)}{p(x)}]\)

这个式子将积分看做是随机变量\(\frac{f(x)}{p(x)}\)的期望,再由强大数定律有

\(\theta = E_{x\sim p(x)}[\frac{f(x)}{g(x)}] = \lim_{n \rightarrow \infty}\frac1n\sum_{i=0}^n \frac{f(x_i)}{p(x_i)}\quad (1)\)

上述式子成立要求\(\frac{f(x_i)}{p(x_i)}\)相互独立同分布(期望存在)。那么根据这个式子我们就可以独立地产生一组服从\(p(x)\)这个密度函数的随机数,然后按照上述等式最右边的式子来计算得到\(\theta\)的估计值. 这种思想就是Monte Carlo方法的核心思想。

现在一个问题就是如何产生一组服从特定密度函数\(p(x)\)的相互独立的随机数,而MCMC方法可以解决这个问题
PS: 实际上这里的独立性要求其实不需要,因为可以证明以\(P(x)\)为平稳概率的马氏链满足上面的(1)式(也就是说尽管不一定有\(\frac{f(x_i)}{p(x_i)}\),可以证明(1)也同样成立),所以上面的问题可 进一步改为

现在的问题就是如何产生一组服从特定密度函数\(p(x)\)的随机数,MCMC方法可以解决这个问题

Markov Chain Mote Carlo(MCMC)

要用MCMC方法,必须要找到一个平稳分布是\(\pi(i)\)的马氏链,更为具体一点就是 通过已知的平稳分布\(\pi(i)\)来确定一个马氏链转移概率\(p(i,j)\)(马氏链除了定义状态以外就是定义转移概率了),使得该马氏链在这个转移概率下经过长时间转移后有平稳分布\(\pi(i)\)。目前我们可以知道的平稳分布\(\pi(i)\)与转移概率\(p(i,j)\)的关系是下式

\(\pi(i)p(i,j) = \pi(j)p(i,j)\)

这是时逆马氏链的条件,鉴于我们的后面的讨论都基于这个式子就可以知道MCMC方法构造的马氏链一定是时逆马氏链(时逆马氏链一定有稳态分布)。我们从这个式子出发,对任意一个以\(Q(i,j)\)为转移概率的马氏链来说上式并不一定成立,但是我们让他们强行成立的话有

\(\pi(i)Q(i,j)\alpha(i,j) = \pi(j)Q(j,i)\alpha(j,i)\)

其中\(\alpha(i,j) = \pi(j)Q(j,i)\ ;\alpha(j,i) = \pi(i)Q(i,j)\), 所以我们可以看到实际上构造的马氏链是以\(Q(i,j)\alpha(i,j)\)为转移概率的马氏链,这里的\(\alpha(i,j)\)又称为接受率。所以下面我们在进行抽样的时候状态之间的转移应该包括与\(Q(i,j)\)对应的过程和与\(\alpha(i,j)\)对应的过程,具体的MCMC算法的过程如下

  1. 输入一个马氏链的转移概率\(Q(i,j)\)以及期望的平稳分布\(\pi(i)\), 当然还有状态转移所需要的次数\(n_T\)以及要采集随机数的个数\(n_r\)

  2. 按照一定的概率分布随机产生一个状态\(x_0\)

  3. 进入循环,循环次数为(\(n_T+n_r\)), 每次循环做以下的一些事情

    a. 从条件概率分布\(Q(i,j)\)中采样得到\(x^*\)(这里采样可以使用接受-拒绝采样来得到,可见

    (https://www.cnblogs.com/pinard/p/6625739.html)

    b. 以\(\alpha(i,j)\)的概率来接受\(x^*\)(生成一个[0,1]之间的均匀分布的随机数\(u\), 如果\(u<\alpha(i,j)\)就接受\(x^*\),即\(x_{n+1} = x^*\);否则就拒绝,\(x_{n+1} = x_n\))

Metropolis-Hasting 算法

M-H算法是针对MCMC算法里面\(\alpha(i,j)\)太小而导致马氏链需要很长的一段时间才收敛的问题而提出的。在MCMC算法中\(\alpha(i,j)\)是介于[0,1]之间的,而在M-H算法中\(\alpha(i,j)\)或者\(\alpha(j,i)\)中有一个为1。因为

\(\pi(i)Q(i,j)\alpha(i,j) = \pi(j)Q(j,i)\alpha(j,i)\)

等式两边同时扩大\(\frac{1}{\alpha(i,j)}\)倍或者同时扩大\(\frac{1}{\alpha(j,i)}\)倍等式不变,for example,两边同时扩大\(\frac1{\alpha(j,i)}\)倍, 就有

\(\pi(i)Q(i,j)\frac{\alpha(i,j)}{\alpha(j,i)} = \pi(j)Q(j,i) \rightarrow\pi(i)Q(i,j)\alpha_{MH}(i,j) = \pi(j)Q(j,i)\alpha_{MH}(j,i)\)

而新的\(\alpha_{MH}(i,j) = \frac{\alpha(i,j)}{\alpha(j,i)} = \frac{\pi(j)Q(j,i)}{\pi(i)Q(i,j)}\),而新的\(\alpha_{MH}(j,i) = 1\). 但是应该记住的是不管是不是新的,接受率都不能大于1,所以归纳一下可以得到\(\alpha_{MH}(i,j) = \min\{\frac{\pi(j)Q(j,i)}{\pi(i)Q(i,j)},1\}\), 这样M-H算法构造马氏链的转移概率就是\(P(i,j) = Q(i,j)\alpha_{MH}(i,j)\)。具体的M-H算法采取一组服从某个概率分布\(\pi(i)\)的随机数如下所示

  1. 输入一个马氏链的转移概率\(Q(i,j)\)以及期望的平稳分布\(\pi(i)\), 当然还有状态转移所需要的次数\(n_T\)以及要采集随机数的个数\(n_r\)

  2. 按照一定的概率分布随机产生一个状态\(x_0\)

  3. 进入循环,循环次数为(\(n_T+n_r\)), 每次循环做以下的一些事情

    a. 从条件概率分布\(Q(i,j)\)中采样得到\(x^*\)

    b. 以\(\alpha_{MH}(i,j)\)的概率来接受\(x^*\)

Gibbs 算法

Gibbs算法主要应用于多维随机向量的采样。具体可见 https://www.cnblogs.com/pinard/p/6645766.html

PS: 其中要求联合稳态分布的条件分布,可以用联合分布除以对应的边缘分布,而边缘分布可以通过对所有其他变量积分(连续)或者对所有其他变量的可能情况求和得到(离散)。

标签:Monte,MCMC,Chain,frac,算法,alpha,pi,马氏链
From: https://www.cnblogs.com/siranlee/p/17360105.html

相关文章

  • Langchain框架 prompt injection注入
    Langchain框架promptinjection注入PromptInjection是一种攻击技术,黑客或恶意攻击者操纵AI模型的输入值,以诱导模型返回非预期的结果Langchain框架LangChain是一个基于大语言模型进行应用开发的框架。所谓大语言模型(LargeLanguageModels,LLMs),是指基于海量语料训练、......
  • 用COPULA模型进行蒙特卡洛(MONTE CARLO)模拟和拟合股票收益数据分析|附代码数据
    全文下载链接:http://tecdat.cn/?p=24535最近我们被客户要求撰写关于COPULA模型蒙特卡洛的研究报告,包括一些图形和统计输出。最近,copula在仿真模型中变得流行起来。Copulas是描述变量之间依赖关系的函数,并提供了一种创建分布以对相关多元数据建模的方法使用copula,数据分析师......
  • LangChain vs Semantic Kernel
    每当向他人介绍SemanticKernel,会得到的第一个问题就是SemanticKernel类似于LangChain吗,或者是c#版本的LangChain吗?为了全面而不想重复的回答这个问题,因此我写下这篇文章。在ChatGPT之前,构建集成AI的应用程序的主要分为两个步骤:机器学习工程师/数据科学家创建模型,然后通......
  • The Second Type of Uncertainty in Monte Carlo Tree Search
    发表时间:2020文章要点:MCTS里通常通过计算访问次数来做探索,这个被称作count-deriveduncertainty。这篇文章提出了第二种uncertainty,这种uncertainty来源于子树的大小,一个直觉的想法就是,如果一个动作对应下的子树小,那就不用探索那么多次,反之如果子树大,那就应该多探索探索。作者提......
  • 16 Ray Tracing (Monte Carlo Path Tracing)
    关键点MonteCarloIntegrationDistributedRayTracingPathTracingRussianRoulette(RR)SamplingtheLight(puremath)1.MonteCarloIntegration蒙特卡洛积分对于没有解析式的对象,可以使用该方法求其定积分。在积分范围内随机采样一个值,作为高,使用区间长度作为宽,......
  • 【Tutorial4】Further Numerical Methods in Monte Carl
                                      ......
  • blockchain | 交叉编译armv8的pbc库
    blockchain|交叉编译armv8的pbc库这块儿网上是没啥具体的资料的,因为要测试pbc库在安卓上的性能,但是网上pbc的支持只到armv7,就只能自己编译了。大致流程:下载gmp库源码下载pbc库源码编译gmp编译pbc编译测试程序这里使用的是aarch64-linux-gnu-g++andaarch64-linux-gnu......
  • Chain of Thought(思维链)
    "思维链"(ChainofThought)是指一系列有逻辑关系的思考步骤或想法,这些步骤或想法相互连接,形成了一个完整的思考过程。它是指导我们思考和解决问题的一种方法,可以帮助我们更好地理解问题、分析问题和解决问题。一个有效的思维链应该具有以下特点:逻辑性:思维链中的每个思考步骤都应......
  • Rust中的迭代器的使用:map转换、filter过滤、fold聚合、chain链接
    什么是迭代器Rust中的迭代器是一种强大的工具,它提供了一种灵活、通用的方法来遍历序列。迭代器是实现了Iteratortrait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对象,并返回一个Option用于指示对象是否存在。fnnext(&mutself)->Option<Self::Item>;迭......
  • macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像
    本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。2023年4月10日(北京时间11日凌晨),Apple为那些无法更新macOSVentura的旧Mac发布了macOSBig......