MCMC算法

news2025/2/5 20:50:25

一. MCMC算法定义

    MCMC是Markov chain Monte Carlo的缩写,即马尔可夫链蒙特卡罗方法。MCMC是一组利用马尔可夫链从随机分布中取样的算法。生成的马氏链即是对于目标分布的近似估计。

常见算法:

  • Metropolis-Hastings算法
  • Gibbs取样算法
  • Hamiltonian Monte Carlo算法(效率最高,但不常用)
    在统计推断和贝叶斯推断中,常用的是前两种算法。

二、Metropolis算法

假设随机变量X服从一个概率密度函数P。

  1. 初始化X,即给定随机变量一个起始点 X o l d X_{old} Xold
  2. 生成随机的跳跃 Δ X \Delta X ΔX~ N ( 0 , σ ) N(0,\sigma) N(0,σ) X n e w = X o l d + Δ X X_{new} = X_{old}+\Delta X Xnew=Xold+ΔX
  3. 计算随机变量移动到提议的点的概率
    P m o v i n g = m i n ( 1 , X n e w X o l d ) P_{moving} = min(1, \frac{X_{new}} {X_{old}}) Pmoving=min(1,XoldXnew)
  4. 生成一个随机数 C C C~ U ( 0 , 1 ) U(0,1) U(0,1),如果 C < P m o v i n g C < P_{moving} C<Pmoving 则接受跳跃,随机变量取新的值 X n e w X_{new} Xnew;反之则任取原来的值。
  5. 重复步骤2~4,并记录下随机变量所有的取值,知道蒙特卡洛模拟生成的随机游走足以代表目标分布。

利用Gamma分布对Metropolis算法进行测试

# Metropolis算法
import numpy
from scipy.special import gamma
import scipy.stats
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def MCMC(P,X0,chain,space):
    '''
    P - 随机变量X服从的概率密度函数
    X0 - MCMC的起始值
    chain - MCMC的长度
    space - 随机变量的取值范围,如[0,inf]
    '''
    
    if not callable(P):
        raise Exception('P必须是函数')
        
    X_current = X0
    X = [X_current]
    
    while True:
        Delta_X = scipy.stats.norm(loc=0,scale=2).rvs()
        X_proposed = X_current + Delta_X
        
        if X_proposed < space[0] or X_proposed > space[1]:
            p_moving = 0
        elif P(X_current) == 0:
            p_moving = 1
        else:
            p_moving = min(1,P(X_proposed)/P(X_current))
            
        if scipy.stats.uniform().rvs() <= p_moving:  #新生成的服从0,1均匀分布的值小于等于p_moving
            X.append(X_proposed)
            X_current = X_proposed
        else:
            X.append(X_current)
            
        if len(X) >= chain:
            break
        
    return numpy.array(X)
# 测试Metropolis算法:生成服从Gamma分布的马氏链
def GammaDist(x,k,theta):
    '''定义Gamma分布'''
    return 1/(gamma(k)*theta**k) * x**(k-1) * numpy.exp(-x/theta)

# 得到参数k=2,theta=2的分布
gammadist = lambda x: GammaDist(x,2,2)

X = MCMC(gammadist,2,100,[0,numpy.inf])   #最终结果:有MCMC算法生成的马氏链

这里生成的X就是使用MCMC算法生成的近似服从Gamma分布,是对目标分布的近似估计。下面通过动画演示这一过程。

# 用一个动画来演示生成的马氏链
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10))
fig.suptitle('MCMC Process')


def anima_chain(index):
    ax1.clear()

    ax1.plot(X[:index + 1], 'r-')
    # ax1.set_xlim([1,1000])
    ax1.set_xlabel('chain')  # 第多少步
    ax2.set_label('X')  # 生成的马氏链

    # ax1.set_title('MCMC Process')


def anima_density(index):
    ax2.clear()

    x = numpy.arange(0., 12, .1)
    ax2.plot(x, gammadist(x), 'k-')
    if index <= 10:
        y = numpy.zeros(len(x))
        ax2.plot(x, y)
    else:
        density = scipy.stats.gaussian_kde(X[:index - 1])
        ax2.plot(x, density(x), 'r-')

    ax2.set_xlim([0.,12])
    ax2.set_ylim([0,.5])
    ax2.set_xlabel('X')
    ax2.set_ylabel('density')

    # ax2.set_title('MCMC density estimate')

ani_chain = animation.FuncAnimation(fig, anima_chain, interval=1)
ani_density = animation.FuncAnimation(fig, anima_density, interval=1)


def main():
    plt.show()

if __name__ == '__main__':
    main()

在这里插入图片描述

  • 左侧是MCMC算法每一次迭代生成的随机数得到的马氏链,不断地取下一个点;
  • 右边是根据模拟出来的chain来近似得到的概率密度曲线(红色曲线);
  • MCMC模拟出来的分布要近似于目标分布Gamma分布。
  • 生成1000个数后得到的马氏链,可以近似的拟合我们的真实分布Gamma(2,2)。如果我们将链拉的更长,那就这个生成的马氏链几乎可以完美的拟合真实分布。
  • 后续过程中,会不断根据两个信息(概率密度函数的信息-也就是每个采样点之间相关关系的信息,以及随机游走的信息)来更新马氏链,最终很好的拟合目标分布。

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

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

相关文章

单片机AT89C51数码管数字时钟和闹钟二

详细代码讨论加我QQ&#xff1a;1271370903 一、课题的方案设计与论证 1.1摘要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展&#xff0c;单片机的应用正在不断地走向深入&#xff0c;由于它具有功能强&#xff0c;体积小&#xff0c;功耗低&#xff0c;价格便宜…

【我的渲染技术进阶之旅】你可能永远猜不到为什么Filament项目命名为TNT?

文章目录一、疑惑为啥叫TNT&#xff1f;二、寻找真相2.1 百度TNT关键字2.2 GitHub issue2.3 GitHub Discussion三、总结一、疑惑为啥叫TNT&#xff1f; 在我之前的博客【我的渲染技术进阶之旅】如何编译Filament的windows版本程序&#xff1f; 有介绍如何编译Windows版本的Fil…

React 18:Ref(获取DOM对象)

ref介绍 React中所有的操作默认都是在React元素上进行&#xff0c;然后再通过虚拟DOM应用到真实页面上的。这样做的好处我们不在赘述。 虽然如此&#xff0c;在React中依然为我们提供了可以直接访问原生DOM对象的方式。ref就是干这个事的。 ref是reference的简写&#xff0c…

【排序】详细聊聊归并排序(含非递归)

目录 归并排序的基本思想&#xff1a; 递归算法&#xff1a; 递归算法的思路分析&#xff1a; 开辟数组的函数&#xff1a; 递归的函数&#xff1a; 非递归算法&#xff1a; 非递归的思路分析&#xff1a; 边界问题&#xff1a; 时间复杂度和空间复杂度分析&#xff1a…

重建农场2.0:实景三维数据中心一站式解决方案

面向实景三维中国建设&#xff0c;如何扩大产能&#xff0c;不断提升实景三维数据中心的重建算力水平&#xff1f;如何满足快速迭代的需求&#xff0c;不断提升数据中心的应变能力&#xff1f;如何做到“一机多能”&#xff0c;不断外延数据中心的硬件价值&#xff1f;在前不久…

jquery获取父/子iframe页面的URL

最近因为要演示,做个临时ifame框架页面,因此子页面要根据父页面url来指定跳转。下面为ifame页面: 1、获取子页面url: var currentpath = window.location.pathname; console.log(currentpath); 输出为:/JG/TJ_JILU.aspx 2、获取父页面url: let currentTopHref = wind…

IDEA 注释模版

类的主注释 /*** description TODO* author Gaoxueyong* date ${DATE} ${TIME}* version 1.0*/方法的注释 1、创建自己的分组 选择右侧Template Group并输入名称 2、创建自己的模版 选择自己创建的分组然后选择Live Template 然后在Template text框内写入 *** $description…

脑图谱的一致性问题

脑图谱的意义及一致性问题 我们如何定义大脑的解剖结构&#xff0c;并将这些结构与大脑的功能联系起来&#xff0c;可以限制或增强我们对行为和神经系统疾病的理解大量可用的脑图谱给研究健康群体和患病人群的可重复性和描述大脑不同区域参与各种疾病的荟萃分析带来了问题——…

全力推进企业数智赋能发展主线,低代码任重道远

信息化进程 纵观近半个世纪以来我国信息化的发展&#xff0c;经历了20世纪80年代以个人计算机普及应用为特征的数字化阶段&#xff08;信息化1.0&#xff09;&#xff1b;20世纪90年代中期以互联网大规模商用为特征的网络化阶段&#xff08;信息化2.0&#xff09;&#xff1b;…

毕业设计 基于java web的网上招标系统

文章目录前言一、项目设计1. 模块设计注册用户部分管理员部分2. 实现效果二、部分源码最后前言 今天学长向大家分享一个 毕业设计项目: 基于java web的网上招标系统 一、项目设计 1. 模块设计 注册用户部分 1&#xff1a;查看网站流程&#xff1a;查看与网站有关的流程信息…

ZBC成功上线PancakeSwap的糖浆池,并有望在不久上线Binance

近期流支付协议Zebec Protocol正在成为加密行业备受瞩目的Web3生态&#xff0c;其在此前与Visa合作推出可以使用加密货币进行支付的借记卡Zebec Card后&#xff0c;得到了Visa创始团队成员在技术、市场发展前景上的高度认可。与此同时&#xff0c;Zebec Protcocol也与尼泊尔财政…

【react-脚手架】

目录bug初始化脚手架react脚手架创建项目并启动脚手架文件介绍案例&#xff1a;hello react快捷键组件化编码流程脚手架配置代理方法前置说明常用的ajax请求库配置方法一&#xff1a;只能配置一个路径配置方法二&#xff1a;配置多个路径引入bootsrtrap消息订阅与发布&#xff…

YOLO系列目标检测算法——YOLOX

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

毕业设计 基于java web的企业财务管理系统设计与实现

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 java web 项目: 基于java web的企业财务管理系统设计与实现 适用于毕业设计、课程设计 一、项目设计 1. 模块设计 管理员的所有模块的功能分析&#xff1a; 部门信息管理…

2022年最火的8种编程语言~工作机会超多~

当今&#xff0c;我们已知的编程语言多达几百种&#xff0c;但是常被大家使用的只占少数&#xff0c;无论你是刚入行的新手还是一名成熟的开发者&#xff0c;了解编程语言的受欢迎程度都很有必要。 最近&#xff0c;国外网站DevJobsScanner公布了一项数据&#xff0c;他们在过…

[附源码]计算机毕业设计Node.js电子商城系统(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

用大约 10 万字的内容对 Java 的核心知识点和常见的 1000 多道面试题,做了详细的介绍

每个技术人都有个大厂梦&#xff0c;我觉得这很正常&#xff0c;并不是饭后的谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司&#xff0c;如果说能够在这样的公司锻炼几年&#xff0c;相信对自己…

粗效过滤器安装技术参数

广州特耐苏净化设备有限公司详细介绍&#xff1a;粗效过滤器主要技术参数 粗效过滤器主要技术参数 粗效过滤器壳体材质&#xff1a;碳钢、不锈钢(304、304L、316、316L)、衬氟、塑料(PP、PVC等)。 粗效过滤器通常安装在泵、压缩机的入口或流量仪表前的管道上。 粗效过滤器安…

1978-2020年全国及31省市农业机械总动力(万千瓦)

1978-2020年全国及31省市农业机械总动力&#xff08;万千瓦&#xff09; 1、时间&#xff1a;1978-2020年 2、范围&#xff1a;31省 3、来源&#xff1a;各省NJ 农业统计NJ 4、缺失情况&#xff1a;无缺失 5、指标&#xff1a;农业机械总动力 6、指标解释&#xff1a; 农…

基于ssm jsp二手书交易系统源码和论文

随着信息技术的快速发展和网络技术的日益完善&#xff0c;人们越来越重视电子商务。校园 二手物品交易系统是校园电子商务的一个典型代表。二手市场从以前的路边旧货市场转 变到网络中&#xff0c;通过二手交易系统实现了二手交易。而校园二手物品交易系统带给学生省 时、省…