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 = :;
T = T/;
% N(,)
y = exp(-(T+).^/);
plot(T,y);
hold on;
x = 0.25;
u = rand *(exp(-(x+).^/));
x_s = [x];
u_s = [u];
for k = :;
limit = - + sqrt(-*log(u));
limit = min([limit ]);
x = rand * limit;
x_s = [x_s x];
u_s = [u_s u];
u = rand *(exp(-(x+).^/));
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 = :;
limit = - + sqrt(-*log(u));
limit = min([limit ]);
x = rand * limit;
x_s = [x_s x];
u_s = [u_s u];
u = rand *(exp(-(x+).^/));
x_s = [x_s x];
u_s = [u_s u];
end
figure;
subplot(,,);
plot(x_s,u_s,'*');hold on;plot(T,y);
x = 0.99;
u = 0.0001;
x_s = [x];
u_s = [u];
for k = :;
limit = - + sqrt(-*log(u));
limit = min([limit ]);
x = rand * limit;
x_s = [x_s x];
u_s = [u_s u];
u = rand *(exp(-(x+).^/));
x_s = [x_s x];
u_s = [u_s u];
end
subplot(,,);
plot(x_s,u_s,'*');hold on;plot(T,y);
x = 0.25;
u = 0.0025;
x_s = [x];
u_s = [u];
for k = :;
limit = - + sqrt(-*log(u));
limit = min([limit ]);
x = rand * limit;
x_s = [x_s x];
u_s = [u_s u];
u = rand *(exp(-(x+).^/));
x_s = [x_s x];
u_s = [u_s u];
end
subplot(,,);
plot(x_s,u_s,'*');hold on;plot(T,y);

3. General Slice Sampler

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


    Slice Sampler

1.

2.  ,其中


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

很自然的分成了

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

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

x = ;
u1 = rand*(+sin(*x)^);
u2 = rand*(+cos(*x)^);
u3 = rand*(exp(-x^/));
x_s = zeros(,);
for k = :
limit = sqrt(-*log(u3));
x = -limit + *limit*rand;
while((sin(*x))^<u1- || (cos(*x))^<u2-)
x = -limit + *limit*rand;
end
u1 = rand*(+sin(*x)^);
u2 = rand*(+cos(*x)^);
u3 = rand*(exp(-x^/));
x_s(k) = x;
end
hist(x_s,);

4. 收敛性

不会

[MCSM] Slice Sampler的更多相关文章

  1. [转] - MC、MC、MCMC简述

    贝叶斯集锦(3):从MC.MC到MCMC 2013-07-31 23:03:39 #####一份草稿 贝叶斯计算基础 一.从MC.MC到MCMC 斯坦福统计学教授Persi Diaconis是一位传奇 ...

  2. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  3. jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)

    1.jquery  data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...

  4. js url.slice(star,end) url.lastIndexOf('/') + 1, -4

    var url = '"http://60.195.252.25:15518/20151228/XXSX/作三角形的高.mp4")' document.title = url.sl ...

  5. JavaScript中的slice,splice,substr,substring,split的区别

    万恶的输入法,在sublime中会显示出繁体字,各位看官见谅. 1.slice()方法:该方法在数组和string对象中都拥有. var a = [1,2,3,4,5,6]; var s = 'thi ...

  6. Max double slice sum 的解法

    1. 上题目: Task description A non-empty zero-indexed array A consisting of N integers is given. A tripl ...

  7. js中substr,substring,slice。截取字符串的区别

    substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...

  8. JS 中 Array.slice() 和 Array.splice()方法

    slice slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array: var arr = ['A', 'B', 'C', 'D', 'E ...

  9. 【javascript 技巧】Array.prototype.slice的妙用

    Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...

随机推荐

  1. ASP.NET MVC 在控制器中获取某个视图动态的HTML代码

    如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中,然后通过代码传入model,动态获取cshtml中的HTML代码 当然 ...

  2. 烂泥:vsftpd单用户多目录配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 一.实际问题 在使用vsftpd过程中,我们会经常发现vsftpd在默认情况下一个用户 ...

  3. android 动态设置Framelayout,view,imageView,Layout高度

    直接:测试可以 Framelayout.getLayoutParams().width=600;Framelayout.getLayoutParams().height=400; 如:view,ima ...

  4. ES6箭头函数(Arrow Functions)

    ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 1. 具有一个参数的简单函数 var single = a => a single('he ...

  5. plsql+绿色版oracle连接远程数据库配置及提示缺少msvcr71.dll解决方法

    之前一直用的sqldeveloper连接oracle数据库,这个免费而且也是官方出品,除了体积略大启动略慢外,也没什么不好的.. 一次偶然机会决定试一下plsql,整理一下安装资料,需要本地oracl ...

  6. PHP读取超大文件的实例代码

    数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机   去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...

  7. 安装VS2013,可是电脑C盘没空间了,今天早上整理了下

    安装VS2013,可是电脑C盘没空间了,今天早上整理了下 安装VS2013,要求C盘有11G的空闲空间,不然不让装, 咋天下好了安装文件,6.89G 今天早上一来, 首先把 一些软件删掉,装到了D盘, ...

  8. 邮件页面为何只能Table写及注意事项

    编写HTML邮件与编写HTML页面有很大的不同.因为,各面向网民的主流邮箱都或多或少的会对它们接收到的HTML邮件在后台进行过滤.毫无疑问,JS代码是被严格过滤掉的,包括所有的事件监听 属性,如onc ...

  9. AFN 处理网络哪些事(轻松掌握AFN网络顶级框架)

    AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...

  10. django复习笔记1:环境配置

    一.IDE 推荐使用sublime安装djaneiro插件. 1.安装方式 package control中搜索djaneiro 支持补全请参考:Django support for Sublime ...