本文用讲一下指定分布的随机抽样方法: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:

  1. #author: rachel @ ZJU
  2. #email: zrqjennifer@gmail.com
  3.  
  4. N = 10000
  5. signal = vector(length = N)
  6. signal[1] = 0
  7. for (i in 2:N)
  8. {
  9. # random select one offset (from [-1,1]) to signal[i-1]
  10. signal[i] = signal[i-1] + sample(c(-1,1),1)
  11. }
  12.  
  13. plot( signal,type = 'l',col = 'red')

2. Random Walk(随机游走)

如布朗运动,仅仅是上面Markov Chain的二维拓展版:

Implement in R:

  1. #author: rachel @ ZJU
  2. #email: zrqjennifer@gmail.com
  3.  
  4. N = 100
  5. x = vector(length = N)
  6. y = vector(length = N)
  7. x[1] = 0
  8. y[1] = 0
  9. for (i in 2:N)
  10. {
  11. x[i] = x[i-1] + rnorm(1)
  12. y[i] = y[i-1] + rnorm(1)
  13. }
  14.  
  15. 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:

  1. #author: rachel @ ZJU
  2. #email: zrqjennifer@gmail.com
  3.  
  4. N = 10000
  5. x = vector(length = N)
  6. x[1] = 0
  7.  
  8. # uniform variable: u
  9. u = runif(N)
  10. m_sd = 5
  11. freedom = 5
  12.  
  13. for (i in 2:N)
  14. {
  15. y = rnorm(1,mean = x[i-1],sd = m_sd)
  16. print(y)
  17. y = rt(1,df = freedom)
  18.  
  19. 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))
  20. #print (p_accept)
  21.  
  22. if ((u[i] <= p_accept))
  23. {
  24. x[i] = y
  25. print("accept")
  26. }
  27. else
  28. {
  29. x[i] = x[i-1]
  30. print("reject")
  31. }
  32. }
  33.  
  34. plot(x,type = 'l')
  35. dev.new()
  36. hist(x)

3.2 Gibbs採样

第n次,Draw from ,迭代採样结果接近真实p(\theta_1, \theta_2, ...)
也就是每一次都是固定其它參数,对一个參数进行採样。比方对于二元正态分布,其两个分量的一元条件分布仍满足正态分布:

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

  1. #author: rachel @ ZJU
  2. #email: zrqjennifer@gmail.com
  3. #define Gauss Posterior Distribution
  4.  
  5. p_ygivenx <- function(x,m1,m2,s1,s2)
  6. {
  7. return (rnorm(1,m2+rho*s2/s1*(x-m1),sqrt(1-rho^2)*s2 ))
  8. }
  9.  
  10. p_xgiveny <- function(y,m1,m2,s1,s2)
  11. {
  12. return (rnorm(1,m1+rho*s1/s2*(y-m2),sqrt(1-rho^2)*s1 ))
  13. }
  14.  
  15. N = 5000
  16. K = 20 #iteration in each sampling
  17. x_res = vector(length = N)
  18. y_res = vector(length = N)
  19. m1 = 10; m2 = -5; s1 = 5; s2 = 2
  20. rho = 0.5
  21. y = m2
  22.  
  23. for (i in 1:N)
  24. {
  25. x = p_xgiveny(y, m1,m2,s1,s2)
  26. y = p_ygivenx(x, m1,m2,s1,s2)
  27. # print(x)
  28. x_res[i] = x;
  29. y_res[i] = y;
  30. }
  31.  
  32. hist(x_res,freq = 1)
  33. dev.new()
  34. plot(x_res,y_res)
  35. library(MASS)
  36. valid_range = seq(from = N/2, to = N, by = 1)
  37. MVN.kdensity <- kde2d(x_res[valid_range], y_res[valid_range], h = 10) #预计核密度
  38. plot(x_res[valid_range], y_res[valid_range], col = "blue", xlab = "x", ylab = "y")
  39. contour(MVN.kdensity, add = TRUE)#二元正态分布等高线图
  40.  
  41. #real distribution
  42. # real = mvrnorm(N,c(m1,m2),diag(c(s1,s2)))
  43. # dev.new()
  44. # 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)的更多相关文章

  1. MC, MCMC, Gibbs采样 原理&实现(in R)

    本文用讲一下指定分布的随机抽样方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,并用R语言实现了几个例 ...

  2. 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题

    关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...

  3. 【机器学习算法-python实现】採样算法的简单实现

    1.背景     採样算法是机器学习中比較经常使用,也比較easy实现的(出去分层採样).经常使用的採样算法有下面几种(来自百度知道):     一.单纯随机抽样(simple random samp ...

  4. FFmpeg编程学习笔记二:音频重採样

    ffmpeg实现音频重採样的核心函数swr_convert功能很强大,但是ffmpeg文档对它的凝视太过简单.在应用中往往会出这样那样的问题,事实上在读取数据->重採样->编码数据的循环中 ...

  5. Cg入门21:Fragment shader - 2D纹理採样

    体纹理:是啥? tex2D 曾经仅仅能在Fragment程序中纹理採样 UV坐标系:事实上点为左下角,范围为[0,1].U为x轴,V为y轴 watermark/2/text/aHR0cDovL2Jsb ...

  6. HDU-4190-Number Sequence-容斥原理+多重集和的r组合

    HDU-4190-Number Sequence-容斥原理+多重集和的r组合 [Problem Description] 给你\(n\)个数\(b_i\),问有多少个长度为\(n\)序列\(a_i\) ...

  7. MCMC,GIBBS SAMPLING简单摘要

    本文后面很多内容都是参考博客:http://www.cnblogs.com/xbinworld/p/4266146.html.本文主要用作学习交流备忘用. 1)简述: 随机模拟也可以叫做蒙特卡洛模拟, ...

  8. MCMC&Gibbs sampling

    Note of Markov Chain Monte Carlo and Gibbs Sampling :  http://pan.baidu.com/s/1jHpWY1o 序:A major lim ...

  9. 关于 视频同步vsync 信号在不同一时候钟域採样问题

    今天调试 视频 4k(3840 x 1920)的vsync信号(时钟为 297Mhz) 进入 170Mhz 的时钟域, 发现输出来的信号信号抖动特别厉害.后来才发现这是不同一时候钟域 造成的影响. 快 ...

随机推荐

  1. Http 辅助类

    using System; using System.Drawing; using System.IO; using System.Net; using System.Net.Cache; using ...

  2. javascript基础之for循环

    1.数组定义声名 var arry = [1,2,3,4,5]   //相当与var arry = Array(1,2,3,4,5) 2.数据的增删改查 var arry = [1,2,3,4,5] ...

  3. 从BufferedImage到InputStream,实现绘图后进行下载(生成二维码图片并下载)

    @SuppressWarnings("resource") public void download() throws Exception{ String filename = & ...

  4. memcache和activemq使用连接,然后close

    memcache和activemq使用连接,然后close

  5. .NET中删除空白字符串的10大方法

    介绍 我们有无数方法可用于删除字符串中的所有空白.大部分都能够在绝大多数的用例中很好工作,但在某些对时间敏感的应用程序中,是否采用最快的方法可能就会造成天壤之别. 如果你问空白是什么,那说起来还真是有 ...

  6. 增加Android模拟器的内存

    1,在window中,打开'C:\Users\Administrator\.android\avd\4.4.2.avd\config.ini'文件(我的是win7,xp的貌似不是'Users',是'D ...

  7. ReactiveCocoa 简单使用

    #pragma mark 指令 -(void) instructionDemo { // 创建使能信号 RACSignal * signal = [self.textField.rac_textSig ...

  8. C/C++默认浮点型

    代码: #include <iostream> #include <cstdio> using namespace std; void test(int a){ cout< ...

  9. 让一个Activity在开机后自动显示

    Activity本身不会在手机开机后自动运行的.但想让手机开机后就立刻做一些动作,需要使用广播接收器拦截手机开启广播,并在onReceive方法中完成相应的动作,如打开一个Activity. 广播接收 ...

  10. InnoDB概览

    InnoDB 采用了MVCC来支持高并发,并且实现了四个标准的隔离级别.其默认级别是REPEATABLE READ(可重复读) ,并且,通过间隙锁(next-key locking)策略防止幻读的出现 ...