本文用讲一下指定分布的随机抽样方法: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. N = 10000
  4. signal = vector(length = N)
  5. signal[1] = 0
  6. for (i in 2:N)
  7. {
  8. # random select one offset (from [-1,1]) to signal[i-1]
  9. signal[i] = signal[i-1] + sample(c(-1,1),1)
  10. }
  11. plot( signal,type = 'l',col = 'red')

2. Random Walk(随机游走)

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

Implement in R:

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

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

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

  2. MCMC随机采样

    1 MCMC蒙特卡罗方法 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多 ...

  3. Gibbs采样

    (学习这部分内容大约需要50分钟) 摘要 Gibbs采样是一种马尔科夫连蒙特卡洛(Markov Chain Monte Carlo, MCMC)算法, 其中每个随机变量从给定剩余变量的条件分布迭代地重 ...

  4. MCMC(四)Gibbs采样

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)MCMC采样和M-H采样 MCMC(四)Gibbs采样 在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好 ...

  5. 如何做Gibbs采样(how to do gibbs-sampling)

    原文地址:<如何做Gibbs采样(how to do gibbs-sampling)> 随机模拟 随机模拟(或者统计模拟)方法最早有数学家乌拉姆提出,又称做蒙特卡洛方法.蒙特卡洛是一个著名 ...

  6. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...

  7. MCMC等采样算法

    一.直接采样 直接采样的思想是,通过对均匀分布采样,实现对任意分布的采样.因为均匀分布采样好猜,我们想要的分布采样不好采,那就采取一定的策略通过简单采取求复杂采样. 假设y服从某项分布p(y),其累积 ...

  8. 关于LDA的gibbs采样,为什么可以获得正确的样本?

    算法里面是随机初始了一个分布,然后进行采样,然后根据每次采样的结果去更新分布,之后接着采样直到收敛. 1.首先明确一下MCMC方法. 当我们面对一个未知或者复杂的分布时,我们经常使用MCMC方法来进行 ...

  9. MCMC&Gibbs sampling

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

随机推荐

  1. 链式前向星+SPFA

    今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...

  2. 两种不同png图片的在项目中的运用

    png图片主要分为两种 png-8和png-24. PNG8和PNG24后面的数字则是代表这种PNG格式最多可以索引和存储的颜色值.”8″代表2的8次方也就是256色,而24则代表2的24次方大概有1 ...

  3. IOS启动顺序

    一.UIApplicationMain的执行步骤1.创建一个UIApplication对象,一个程序对应一个UIApplication对象(单例),UIApplication对象是程序的象征2.接下来 ...

  4. XAML parser exception

    To debug xaml exception: Visual Studio -> Debug -> Exception -> Common Language Runtime Exc ...

  5. Hibernate的第一次测试解析

    解析:此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通过属性作为筛选条件,如统计报表数据.使用 ...

  6. [LintCode] Toy Factory 玩具工厂

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  7. Save vtkImageData to BMP Image 保存vtkImageData为图片

    在VTK中,我们有时候想要保存vtkImageData类的变量到一幅图片,可以使用如下的实例代码: #include <vtkBMPReader.h> #include <vtkBM ...

  8. 学习使用vim,熟悉Linux

    随着对vim一步一步的熟悉,对Linux的资料查阅,在加上今天阅读了王垠的文章,更加的觉得学习vim是正确的选择.抛弃Windows思维,进入Linux的世界,才发现是思维上的转变,如学习英语一样,是 ...

  9. springMVC工作机制和框架搭建配置说明

    先说一下springMVC的工作机制 1.springmvc把 所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作. 2.Dispatcher ...

  10. 在PHP与HTML混合输入的页面或者模板中就需要对PHP代码进行闭合

    PHP程序的时候会在文件的最后加上一个闭合标签,如下: <?phpclass MyClass{public function test(){//do something, etc.}}?> ...