[stat.simulation] Hasting-Metropolis Algorithm
- 问题背景:我们有一些观测数据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的更多相关文章
- MCMC: The Metropolis Sampler
本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...
- My Open Source Projects
• MyMagicBox (https://github.com/yaoyansi/mymagicbox) Role: Creator Miscellaneous projects for e ...
- (转)Markov Chain Monte Carlo
Nice R Code Punning code better since 2013 RSS Blog Archives Guides Modules About Markov Chain Monte ...
- 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 ...
- QuantStart量化交易文集
Over the last seven years more than 200 quantitative finance articles have been written by members o ...
- MCMC&Gibbs sampling
Note of Markov Chain Monte Carlo and Gibbs Sampling : http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...
- Metropolis Hasting算法
Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术,一个非常重要的应用是从给定的概率分布中抽样.主要原理是构造了一个精妙的Markov链,使得该链的稳态 ...
- Metropolis Light Transport学习与实现
这段时间一直在看Metropolis Light Transport(简称mlt),现利用这篇博文把之前看资料已经coding上的一些体会记录下来. 1.Before MLT 在MLT算法被提出之前, ...
- [Bayes] Metropolis-Hastings Algorithm
[Bayes] prod: M-H: Independence Sampler for Posterior Sampling dchisq gives the density, ...
随机推荐
- tail 显示文件最后若干行内容
功能:tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行.显示每个指定文件的最后10 行到标准输出.若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头.如果不指定文件或文 ...
- 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 ...
- SQL获取汉字首字母
)) ) as begin ) ) collate Chinese_PRC_CI_AS,letter )) insert into @t(chr,letter) select '吖','A' unio ...
- Linq Group By
TableA { Id int, Name string, Group int Score int } 从 Id Name Group Score 1 张三 A 70 2 李四 A 80 3 王五 ...
- iOS中AutoLayer自动布局流程及相关方法
关于UIView的Layer,IOS提供了三个方法: 1.layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本, ...
- Spark源码学习1.2——TaskSchedulerImpl.scala
许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...
- 解决ie6 fixed 定位以及抖动问题
像你所遇到的问题一样, IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法.如果我们需要做某个元素始终位于浏览器的底部, ...
- jQuery 的三种获取值的方式
本节内容主要介绍的是如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法.jQuery中为我 ...
- BackgroundWorker组件的作用
当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWorker类就很有用了. 要使用BackgroundWorker ...
- Struts2 配置文件result的name属性和type属性
Struts2 配置文件result的name属性和type属性:Name属性SUCCESS:Action正确的执行完成,返回相应的视图,success是 name属性的默认值: NONE:表示Act ...