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: [email protected]

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: [email protected]

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能够通过非常长的状态转移到达稳态。

【平衡方程】:

pi(x) * P(y|x) = pi(y) * P(x|y)

当中pi指分布,P指概率。这个平衡方程也就是表示条件概率(转化概率)与分布乘积的均衡.

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: [email protected]

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採样

第n次,Draw from ,迭代採样结果接近真实p(\theta_1, \theta_2, ...)

也就是每一次都是固定其它參数,对一个參数进行採样。比方对于二元正态分布,其两个分量的一元条件分布仍满足正态分布:

那么在Gibbs採样中对其迭代採样的过程,实现例如以下:

#author: rachel @ ZJU
#email: [email protected]
#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)
{
	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

欢迎參与讨论并关注本博客和微博Rachel____Zhang, 兴许内容继续更新哦~

MC, MCMC, Gibbs採样 原理&amp;实现(in R)

时间: 2024-08-30 02:12:39

MC, MCMC, Gibbs採样 原理&amp;实现(in R)的相关文章

MC, MCMC, Gibbs采样 原理&amp;实现(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课程),课上讲详述. 下面三节分别就前面几点简要介绍基本概念,并附上代

音频 属性具体解释(涉及採样率、通道数、位数、比特率、帧等)

[音频] 指人耳能够听到的声音频率在20HZ~20kHz之间的声波,称为音频. [採样频率] 即取样频率, 指每秒钟取得声音样本的次数.採样频率越高,声音的质量也就越好,声音的还原也就越真实,但同一时候它占的资源比較多.因为人耳的分辨率非常有限,太高的频率并不能分辨出来. 22050 的採样频率是经常使用的, 44100已是CD音质, 超过48000或96000的採样对人耳已经没有意义.这和电影的每秒 24 帧图片的道理差点儿相同. 假设是双声道(stereo), 採样就是双份的, 文件也差点儿

音频採样位数,採样率,比特率

一.关于数字音频 数字音频是指使用数字编码的方式也就是使用0和1来记录音频信息,它是相对于模拟音频来说的. 在CD光盘和计算机技术未出现之前都是模拟音频(如录音带),当中数字/模拟转换器简称:DAC.模拟/数字转换器简称:ADC . 1.数字音频里几个重要的參数: 1)採样位数--能够理解数字音频设备处理声音的解析度,即对声音的辨析度. 就像表示颜色的位数一样(8位表示256种颜色.16位表示65536种颜色).有8位,16位,24位等.这个数值越大,解析度就越高.录制和回放的声音就越真实. 2

信号的採样和量化

信号处理有两大任务.一个是信号分析,包含时域和频域.还有一个是滤波器设计,包含FIR和IIR. 在matlab中要表示连续的模拟信号.一般用t = 0:dt:tf来表示时间点.尽管matlab中的点是离散的,但仅仅要dt取的足够小比方0.001.就能逼近连续时间. 而表示数字信号,由关系式 x(n) = x(t).t = nT,取n = 0:tf/T作为时间点,T是採样周期. dt = 0.001; tf = 6; t = 0:dt:tf; xa = sqrt(t)+cos(t); T = 0.

MCMC&amp;Gibbs sampling

Note of Markov Chain Monte Carlo and Gibbs Sampling :  http://pan.baidu.com/s/1jHpWY1o 序:A major limitation towards more widespread implementation of Bayesian approaches is that obtaining thee posterior distribution often requires the integration of

系统级性能分析工具 — Perf

离2.6.31内核开始.linux核心配备了性能分析工具perf,它可以是功能级和指令级热外表. perf Performance analysis tools for Linux. Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level (CPU/PM

Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2

Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2 http://blog.csdn.net/sunbow0 第二章Deep Belief Network (深度信念网络) 2基础及源代码解析 2.1 Deep Belief Network深度信念网络基础知识 1)综合基础知识參照: http://tieba.baidu.com/p/2895759455   http://wenku.baidu.com/link?url=

随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到PRML的笔记中去:) 背景 随机模拟也可以叫做蒙特卡罗模拟(Monte Carlo Simulation).这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆.冯.诺依曼.费米.费曼.Nicholas Metropolis, 在美国洛斯阿拉莫斯国家实验室

MCMC算法解析

MCMC算法的核心思想是我们已知一个概率密度函数,需要从这个概率分布中采样,来分析这个分布的一些统计特性,然而这个这个函数非常之复杂,怎么去采样?这时,就可以借助MCMC的思想. 它与变分自编码不同在于:VAE是已知一些样本点,这些样本肯定是来自于同一分布,但是我们不知道这个分布函数的具体表达式,然而我们需要从这个分布中去采取新的样本,怎么采样,这时,就需要借助VAE的思想. 个人的一点总结,不知道是否正确,如果有不同的理解,希望指正批评! MCMC原理讲解 以下内容博客转自:https://w