[MCSM] Slice Sampler

1. 引言

之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法。在介绍这一类算法(指Gibbs sampling)之前,本节将介绍一种特殊的MCMC算法。 我们重新考虑了仿真的理论基础,建立了Slice Sampler。

考虑到[MCSM]伪随机数和伪随机数生成器中提到的产生服从f(x)密度分布随机数等价于在子图f上产生均匀分布,即

类似笔记“[MCSM] Metropolis-Hastings 算法”(文章还没写好),考虑采用马尔可夫链的稳态分布来等价上的均匀分布,以此作为f分布的近似。很自然的想法是采用随机行走(random walk)。这样得到的稳态分布是在集合上的均匀分布。

2. 2D slice sample

有很多方法实现在集合上的"random walk",最简单的就是一次改变一个方向上的取值,每个方向的改变交替进行,由此得到的算法是 2D slice sampler



在第t次迭代中,执行

1.

2. , 其中



举例

其中,是归一化因子,代码如下,第一幅图是前10个点的变化轨迹,第二幅图表明初始点的选取影响不大

% p324
T = 0:10000;
T = T/10000;
% N(3,1)
y = exp(-(T+3).^2/2);
plot(T,y);
hold on;
x = 0.25;
u = rand *(exp(-(x+3).^2/2));
x_s = [x];
u_s = [u];
for k = 1:10;
    limit = -3 + sqrt(-2*log(u));
    limit = min([limit 1]);
    x = rand * limit;
    x_s = [x_s x];
    u_s = [u_s u];
    u = rand *(exp(-(x+3).^2/2));
    x_s = [x_s x];
    u_s = [u_s u];
end
plot(x_s,u_s,‘-*‘);
hold off;

%%
x = 0.01;
u = 0.01;
x_s = [x];
u_s = [u];
for k = 1:50;
    limit = -3 + sqrt(-2*log(u));
    limit = min([limit 1]);
    x = rand * limit;
    x_s = [x_s x];
    u_s = [u_s u];
    u = rand *(exp(-(x+3).^2/2));
    x_s = [x_s x];
    u_s = [u_s u];
end
figure;
subplot(1,3,1);
plot(x_s,u_s,‘*‘);hold on;plot(T,y);
x = 0.99;
u = 0.0001;
x_s = [x];
u_s = [u];
for k = 1:50;
    limit = -3 + sqrt(-2*log(u));
    limit = min([limit 1]);
    x = rand * limit;
    x_s = [x_s x];
    u_s = [u_s u];
    u = rand *(exp(-(x+3).^2/2));
    x_s = [x_s x];
    u_s = [u_s u];
end
subplot(1,3,2);
plot(x_s,u_s,‘*‘);hold on;plot(T,y);
x = 0.25;
u = 0.0025;
x_s = [x];
u_s = [u];
for k = 1:50;
    limit = -3 + sqrt(-2*log(u));
    limit = min([limit 1]);
    x = rand * limit;
    x_s = [x_s x];
    u_s = [u_s u];
    u = rand *(exp(-(x+3).^2/2));
    x_s = [x_s x];
    u_s = [u_s u];
end
subplot(1,3,3);
plot(x_s,u_s,‘*‘);hold on;plot(T,y);

3. General Slice Sampler

有时候面临的概率密度函数不会那么简单,此时面临的困难主要在于无法在第二次更新的时候找到集合的范围。但有时我们可以将概率密度函数分解为多个较为简单的函数之积,即



    Slice Sampler

1.

2.  ,其中



看着挺高级好用的,实际上也只是能用的,一是本身就很难求,第二是即使求出来了,这个满足均匀分布的变量也很难得到,比如说书上的例子(Example 8.3)

很自然的分成了

但是集合完全没有办法用,求其中一个,然后拒绝不满足要求的看起来是可行的,但是效率实在是太低了(效率低实际上是我写错了,实际上还可以)

代码如下(代码是MATLAB的,画出来的图不好看,这个图是作者的R代码画出来的)

x = 0;
u1 = rand*(1+sin(3*x)^2);
u2 = rand*(1+cos(5*x)^4);
u3 = rand*(exp(-x^2/2));
x_s = zeros(1,10000);
for k = 1:10000
    limit = sqrt(-2*log(u3));
    x = -limit + 2*limit*rand;
    while((sin(3*x))^2<u1-1 || (cos(5*x))^4<u2-1)
        x = -limit + 2*limit*rand;
    end
    u1 = rand*(1+sin(3*x)^2);
    u2 = rand*(1+cos(5*x)^4);
    u3 = rand*(exp(-x^2/2));
    x_s(k) = x;
end
hist(x_s,100);

4. 收敛性

不会

时间: 2024-10-10 02:47:40

[MCSM] Slice Sampler的相关文章

[转] - MC、MC、MCMC简述

贝叶斯集锦(3):从MC.MC到MCMC 2013-07-31 23:03:39 #####一份草稿 贝叶斯计算基础 一.从MC.MC到MCMC 斯坦福统计学教授Persi Diaconis是一位传奇式的人物.Diaconis14岁就成了一名魔术师,为了看懂数学家Feller的概率论著作,24岁时进入大学读书.他向<科学美国人>投稿介绍他的洗牌方法,在<科学美国人>上常年开设数学游戏专栏的著名数学科普作家马丁•加德纳给他写了推荐信去哈佛大学,当时哈佛的统计学家Mosteller 正

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

[ jquery 过滤器 slice(start, [end]) ] 此方法用于在选择器的基础之上精确筛选出匹配的子集(可以使用前导限制范围)

此方法用于在选择器的基础之上精确筛选出匹配的子集(可以使用前导限制范围): 1.start:开始选取子集的位置.第一个元素是0.如果是负数,则可以从集合的尾部开始选起 2.end:结束选取自己的位置,如果不指定,则就是本身的结尾 3.参数包含开始,不包含结束 [ start , end ) 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title>

slice()、splice()详解

前面在开发的时候对于slice().splice()这两个函数老是模糊不清,不清楚具体的参数传参以及用法. 今天写个笔记专门记录一下. 1.slice()  从指定位置删除数组里面的元素,可以传一个或者两个参数.不破坏原来的数组. var a=[1,2,3,4,5]; alert(a.slice(2)); //3,4,5 alert(a.slice(2,1)) //3 2.splice()这个就比slice强大太多了,主要有删除.插入.替换三个功能.基本可以代替slice()使用. 删除:可以删

js中 substr(), substring(), slice()的区别

一.作用 三者都是基于原字符串创建新字符串的方法. 接收一到两个参数,第一个参数截取字符串的开始位置(字符下标,从0开始),第二个参数因方法不同而不同,后面不同点会说到. 另外,三个方法都不会修改原字符串的值. 二.相同点 都可以传入一个或两个参数 只传入一个参数时,都表示从指定下标,截取字符串长度,直到字符串最后一个字符 var str = 'hello sarahshine!'; console.log(str.slice(3)); // 'lo sarahshine!' console.l

javascript中slice(),splice(),split(),substring(),substr()使用方法

1.slice(): Array和String对象都有 在Array中  slice(i,[j]) i为开始截取的索引值,负数代表从末尾算起的索引值,-1为倒数第一个元素j为结束的索引值,缺省时则获取从i到末尾的所有元素 参数返回:返回索引值从i到j的数组,原数组不改变 在String中 slice(i,[j]) 参数说明:i为开始截取的索引值,负数代表从末尾算起的索引值,-1为倒数第一个字符j为结束的索引值,缺省时则获取从i到末尾的所有字符 2.splice() 存在Array中     方法

js字符串截取函数slice()、substring()、substr()

摘要 在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧. 取字符串的三个函数:slice(start,[end]),substring(start,[end])和substr(start,[length]) 相关属性: slice() 第一个参数代表开始位置,第二个参数代表结束位置的下一个位置,截取出来的字符串的长度为第二个参数与第一个参数之间的

两个JavaScript的截取类substring和slice

作用:可以截取字符串中的连续的一部分 用例子来记忆: var str = "我来自黑龙江"; (1) alert(str.substring(0,2)); //输出的是“我来” alert(str.substring(2,0));//和上行是一样的结果 alert(str.substring(-3,2));//在substring中负数自动转换成0: (2) alert(str.slice(0,2)) ;//正常执行 alert(str.slice(2,0)) ;//出现问题,slic

javascript中substring()、slice()、substr()方法的区别

substring()方法用于提取字符串中介于两个指定下标之间的字符. stringObject.substring(start,stop) slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分 stringObject.slice(start,end) substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符 stringObject.substr(start,length)  substring()与 slice() 和 substr() 方法不同