• 问题背景:我们有一些观测数据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. tail 显示文件最后若干行内容

    功能:tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行.显示每个指定文件的最后10 行到标准输出.若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头.如果不指定文件或文 ...

  2. Learning in Two-Player Matrix Games

    3.2 Nash Equilibria in Two-Player Matrix Games For a two-player matrix game, we can set up a matrix ...

  3. SQL获取汉字首字母

    )) ) as begin ) ) collate Chinese_PRC_CI_AS,letter )) insert into @t(chr,letter) select '吖','A' unio ...

  4. Linq Group By

    TableA { Id int, Name string, Group  int Score int } 从 Id Name Group Score 1 张三 A 70 2 李四 A 80 3 王五 ...

  5. iOS中AutoLayer自动布局流程及相关方法

    关于UIView的Layer,IOS提供了三个方法: 1.layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本, ...

  6. Spark源码学习1.2——TaskSchedulerImpl.scala

    许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...

  7. 解决ie6 fixed 定位以及抖动问题

    像你所遇到的问题一样, IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法.如果我们需要做某个元素始终位于浏览器的底部, ...

  8. jQuery 的三种获取值的方式

    本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我 ...

  9. BackgroundWorker组件的作用

    当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWorker类就很有用了. 要使用BackgroundWorker ...

  10. Struts2 配置文件result的name属性和type属性

    Struts2 配置文件result的name属性和type属性:Name属性SUCCESS:Action正确的执行完成,返回相应的视图,success是 name属性的默认值: NONE:表示Act ...