• 问题背景:我们有一些观测数据X,这些数据假设是取值为1,...,m;我们还知道每个数据观测到的频数为:

  但是我们现在无法计算B的大小。(这是一个假设,毕竟计算一串数字的和不是难事)

  • 问题: 我们需要通过仿真产生一串随机变量,并且它们的概率分布函数为:

  • 分析:如果B是可以计算的,那么(j)自然也是可以计算的。然后自然很容易随机生成服从这个概率分布的一串随机数。但是B不能计算。。。我们可以采用一个曲线救国的方案。

  直观上来考虑这个问题,产生随机数时是一个一个地产生随机数,每个随机数取值为1,...,m中某一个。我们可以:

1)把一个随机数看成一个状态;

2)一个随机数的产生取决于前一个随机数,那么每个状态取决于前一个状态;

  • 问题等效:对于状态{1,...,m},有某个Markov Chain状态转移矩阵P,,随机选择一个初始状态,根据状态转移矩阵P,,依次产生一个状态序列。但是,重点是我们需要设计这个转移矩阵P,使得最终的产生的状态序列的概率分布为,也就是说这个Markov Chain的最终稳定状态时各个状态的概率分布为
  • Hasting-Metropolis算法描述

  算法引入了一个随机选择的Markov Chain转移矩阵Q,。注意Q不是上面讲的P,而是用来构造P的一个辅助状态转移矩阵。构造的过程:

1) 根据Q,从当前状态,设为i,转移到状态下一个状态,设为j;

2)引入另一个概率函数,这个概率决定转移到下一个状态j或者停留在现在的状态i;

结合上述1,2)可以得到一个新的转移矩阵,并且可以经过精心构造,使得这个矩阵作为解决“等效问题”中的P矩阵,下面来看如何“精心构造”:

根据1,2)

根据平稳Markov Chain的“时序可逆”性质:

or

因为是一个概率值,必须小于1,所以最终的构造为:

但是是未知的(因为B无法求值),好在上式中是(i)/(j)=b(i)/b(j),那么:

  • Hasting-Metropolis算法流程

1) 选择一个不可约Markov Chain概率转移矩阵;随机选择初始状态;

2)  let n=1, X[n]=k;

3) 生成随机数,生成随机数 U∈(0, 1)

4) 如果,则选择NS=X;否则选择NS=X[n];

5) n=n+1, X[n]=NS;

6) go to 3)

说明,以上在讨论函数和算法流程中,都没有特别考虑i = j的情况。原因是i=j时“不失一般性”。此时=1,算法步骤4)一定会选择NS=X,而此时X==X[n]。所以,算法步骤3)中如果产生的X==X[n],那么4)定然会保持原来状态从而X[n+1]<-X[n]。

  • 仿真例子

通过R语言实现用H-M算法采样服从混合高斯分布密度函数。

主程序:

source("intgMatrix.R")
source("sampleByPr.R") FF = 10000# sample points br<-rnorm(FF/2, 0, 10)
br2<-rnorm( FF/2, 60, 10)
br <- c(br, br2)
br<-round(br) tbl <- table(br) b<-unname(tbl) # a sequence of number m <- length(b)
#generate Q
r<-c()
for(i in 1:m)
{
r_ <- runif(m, 0, 1)
r_ <- r_ / sum(r_) # nomalize
r<- c(r, r_)
}
Q<- t(matrix(r, m, m))
Qint <- intgMatrix(Q) # row-based integral # start to sample sn data
sn = FF # #sample
X <- c() # sample data (index of b) # initial step
k<- round(runif(1, 1, m))
X[1] <- k # interation steps
for(n in 1:(sn-1))
{
PrX_j <- Qint[X[n], ] # last sample's index as row-index in Q
while(TRUE){
X_tmp <- X[n]
X_tmp <- sampleByPr(PrX_j) # the index of X[n]
if(X_tmp != X[n]){
break
}
} U <- runif(1, 0, 1)
# for alph(i, j)
al_ <- (b[X_tmp] * Q[X_tmp, X[n]]) / (b[X[n]] * Q[X[n], X_tmp])
if(al_ > 1){al_ <- 1}
NS <- X[n]
if(U < al_) {
NS <- X_tmp
} X[n + 1] <- NS } # plot bnn<-as.numeric(b)
plot(1:length(bnn),bnn,col="red")
Xnn <- as.numeric(table(X))
lines(1:length(Xnn),Xnn/rt,col="green")

概率积分矩阵,Qi[i,k]=∑j=1,..,kQ[i,j]

intgMatrix <- function(Q)
{
Qi<-matrix(nrow=dim(Q)[1], ncol = dim(Q)[2])
Qi[, 1] = Q[,1]
for(i in 1:dim(Q)[1]){
for(j in 2:dim(Q)[2]){
Qi[i,j] <- Qi[i, j- 1] + Q[i, j]
}
}
return(Qi)
}

根据概率积分向量生成采样点。

概率积分向量pi[i]=∑j=1,..,ip[i],其中p[i]=Pr{X=i}为原始概率分布

sampleByPr <- function(Pr_vector)
{
ru <- runif(1,0,1) for(i in 1:length(Pr_vector)){
if(Pr_vector[i] > ru){
return(i)
}
}
}

[stat.simulation] Hasting-Metropolis Algorithm的更多相关文章

  1. MCMC: The Metropolis Sampler

    本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...

  2. My Open Source Projects

    • MyMagicBox (https://github.com/yaoyansi/mymagicbox)   Role: Creator   Miscellaneous projects for e ...

  3. (转)Markov Chain Monte Carlo

    Nice R Code Punning code better since 2013 RSS Blog Archives Guides Modules About Markov Chain Monte ...

  4. Top 10 Algorithms of 20th and 21st Century

    Top 10 Algorithms of 20th and 21st Century MATH 595 (Section TTA) Fall 2014 TR 2:00 pm - 3:20 pm, Ro ...

  5. QuantStart量化交易文集

    Over the last seven years more than 200 quantitative finance articles have been written by members o ...

  6. MCMC&Gibbs sampling

    Note of Markov Chain Monte Carlo and Gibbs Sampling :  http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...

  7. Metropolis Hasting算法

    Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术,一个非常重要的应用是从给定的概率分布中抽样.主要原理是构造了一个精妙的Markov链,使得该链的稳态 ...

  8. Metropolis Light Transport学习与实现

    这段时间一直在看Metropolis Light Transport(简称mlt),现利用这篇博文把之前看资料已经coding上的一些体会记录下来. 1.Before MLT 在MLT算法被提出之前, ...

  9. [Bayes] Metropolis-Hastings Algorithm

    [Bayes] prod: M-H: Independence Sampler for Posterior Sampling dchisq gives the density,             ...

随机推荐

  1. 在Win7 64位操作系统下安装Oracle 10g

    参见网址http://www.cnblogs.com/newstar/archive/2010/12/01/1878026.html 1.下载安装程序,可以到这个网址去下载 http://www.or ...

  2. iOS thirdKeyboard Develop (APP Extension)

    如果需要开发第三方键盘 首先得了解一下苹果官方文档  https://developer.apple.com/library/ios/documentation/General/Conceptual/ ...

  3. 关于ssh调用远程后台命令挂住的解释

    目前看到的最详细最全面的解释: http://www.snailbook.com/faq/background-jobs.auto.html

  4. vmware 安装 macos

    http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html

  5. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  6. 重写ajax方法实现异步请求session过期时跳转登录页面

    jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _suc ...

  7. Thinkpad T420 指纹开机 win10 解决方案

    以前没感觉笔记本上的指纹有什么用,后来无意看到了指纹能开机.便尝试把这个功能给用起来.果然麻烦了些. 1.官网上没有win10的指纹应用软件. 下载了win8的版本,安装后没有问题,可以登录win10 ...

  8. 无法将文件" "复制到“bin\*.*”。对路径“bin\*.*”的访问被拒绝。 解决方法

    如果没有特别什么代码的错误,而是更新了某个自动获取的Webserive 那么什么都不用管,直接VS关闭,从新打开就好了.

  9. ZendStudio13 PHP调试环境快速配置

    1.百度ZendStudio13,汉化,破解,注册: 2.安装国产Apache+MySql一键安装环境phpStudy,方便快速  http://www.phpstudy.net/a.php/208. ...

  10. 用UltraEdit软件替换回车换行的窍门

    转载:http://www.zhuantilan.com/jiqiao/46518.html 方法/步骤 1.打开一个原始文档,在文档中各个人物名称是以逗号分隔的,我们下面来尝试把逗号替换为换行符. ...