吉布斯抽样

2023-11-18

吉布斯采样是生成马尔科夫链的一种方法,生成的马尔科夫链可以用来做蒙特卡洛仿真,从而求得一个较复杂的多元分布。

吉布斯采样的具体做法:假设有一个k维的随机向量,现想要构造一条有n个样本的k维向量(n样本马尔科夫序列),那么(随机)初始化一个k维向量,然后固定这个向量其中的k-1个元素,抽取剩下的那个元素(生成给定后验的随机数),这样循环k次,就把整个向量更新了一遍,也就是生成了一个新的样本,把这个整体重复n次就得到了一条马尔科夫链。


在统计学和统计物理学中,gibbs抽样是 马尔可夫链蒙特卡尔理论(MCMC)中用来获取一系列近似等于指定多维概率分布(比如2个或者多个随即变量的联合概率分布)观察样本的算法。
MCMC是用于构建Markov chain随机概率分布的抽样的一类算法。MCMC有很多算法,其中比较流行的是Metropolis-Hastings Algorithm,Gibbs Sampling是Metropolis-Hastings Algorithm的一种特殊情况。
Markov chain 是一组事件的集合,在这个集合中,事件是一个接一个发生的,并且下一个事件的发生,只由当前发生的事件决定。用数学符号表示就是:
这里的
   
不一定是一个数字,它有可能是一个向量,或者一个矩阵,例如我们比较感兴趣的问题里
   
=(g, u, b)这里g表示基因的效应,u表示环境效应,b表示固定效应,假设我们研究的一个群体,g,u,b的联合分布用π(a)表示。事实上,我们研究QTL,就是要找到π(a),但是有时候π(a)并不是那么好找的,特别是我们要估计的a的参数的个数多于研究的个体数的时候。用一般的least square往往效果不是那么好。
解决方案:
用一种叫Markov chain Monte Carlo(MCMC)的方法产生Markov chain,产生的Markov chain
   
具有如下性质:当t 很大时,比如10000,那么
   
~ π(a),这样的话如果我们产生一个markov chain:
 
,那么我们取后面9000个样本的平均:
a_hat = (g_hat,u_hat,b_hat) = ∑
   
/ 9000 (i=1001,1002, … 10000);
这里g_hat, u_hat, b_hat 就是基因效应,环境效应,以及固定效应的估计值;
MCMC算法的关键是两个函数:
1)q(
   
 
),这个函数决定怎么基于
   
得到
   
2)α(
   
 
),这个函数决定得到的
   
是否保留;
目的是使得
   
的分布收敛于π(a) [1]   。

过程

编辑
一般来说我们通常不知道π(a),但我们可以得到p(g | u , b),p(u | g , b), p ( b | g, u )即三个变量的posterior distribution。
Step1: 给g, u, b 赋初始值:(g0,u0,b0);
Step2: 利用p (g | u0, b0) 产生g1;
Step3: 利用p (u | g1, b0) 产生u1;
Step4: 利用p (b | g1, u1) 产生b1;
Step5: 重复step2~step5 这样我们就可以得到一个markov chain 
 
这里的q(
   
 
)= p(g | u , b)* p(u | g , b)* p ( b | g, u )
注意:Gibbs采样的目的是获得一个样本,不是计算概率,但可以通过其他方法来统计概率

MCMC(马尔可夫链蒙特卡洛方法):the Gibbs Sampler(吉布斯采样)

        在之前的博客中,我们对比了在一个多元概率分布p(x)中,分别采用分组(block-wise)和分成分(component-wise)实现梅特罗波利斯哈斯廷斯算法。对于多元变量问题中的MCMC算法,分成分更新权重比分组更新更有效,因为通过使每一个成分/维度独立于其他成分/维度,我们将更可能去接受一个提议采样【注,这个proposed sample应该就是前面博客里面提到的转移提议分布】。然而,提议采样仍然可能被拒绝,导致有些多余的计算,因为他们被拒绝了,计算了但是一直未使用。吉布斯采样是另外一种比较受欢迎的MCMC采样技术,提供了避免这种多余计算的方法。就想分成分实现Metropolis Hastings算法,吉布斯仍然使用分成分更新。然而,不像Metropolis Hastings采样,所有的提议采样将被接受,因此不会有多余的计算。

        基于两个标准,吉布斯采样使用某些类别的问题。给定一个目标分布p(x),其中,第一个标准是以其他所有变量联合起来的联合分布为条件的每一个变量的条件分布有解析(数学)表达式。在形式上,如果目标分布p(x)是D维的,我们必须有D个独立的表达式:



        这些表达式的每一个都定义了在知道其他j(j≠i)维的数值的情况下第i维的概率。具有每一个变量的条件分布代表我们不需要像Metropolis Hastings算法需要提议分布或者接受/拒绝标准。因此,当其他变量固定的时候,我们可以简单的从每一个条件中去采样。第二个标准就是我们必须能够从每一个条件分布中去采样。如果我们想要去实现一个算法,这个附加条件是非常明显的。

    吉布斯采样的工作方法和分成分Metropolis Hastings算法很像,除了取缔借鉴每一个维度的提议分布,然后对于接受或者拒绝提议采样,我们采用简单地依据变量对应的条件分布去选取此维度的值。我们会接受所有选取的值。类似分成分Metropolis Hastings算法,我们依次通过每一个变量,在其它变量固定的时候对它采样。吉布斯采样的步骤大致如下:

1.设置t=0

2.生成初始状态

3.重复直到t=M
{
对于每一个维度i=1...D
中得到 

}
       为了对吉布斯采样有更好的理解,我们下面来实现一下吉布斯采样,去解决与前面提到过的同样的多元变量采样问题。

例子:从二元正态分布中采样Example: Sampling from a bivariate a Normal distribution

       这个例子与前面一样,从2维的正态分布使用分组和分成分的Metropolis-Hastings算法采样。这里我们展示使用同样的目标分布如何实现吉布斯采样。重复提示一下,目标函数p(x)是一种规范化形式,表示如下:


①均值是


②方差是


     为了使用吉布斯采样从这个分布中采样,我们需要有变量/维度x1和x2的条件分布:


      是第二个维度的前一个状态,是从中得到的第一个维度的状态。有差异的原因是更新x1和x2用的是(t-1)和t时刻的状态,在上一节中的算法大纲第三步可以看出来。第t次迭代,我们首先以变量x2的最近状态即第(t-1)次迭代结果为条件,为x1采样一种新状态。然后再以第t次迭代得到的x1的最新状态为条件采样得到变量x2。
经过一些数学推导(这里先跳过,下面会有详细的过程),我们发现目标正态分布的两个条件分布是:


        每一个都是单变量的正态分布,其中均值依赖条件变量的最近状态的值,方差依赖两个变量之间的目标方差。
       使用上述描述的变量x1和x2的条件概率,我们下面采用matlab实现吉布斯采样,输出的采样如下:


        观察上表,发现每一次迭代中吉布斯采样中的马尔可夫链是如何第一次沿着x1方向前进一步,然后沿着x2的方向前进。这展示了吉布斯采样以分成分方法一次单独为每一个变量采样。

总结Wrapping Up

        吉布斯采样是为复杂多元概率分布采样的一个受欢迎的MCMC方法。然而,吉布斯采样不能用于一般的抽样问题。对于许多目标分布,很难或者不可能去获取到所有需要的条件分布的近似表达。在其它情况下,对于所有条件的解析表达式或许存在,但是它或许很难从任意的或者全部的条件分布去采样(在这种情况下,使用单变量( univariate sampling methods)采样比如拒绝抽样(rejection sampling)和Metropolis类型的MCMC技术去逼近每一个条件的样本是比较普遍的)。吉布斯采样是非常受欢迎的贝叶斯方法,模型经常以这种方式设计:所有模型变量的条件表达式非常容易获取,并且采用一种能够被高效采样的众所周知的形式。
吉布斯采样,就想很多MCMC方法,有“慢混合(slow mixing)”的问题。慢混合的发生是在潜在的马尔可夫链需要很长时间去充分探索出x的值,从而给出一个更好的p(x)的表征(characterization)。慢混合是因为一些因素包括马尔可夫链的“随机走动(random walk)”特性,并且马尔可夫链有“卡住”的趋势,因为仅仅采样了x的一个单独区域,这个区域在p(x)下有很高的概率。这种反应对于多模式(multiple modes)或者重尾(heavy tails)中的分布进行采样效果不好,比如混合蒙特卡洛已被发展成一个包含附加动力学(incorporate additional dynamics)的能提高马尔可夫链路径效率的方法。将来会讨论混合蒙特卡洛方法

matlab代码

      实现的应该是给定了一个均值和方差,以及初始的一个样本点,然后采样出5000个符合分布的点

[html]  view plain  copy  print ?
  1. %https://victorfang.wordpress.com/2014/04/29/mcmc-the-gibbs-sampler-simple-example-w-matlab-code/  
  2. %seed 用来控制 rand 和 randn   
  3. % 如果没有设置seed,每次运行rand或randn产生的随机数都是不一样的  
  4. % 用了seed,比如设置rand('seed',0);,那么每次运行rand产生的随机数是一样的,这样对调试程序很有帮助  
  5. rand('seed' ,12345);  
  6.   
  7. nSamples = 5000;  
  8.    
  9. mu = [0 0]; % TARGET MEAN目标均值  
  10. rho(1) = 0.8; % rho_21目标方差  
  11. rho(2) = 0.8; % rho_12目标方差  
  12.    
  13. % INITIALIZE THE GIBBS SAMPLER  
  14. propSigma = 1; % PROPOSAL VARIANCE  
  15. minn = [-3 -3];  
  16. maxx = [3 3];  
  17.    
  18. % INITIALIZE SAMPLES  
  19. x = zeros(nSamples,2);  
  20. x(1,1) = unifrnd(minn(1), maxx(1));%unifrnd生成连续均匀分布的随机数  
  21. x(1,2) = unifrnd(minn(2), maxx(2));  
  22.    
  23. dims = 1:2; % INDEX INTO EACH DIMENSION  
  24.    
  25. % RUN GIBBS SAMPLER  
  26. t = 1;  
  27. while t < nSamples%总共采样出5000个采样点  
  28.     t = t + 1;  
  29.     T = [t-1,t];  
  30.     for iD = 1:2 % LOOP OVER DIMENSIONS总共两维,注释先讨论第一维  
  31.         % UPDATE SAMPLES  
  32.         nIx = dims~=iD; % *NOT* THE CURRENT DIMENSION找到另外一维nIx=[0 1]logical类型  
  33.         % CONDITIONAL MEAN  
  34.         muCond = mu(iD) + rho(iD)*(x(T(iD),nIx)-mu(nIx));%计算均值=表达式μ(1)+ρ(1)*(x(n,2)-μ(2))其中x(n,2)代表样本第n个数据的第二维  
  35.         % CONDITIONAL VARIANCE  
  36.         varCond = sqrt(1-rho(iD)^2);%计算方差  
  37.         % DRAW FROM CONDITIONAL  
  38.         x(t,iD) = normrnd(muCond,varCond);%正态分布随机函数,计算得到当前第t个数据的第1维数据value  
  39.     end  
  40. end  
  41.    
  42. % DISPLAY SAMPLING DYNAMICS  
  43. figure;  
  44. h1 = scatter(x(:,1),x(:,2),'r.');%scatter描绘散点图,x为横坐标,y为纵坐标  
  45.    
  46. % CONDITIONAL STEPS/SAMPLES  
  47. hold on;%画出前五十个采样点  
  48. for t = 1:50  
  49.     plot([x(t,1),x(t+1,1)],[x(t,2),x(t,2)],'k-');  
  50.     plot([x(t+1,1),x(t+1,1)],[x(t,2),x(t+1,2)],'k-');  
  51.     h2 = plot(x(t+1,1),x(t+1,2),'ko');  
  52. end  
  53.    
  54. h3 = scatter(x(1,1),x(1,2),'go','Linewidth',3);  
  55. legend([h1,h2,h3],{'Samples','1st 50 Samples','x(t=0)'},'Location','Northwest')  
  56. hold off;  
  57. xlabel('x_1');  
  58. ylabel('x_2');  
  59. axis square  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

吉布斯抽样 的相关文章

  • SQL Server导入Excel常见错误以及注意点

    1 excel第一行的字段名与数据库字段名需一一对应 导入时在 选择表和源视图 步骤 需注意 编辑 选项里的EXCEL列是否已经与表字段对应 如果某一字段为忽略 则会出现导入不匹配的错误 注意Excel的字段顺序 个数是否与表结构相同 2
  • TensorFlow 图片读取

    TensorFlow Version 2 0 0 image raw tf io read file img jpg image tf image decode image image raw channels None dtype tf
  • 2023高教社杯全国大学生数学建模竞赛C题思路模型代码

    2023高教社杯全国大学生数学建模竞赛C题思路模型代码 一 国赛常用的模型算法 1 蒙特卡罗算法 该算法又称随机性模拟算法 是通过计算机仿真来解决问题的算法 同时可以通过模拟可以来检验自己模型的正确性 比较好用的算法 2 数据拟合 参数估计
  • Zotero文献管理工具使用教程-2

    1 打开word 2 选择zotero标签 3 点击Add Edit Citation 4 选择要导入文献的格式后点击OK 这里以GB T 7714 1987为例 5 鼠标光标选中要插入的位置 前边一定要有文字 之后点击2所框选位置 6 点
  • 关于置信区间、置信度的理解

    关于置信区间和置信度的理解 在网上找了两个相关的观点感觉讲的很好 恍然大悟 简单概括 参数只有一个是固定的不会变 我们用局部估计整体 参数95 的置信度在区间A的意思是 正确 采样100次计算95 置信度的置信区间 有95次计算所得的区间包
  • 【leetcode 524. 通过删除字母匹配到字典里最长单词】双指针,在不同字符串中同向查找

    解题思路 依旧是双指针 不过双指针在不同字符串中同向查找 且在使用双指针前需要对被查找集合做排序 1 根据题目要求 先将dictionary的字符串按照字符串的长度从大到小排序 且字符串符合字典序 进行排序 目的是为了接下查找时 dicti
  • 使用streamstring获取字符串string的子串

    最近优化代码 特别是在C 中获取string的字串 代码经常会遇到 非常有用且重复的功能函数 对这个功能 我之前一直用substr来获取字串 功能也非常强大 最近发现一个非常好用的stringstream 用它来实现substr的部分功能
  • Springboot整合RabbitMQ详解

    RabbitMQ 文章目录 RabbitMQ RabbitMQ的特点 AMQP AMQP模型 消息确认 AMQP是一个可编程的协议 RabbitMQ安装 Windows10安装 步骤 Spring整合AMQP 官方中文文档 GitHup翻译
  • Windows Server 2012 R2 百度创建AD域

    Windows Server 2012 R2 创建AD域 前言 我们按照下图来创建第一个林中的第一个域 创建方法为先安装一台Windows服务器 然后将其升级为域控制器 然后创建第二台域控制器 一台成员服务器与一台加入域的Win8计算机 环
  • Linux终端查看文件指令

    可以用cat查看文件文本内容 还可以用more命令查看 两者不同的是 cat是直接将内容全部显示出来 more支持翻页 如果文件过多可以一页页的展示 翻页可以通过按空格实现
  • Mysql:核心的数据库操作

    Mysql核心点 对于每一位研发同学 Mysql都是必须掌握的技能啦 基本的Mysql的操作 还是得很好的掌握的 一 Mysql 学习一个技术 一定要先去官网学习 Mysql官网 二 基本的查询 1 创建表并插入数据 创建表 CREATE
  • 基于MindSpore的YOLOv3-DarkNet53网络实现

    基于MindSpore的YOLOv3 DarkNet53网络实现 网络模型介绍 1 backbone Darknet 53 YOLOv3使用Darknet 53提取特征 其借鉴了Darknet 19结构 不同于Darknet 19的是 Da
  • Flutter开发遇到的问题

    一 在AndroidStudio4 1中没有 New Flutter Project 菜单 那是由于你没有安装Flutter插件 需要在setting的插件管理中添加 Flutter 和 dart 插件 二 Flutter SDK 安装参考
  • 微信小程序input禁止空格输入

    用户输入的时候 可能会有输入空格的情况 所以我们要利用简单的正则实时去除空格 利用数据双向绑定的特性同步当前input的value值 下面是源码 wxml
  • 基于SpringBoot的螺蛳粉销售系统计算机毕业设计源码70795

    摘 要 随着供给侧结构性改革的稳步实施 互联网 这一新的国家发展的重要战略手段通过 双创 不但改变了传统的供需关系 还为经济发展带来了新动能 它已经成为产业发展的新引擎 螺顿粉产业就是在 互联网 背景下应运而生且蓬勃发展的 但是 在经济全球
  • 寻你的人生 寻你的选择

    无论如何选择 只要是自己的选择 就不存在对错与后悔 过去的我不会让现在的我满意 现在的我也不会让未来的我满意 当面对前路坎坷 我知道既然当初有胆量去选 那么就该有勇气把后果来承担 有毅力把梦想坚持并实现 我们人生中最大的懒惰 就是当我们明知
  • SonarQube8.7使用配置

    一 sonarQube版本 二 安装 三 配置说明 1 设置检测规则 2 启用pdf输出 一 sonarQube版本 本体 sonarqube 8 7 1 42226版本 插件 sonar findbugs plugin 4 0 3 jar
  • 生成Android的keystore密钥

    打开cmd 进入Jdk的 安装目录下的bin文件夹 输入命令 keytool genkey alias android keystore keyalg RSA validity 20000 keystore android keystore
  • /dev/sdb1 已经挂载或 /mnt/mountpoint3 忙解决办法

    dev sdb1 已经挂载或 mnt mountpoint3 忙解决办法 在挂载硬盘分区的时候 会出现mount dev sdd1 already mounted or data3 busy或者是在执行格式化分区的时候也会出现 dev hd
  • 操作系统重点

    1 1 选择题 1 考研真题 单项选择题 单道批处理系统的主要缺点是 A CPU利用率不高 2 考研真题 单项选择题 提高单机资源利用率的关键技术是 D 多道程序设计技术 3 考研真题 单项选择题 并发性是指若干事件在 发生 A C 同一时

随机推荐

  • Qt智能指针之QScopedPointer

    内存释放的问题是C 中比较头疼的问题 合理的使用智能指针能有效的帮助我们减少忘记释放内存 导致的内存泄露问题 本文以Qt中的QScopedPointer为例 通过讲解其用法 从源码深度剖析其实现方式 QScopedPointer的使用原理比
  • IDEA中的“Deployment“ 将项目直接部署到服务器上

    ntelliJ IDEA中的 Deployment 工具栏是一个方便的工具 用于将你的项目直接部署到服务器上 这个工具栏提供了三种部署的方式 1 Web Server在本地电脑上 并且服务器运行目录也在项目目录下 2 Web Server在
  • 【读书笔记】浪潮之巅——公司史篇

    浪潮之巅 公司史 AT T 百年帝国 创立 1877贝尔电话公司 1984年反垄断被拆分 AT T 8家小贝尔公司 1996年重组 AT T 长途电话等电信服务业务 朗讯 专门做程控交换机等设备制造业务 因借钱给各公司买朗讯设备 2000年
  • centos实现集群之间ssh免密(最简单的ssh免密)

    master 1 在虚拟机命令界面输入 ssh keygen t rsa 然后持续回车键 2 ssh copy id 主机名 ssh copy id master ssh copy id slave1 slave1 ssh copy id
  • 811. 子域名访问计数

    网站域名 discuss leetcode com 由多个子域名组成 顶级域名为 com 二级域名为 leetcode com 最低一级为 discuss leetcode com 当访问域名 discuss leetcode com 时
  • 私有部署、重构企业软件,第四范式发布大模型“式说”

    大模型领域再添重要一员 4月26日 第四范式首次向公众展示其大模型产品 式说3 0 并首次提出AIGS战略 AI Generated Software 以生成式AI重构企业软件 式说将定位为基于多模态大模型的新型开发平台 提升企业软件的体验
  • GYM-102920-L. Two Buildings(决策单调性+分治)

    题目链接 题目大意 求一段序列的 h i h j j i 的最大值 step1 转化一下题意 h i h j j i h j h i j i 令a i h i b i h i 然后全部转化为两种坐标 i a i i b i 这样题目就转化成
  • 物联网技术周报第31期:Linux基金会宣布微内核项目Zephyr

    本文转载至 http www infoq com cn news 2016 02 iot weekly 31 utm campaign infoq content utm source infoq utm medium feed utm t
  • linux的开机启动和密码破解

    linux的开机启动 linux启动流程 Centos开机修改密码 kali开机修改密码 centso启动 rcx文件 chkconfig命令 centos给grub设置密码 压缩解压 gzip bzip2 tar tar gzip tar
  • 韦东山数码相框项目进度一

    数码相框进度一 项目需求分析 程序架构 点阵字符显示 参考文章 韦东山数码相框任务需求分析 项目需求分析 程序架构 1 为了提高程序的复用性 将应用程序分为两个进程 进程之间通过socket套接字进行通信 2 两个进程下通过多线程框架 完成
  • Hibernate框架详解(四)

    Hibernate查询方式 1 对象导航查询 根据id查询某个班级 再查询这个班级里面的所有学生 2 OID查询 根据id查询某一条记录 返回对象 3 HQL查询 利用Query对象 写HQL语句实现查询 4 QBC查询 利用Criteri
  • Clion开发Stm32之编译不通过问题

    编译报错的情况 通过排查发现是由于项目路径存在中文的原因导致的 将项目移植不含中文目录问题得到解决 记录一下错误
  • 如何在Eclipse中的Dynamic web project工程中运行Apache服务器

    第一步 点击新建 其他 如图 2 选择server 下一步 如图 3 选择Apache服务器 4 选择本地已经下载的Apache对应的版本 完成 5 新建一个测试Dynamic webproject工程 6 在webcontent中随便建立
  • C++基础一:内存分区和引用

    1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 代码区 存放函数体的二进制代码 由操作系统进行管理的 全局区 存放全局变量和静态变量以及常量 栈区 由编译器自动分配释放 存放函数的参数值 局部变量等 堆区 由程序员分配和释放
  • 01虚拟机下配置linux的网络上网(包括ssh,gcc,g++的安装)

    1 选择模式 若你是新装虚拟机时 这个界面会依次安装时会直接有 到这一步选择添加 gt 选择网络适配器 点击桥接模式和复制物理网络 若你已经安装好虚拟机 可以点击虚拟机上方的虚拟机 M 然后也会出现这个界面 操作和上面一样 2 安装vim
  • [读论文]深入研究对抗样本和黑盒攻击的可转移性

    论文题目 深入研究对抗样本和黑盒攻击的可转移性 本文内容来源于论文 Delving into Transferable Adversarial Examples and Black box Attacks 论文地址 arxiv 1611 0
  • OpenGL总结4-3D纹理贴图坑

    OpenGL在纹理贴图的时候用到了多个坐标系 最头痛的是两个 一个是顶点所在的顶点坐标系 另一个是纹理所在的纹理坐标系 顶点坐标系与纹理坐标系不同的地方在于 当纹理导入之后 纹理在纹理坐标系中的坐标始终保持 0 1 内 所以在进行纹理变换的
  • 在Linux下安装GmSSL

    本文属于 GmSSL国密加密算法库使用系列教程 之一 欢迎查看其它文章 在Linux下安装GmSSL 一 关于GmSSL 二 解决与系统OpenSSL冲突的问题 三 GmSSL源码准备 四 编译与安装GmSSL 1 解压并进入目录 2 编译
  • 5分钟学会RocketMQ

    RocketMQ 简介 RocketMQ 是一个队列模型的消息中间件 具有高性能 高可用 高实时等特性 它并不支持JMS java消息服务 规范 但参考了JMS规范和kafak等的思想 Producer Consumer 队列都可以分布式
  • 吉布斯抽样

    吉布斯采样是生成马尔科夫链的一种方法 生成的马尔科夫链可以用来做蒙特卡洛仿真 从而求得一个较复杂的多元分布 吉布斯采样的具体做法 假设有一个k维的随机向量 现想要构造一条有n个样本的k维向量 n样本马尔科夫序列 那么 随机 初始化一个k维向