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)
{
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採样 原理&实现(in R)的更多相关文章
- MC, MCMC, Gibbs采样 原理&实现(in R)
本文用讲一下指定分布的随机抽样方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,并用R语言实现了几个例 ...
- 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题
关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...
- 【机器学习算法-python实现】採样算法的简单实现
1.背景 採样算法是机器学习中比較经常使用,也比較easy实现的(出去分层採样).经常使用的採样算法有下面几种(来自百度知道): 一.单纯随机抽样(simple random samp ...
- FFmpeg编程学习笔记二:音频重採样
ffmpeg实现音频重採样的核心函数swr_convert功能很强大,但是ffmpeg文档对它的凝视太过简单.在应用中往往会出这样那样的问题,事实上在读取数据->重採样->编码数据的循环中 ...
- Cg入门21:Fragment shader - 2D纹理採样
体纹理:是啥? tex2D 曾经仅仅能在Fragment程序中纹理採样 UV坐标系:事实上点为左下角,范围为[0,1].U为x轴,V为y轴 watermark/2/text/aHR0cDovL2Jsb ...
- HDU-4190-Number Sequence-容斥原理+多重集和的r组合
HDU-4190-Number Sequence-容斥原理+多重集和的r组合 [Problem Description] 给你\(n\)个数\(b_i\),问有多少个长度为\(n\)序列\(a_i\) ...
- MCMC,GIBBS SAMPLING简单摘要
本文后面很多内容都是参考博客:http://www.cnblogs.com/xbinworld/p/4266146.html.本文主要用作学习交流备忘用. 1)简述: 随机模拟也可以叫做蒙特卡洛模拟, ...
- MCMC&Gibbs sampling
Note of Markov Chain Monte Carlo and Gibbs Sampling : http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...
- 关于 视频同步vsync 信号在不同一时候钟域採样问题
今天调试 视频 4k(3840 x 1920)的vsync信号(时钟为 297Mhz) 进入 170Mhz 的时钟域, 发现输出来的信号信号抖动特别厉害.后来才发现这是不同一时候钟域 造成的影响. 快 ...
随机推荐
- C#_DBHelper_SQL数据库操作类.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...
- webform初识
webform是个bs结构的程序, winform 是个cs结构的程序: aspx 是由 网页和cs代码 构成的: aspx的网页控件是 有, 服务器控件和客户端控件组成的. 客户端控件,就是HTML ...
- C# 在右下角弹出窗口
窗口代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...
- JavaScript网页制作特效
一.什么是JavaScript? 网页交互特效的脚本语言. 特效 二.BOM对象 能够使得JavaScript和浏览器进行对话. 主要是使用Window对象进行操作. History对象:历史,可以实 ...
- 为什么不使用frame框架的原因
框架的优点 重载页面时不需要重载整个页面,只需要重载页面中的一个框架页(减少了数据的传输,增加了网页下载速度) 方便制作导航栏 框架的缺点 会产生很多页面,不容易管理 不容易打印 浏览器的后退按钮无效 ...
- js 获取元素在页面上的偏移量的最佳方式
使用js制作效果时,我们常常要获取某个元素在页面上的偏移量(例如tip提示框功能).而获取偏移量可以直接获取相对于document的偏移量,也可以获取相对与视口的偏移量(viewpoint)加上页面滚 ...
- DNS负载均衡
1)DNS负载均衡的介绍 对于负载均衡的一个典型应用就是DNS负载均衡.庞大的网络地址和网络域名绝对是负载均衡体现优势的地方.那么它的具体原理是如何的呢?本文就将为大家详细介绍一下相关内容. DNS负 ...
- ArcMap - 使用python更新列中的值
概述:在外文网上,很多人都问在ArcMap中如何通过SQL修改属性字段的值,我见回答的人都说通过"Field Calculator",貌似不能直接通过SQL语句. 虽然学gis开发 ...
- Using Notepad++ to Execute Oracle SQL
原文链接:http://www.toadworld.com/products/toad-for-oracle/b/weblog/archive/2013/08/21/using-notepad-to- ...
- 【转】Qt之模型/视图
[本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html 作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...