Gibbs采样

本文详细介绍了Gibbs采样算法,作为扩展Metropolis-Hastings算法到多元分布的一种方法。讨论了Blockwise updating和Componentwise updating两种策略,以及Gibbs采样的优势,特别是其在条件分布已知时的有效性。Gibbs采样通过逐个更新随机变量,避免了选择建议分布的问题,提高了采样效率。
摘要由CSDN通过智能技术生成

背景

之前介绍了Metropolis-Hastings采样算法,只考虑了一元概率分布的样本生成问题。本文讨论如何将MH算法扩展到多元分布上,重点讨论Gibbs采样算法。

Blockwise updating

Blockwise updating 是将MH扩展到多元分布上最简单的方法,就是选择一个和目标分布有相同维度的建议分布。例如如果要生成 N 元概率分布的样本,我们就采用一个 N 元的建议分布(proposal distribution)。在马尔可夫链状态转移过程中,接受或者拒绝整个建议(包含 N 个随机变量)。算法的流程如下所示:

  1. 设置马尔可夫链的初始状态 X0=x⃗ 0

    • t=0,1,2,3, 循环进行以下过程

      (1) 第 t 时刻的马氏链的状态为 Xt=x⃗ t ,采样 y⃗ q(y⃗ |x⃗ t)

      (2) 从均匀分布采样 uUniform[0,1]

      (3) 如果 u<α(x⃗ t,y⃗ )=min[p(y⃗ )q(x⃗ t|y⃗ )p(x⃗ t)q(y⃗ |x⃗ t),1] ,则接受转移 x⃗ ty⃗  Xt+1=y⃗ 

      (4) 否则不接受转移, Xt+1=x⃗ t

    • 与之前MH算法的不同之处,就是将标量 x 替换成了 x⃗  。其中 x⃗ ={ x1,x2,,xN} 表示 N 维随机变量。

      例子

      采用 Blockwise updating 方法对 Bivariate Exponential 分布进行采样。概率密度函数如下:

      function y = bivexp(theta1,theta2)
      %%返回Bivariate Exponential分布的概率密度函数
      lambda1 = 0.5;
      lambda2 = 0.1;
      lambda = 0.01;
      maxval = 8;
      y = exp(-(lambda1+lambda)*theta1-(lambda2+lambda)*theta2-lambda*maxval);

      采样过程代码如下:

      %% Blockwise updating to sample from Bivariate Exponential
      
      %% Initalize the MH sampler
      T=10000; % Set the maximum number of iterations
      x_min = [ 0 0 ]; % define minimum for theta1 and theta2
      x_max = [ 8 8 ]; % define maximum for theta1 and theta2
      seed=1; rand('state', seed ); randn('state',seed ); % set the random seed
      x = zeros( 2 , T ); % Init storage space for our samples
      % Use a uniform proposal distribution
      x(1,1) = unifrnd( x_min(1) , x_max(1) ); % Start value for theta1
      x(2,1) = unifrnd( x_min(2) , x_max(2) ); % Start value for theta2
      
      %% Start sampling 
      t=1;
      while t < T % Iterate until we have T samples
          t = t + 1;
          % Propose a new value for theta
          y = unifrnd(thetamin,thetamax);
          pratio = bivexp(y(1),y(2))/bivexp(x(1,t-1),x(2,t-1));
          alpha = min([1,pratio]); % Calculate the acceptance ratio
          u = rand; % Draw a uniform deviate from [ 0 1 ]
          if u < alpha % Do we accept this proposal?
              x(:,t) = y; % proposal becomes new value for theta
          else
              x(:,t) = x(:,t-1); % copy old value of theta
          end
      end
      
      %% Display histogram of our samples
      figure( 1 ); clf;
      subplot( 1,2,1 );
      nbins = 10;
      xbins1 = linspace( x_min(1) , x_max(1) , nbins );
      xbins2 = linspace( x_min(2) , x_max(2) , nbins );
      hist3( x' , 'Edges' , {xbins1 xbins2} );
      xlabel( 'x_1' ); ylabel('x_2' ); zlabel( 'counts' );
      az = 61; el = 30;
      view(az, el);
      
      %% Plot the theoretical density
      subplot(1,2,2);
      nbins = 20;
      xbins1 = linspace( x_min(1) , x_max(1) , nbins );
      xbins2 = linspace( x_min(2) , x_max(2) , nbins );
      [ x1grid , x2grid ] = meshgrid( xbins1 , xbins2 );
      ygrid = bivexp( x1grid , x2grid );
      mesh( x1grid , x2grid , ygrid );
      xlabel( 'x_1' ); ylabel('x_2' );
      zlabel( 'f(x_1,x_2)' );
      view(az, el);

      实验结果如下:
      这里写图片描述

      Componentwise updating

      MH算法中,选择合适的建议分布是比较困难的,对于高维分布更是如此。前面介绍的 Blockwise updating的方法,拒绝率往往很高,导致算法的效率不高。下面介绍一种与之相对应的采样方法:Componentwise updating。与 Blockwise 提出包含 N 个元素的建议然后接受或拒绝整个建议 y⃗  不同,Componentwise 每次针对 xt 的第 i 个元素提出建议 yi ,然后接受或拒绝这个建议。

      例如对于一个随机变量 x⃗ =(x1,x2) 的二维分布进行采样。我们首先设置初始状态 x⃗ (0)=(x(0)1,x(0)2) 。在第 t 次迭代,我们针对随机变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值