MC, MCMC, Gibbs采样 原理&实现(in R)
本文用讲一下指定分布的随机抽样方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,并用R语言实现了几个例子:
1. Markov Chain (马尔科夫链)
2. Random Walk(随机游走)
3. MCMC具体方法:
3.1 M-H法
3.2 Gibbs采样
PS:本篇blog为ese机器学习短期班参考资料(20140516课程),课上讲详述。
下面三节分别就前面几点简要介绍基本概念,并附上代码。这里的概念我会用最最naive的话去概括,详细内容就看我最下方推荐的链接吧(*^__^*)
0. MC(Monte Carlo)
生成指定分布的随机数的抽样。
1. Markov Chain (马尔科夫链)
假设 f(t) 是一个时间序列,Markov Chain是假设f(t+1)只与f(t)有关的随机过程。
Implement in R:
- #author: rachel @ ZJU
- #email: zrqjennifer@gmail.com
- N = 10000
- signal = vector(length = N)
- signal[1] = 0
- for (i in 2:N)
- {
- # random select one offset (from [-1,1]) to signal[i-1]
- signal[i] = signal[i-1] + sample(c(-1,1),1)
- }
- plot( signal,type = 'l',col = 'red')
2. Random Walk(随机游走)
如布朗运动,只是上面Markov Chain的二维拓展版:
Implement in R:
- #author: rachel @ ZJU
- #email: zrqjennifer@gmail.com
- N = 100
- x = vector(length = N)
- y = vector(length = N)
- x[1] = 0
- y[1] = 0
- for (i in 2:N)
- {
- x[i] = x[i-1] + rnorm(1)
- y[i] = y[i-1] + rnorm(1)
- }
- plot(x,y,type = 'l', col='red')
3. MCMC具体方法:
MCMC方法最早由Metropolis(1954)给出,后来Metropolis的算法由Hastings改进,合称为M-H算法。M-H算法是MCMC的基础方法。由M-H算法演化出了许多新的抽样方法,包括目前在MCMC中最常用的Gibbs抽样也可以看做M-H算法的一个特例[2]。
概括起来,MCMC基于这样的理论,在满足【平衡方程】(detailed balance equation)条件下,MCMC可以通过很长的状态转移到达稳态。
3.1 M-H法
1. 构造目标分布,初始化x0
2. 在第n步,从q(y|x_n) 生成新状态y
3. 以一定概率((pi(y) * P(x_n|y)) / (pi(x) * P(y|x_n)))接受y <PS: 看看上面的平衡方程,这个概率表示什么呢?参考这里和[1]>
implementation in R:
- #author: rachel @ ZJU
- #email: zrqjennifer@gmail.com
- N = 10000
- x = vector(length = N)
- x[1] = 0
- # uniform variable: u
- u = runif(N)
- m_sd = 5
- freedom = 5
- for (i in 2:N)
- {
- y = rnorm(1,mean = x[i-1],sd = m_sd)
- print(y)
- #y = rt(1,df = freedom)
- p_accept = dnorm(x[i-1],mean = y,sd = abs(2*y+1)) / dnorm(y, mean = x[i-1],sd = abs(2*x[i-1]+1))
- #print (p_accept)
- if ((u[i] <= p_accept))
- {
- x[i] = y
- print("accept")
- }
- else
- {
- x[i] = x[i-1]
- print("reject")
- }
- }
- plot(x,type = 'l')
- dev.new()
- hist(x)
3.2 Gibbs采样
那么在Gibbs采样中对其迭代采样的过程,实现如下:
- #author: rachel @ ZJU
- #email: zrqjennifer@gmail.com
- #define Gauss Posterior Distribution
- p_ygivenx <- function(x,m1,m2,s1,s2)
- {
- return (rnorm(1,m2+rho*s2/s1*(x-m1),sqrt(1-rho^2)*s2 ))
- }
- p_xgiveny <- function(y,m1,m2,s1,s2)
- {
- return (rnorm(1,m1+rho*s1/s2*(y-m2),sqrt(1-rho^2)*s1 ))
- }
- N = 5000
- K = 20 #iteration in each sampling
- x_res = vector(length = N)
- y_res = vector(length = N)
- m1 = 10; m2 = -5; s1 = 5; s2 = 2
- rho = 0.5
- y = m2
- for (i in 1:N)
- {
- for(i in 1:K)
- {
- x = p_xgiveny(y, m1,m2,s1,s2)
- y = p_ygivenx(x, m1,m2,s1,s2)
- # print(x)
- x_res[i] = x;
- y_res[i] = y;
- }
- }
- hist(x_res,freq = 1)
- dev.new()
- plot(x_res,y_res)
- library(MASS)
- valid_range = seq(from = N/2, to = N, by = 1)
- MVN.kdensity <- kde2d(x_res[valid_range], y_res[valid_range], h = 10) #估计核密度
- plot(x_res[valid_range], y_res[valid_range], col = "blue", xlab = "x", ylab = "y")
- contour(MVN.kdensity, add = TRUE)#二元正态分布等高线图
- #real distribution
- # real = mvrnorm(N,c(m1,m2),diag(c(s1,s2)))
- # dev.new()
- # plot(real[1:N,1],real[1:N,2])
x分布图:
(x,y)分布图:
Reference:
1. http://www2.isye.gatech.edu/~brani/isyebayes/bank/handout10.pdf
2. http://site.douban.com/182577/widget/notes/10567181/note/292072927/
3. book: http://statweb.stanford.edu/~owen/mc/
4. Classic: http://cis.temple.edu/~latecki/Courses/RobotFall07/PapersFall07/andrieu03introduction.pdf
from: http://blog.csdn.net/abcjennifer/article/details/25908495
MC, MCMC, Gibbs采样 原理&实现(in R)的更多相关文章
- MC, MCMC, Gibbs採样 原理&实现(in R)
本文用讲一下指定分布的随机抽样方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,并用R语言实现了几个样 ...
- MCMC随机采样
1 MCMC蒙特卡罗方法 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多 ...
- Gibbs采样
(学习这部分内容大约需要50分钟) 摘要 Gibbs采样是一种马尔科夫连蒙特卡洛(Markov Chain Monte Carlo, MCMC)算法, 其中每个随机变量从给定剩余变量的条件分布迭代地重 ...
- MCMC(四)Gibbs采样
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)MCMC采样和M-H采样 MCMC(四)Gibbs采样 在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好 ...
- 如何做Gibbs采样(how to do gibbs-sampling)
原文地址:<如何做Gibbs采样(how to do gibbs-sampling)> 随机模拟 随机模拟(或者统计模拟)方法最早有数学家乌拉姆提出,又称做蒙特卡洛方法.蒙特卡洛是一个著名 ...
- 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...
- MCMC等采样算法
一.直接采样 直接采样的思想是,通过对均匀分布采样,实现对任意分布的采样.因为均匀分布采样好猜,我们想要的分布采样不好采,那就采取一定的策略通过简单采取求复杂采样. 假设y服从某项分布p(y),其累积 ...
- 关于LDA的gibbs采样,为什么可以获得正确的样本?
算法里面是随机初始了一个分布,然后进行采样,然后根据每次采样的结果去更新分布,之后接着采样直到收敛. 1.首先明确一下MCMC方法. 当我们面对一个未知或者复杂的分布时,我们经常使用MCMC方法来进行 ...
- MCMC&Gibbs sampling
Note of Markov Chain Monte Carlo and Gibbs Sampling : http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...
随机推荐
- 【URAL】1960. Palindromes and Super Abilities
http://acm.timus.ru/problem.aspx?space=1&num=1960 题意:给一个串s,要求输出所有的s[0]~s[i],i<|s|的回文串数目.(|s|& ...
- 【BZOJ1008】1008: [HNOI2008]越狱 简单组合数学+快速幂
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...
- linux共享内存实验
顾名思义,消息队列就是一些消息的列表,用户可以在消息队列中添加消息和读取消息等.从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势.同时,这些消息又是存 ...
- 关于window的resize事件
也许你也遇到过这样的问题,或者还没注意到有过这样的问题,如下代码,在窗口发生变化时,会进入死循环: var _funResize = function(){ console.log('resize.. ...
- Redis集群的配置
[转]Redis集群的配置 一:memcache 和 Redis 对比总结 [memecache 特点] 1:速度最快(没有自测,但网上有详细的测试用例) 2:支持水平扩展,可以任意添加节点 [red ...
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- java pio项目使用
一.简介 pio是apache的一个针对microsoft office的一个开源项目. Apache POI - the Java API for Microsoft Documents 官网地址: ...
- java web(四)文件上传与下载
一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...
- 一次有趣的XSS漏洞挖掘分析(3)最终篇
这真是最后一次了.真的再不逗这个程序员了.和预期一样,勤奋的程序员今天又更新程序了.因为前面写的payload都有一个致命的弱点,就是document.write()会完全破坏DOM结构.而且再“完事 ...
- 配置samba服务一例
问题: 在/data/share目录下建立三个子目录public.training.devel用途如下 public目录用于存放公共数据,如公司的规章制度 training目录用于存放公司的技术培训资 ...