注册地址 登录
数学建模社区-数学中国 返回首页

liwenhui的个人空间 http://www.madio.net/?88948 [收藏] [复制] [分享] [RSS]

日志

MCMC的MH抽样MATLAB程序说明

已有 2532 次阅读2013-5-30 15:06 |个人分类:在人间| MCMC, MH算法, matlab, 马尔可夫链, 蒙特卡罗

 

function [mcs,efp]=mhs(f,p0,sigma,rt)

%mcs为得到的马尔可夫链,它是一个列向量的形式给出

%efp为程序中迭代的效率指标,它等于得到的链的长度比上总的迭代次数

%f为目标函数,它是需要通过MCMC生成的目标概率密度函数,可以从m问文件定义,也可以用匿名函数定义

%p0为马尔可夫链的初始值,理论上讲它可以为任何值,但是为了能让链条尽快收敛于平稳分布(即上面的f),它最好取接近平稳分布的均值附近。P0将会在初次迭代中充当转移核的均值,并依次不断被新的值替代,由此构造了一个条件分布函数

%sigma转移核的方差,方差大的话收敛会快一点,但可能不稳定,方差小的话收敛会比较满,链条长度最好取长一些

%rt指定目标链条的长度

k1=1;k2=0;

gser=zeros(rt,1);gser(1)=p0;

while (k1 < rt);

    p1=p0+sigma*randn;

    q1=feval(f,p0);

    q0=feval(f,p1);

    r=q0/q1;

    alpha=min(1,r);

    urand=rand(1);

    if urand < alpha;

       gser(k1+1)=p1;p0=p1;k1=k1+1;

    end

    k2=k2+1;

end

mcs=gser;efp=rt/k2;

--------------------------------------------------------------------------------------------------------------------------------------

将以上程序存为m文件,命名为mhs.m,调用时先定义目标平稳分布的密度函数f,然后调用mhs,指定p0 ,sigma,rt.

比如要生成一个符合标准正态分布的马尔可夫链(实践中一般不会通过MCMC来生成正态分布,因为正态分布有其它更好的方法,此处只是举个例子)

首先定义正态分布函数:

Normalpdf=@(x)((1./sqrt(2.*pi)).*exp(-0.5.*x.^2))

然后调用mhs函数:

[y,rtp]=mhs(Normalpdf,50,1,1000)

初值为50,方差为1,长度为1000

运行后得到的链存在y中,可以做出y的路径图直方图:

plot(y)

hist(y,50)

结果如下:

可以看出,大概在520次转移时,链条开始收敛到标准正态分布

直方图:

这是整个链条的直方图,因为链条有约一半的数据还没有收敛到正态分布,所以不是很直观,如果把链条前面的550个数据“切掉”,只保留后面的450个数据明就好看多了,这也是为什么MCMC需要把“头”砍掉的原因

yhat=y([550:1000]);

hist(yhat,50)

这样结果就好多了。

 

 

路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2024-5-1 23:49 , Processed in 0.184171 second(s), 30 queries .

回顶部