分布是一系列数字的规律组合。如果在收集了历史中的几百个数据后,我想知道这群数据背后的发射机制是什么,那么就得去寻找这个分布。当然这里的重点不是寻找分布,而是在已知分布的情况下,如何模拟这个机制发射出来的一系列数字呢?
MCMC(Markov Chain Monte Carlo)是马尔科夫链下的蒙特卡洛方法,因为马尔科夫链在满足某些条件下具有平稳分布,如果能够将平稳分布与目标分布联系起来,那么就可以达到对目标分布进行抽样的目的。这里主要介绍的是Metropolis Hasting 算法和Gibbs sampling 算法。
一、Metropolis Hasting
1、算法理解
我们的目标是对Target Distribution进行抽样,首先,我们要引入一条具有平稳分布的马氏链,这条马氏链收敛的平稳分布我们称为Proposal Distribution,而这条马氏链的表现形式是概率转移矩阵
如何根据这条马氏链求得目标分布呢?这里由马氏链的细致平稳性引入。
为了使(1.2)式成立,所以引入了接受率
以上就是Metropolis抽样方法的全部内容了,而Metropolis hasting 算法则对接受率做了一点改进。当接受率太小的时候,我们很难从当前的样本值跳到其他状态,所以对
2、proposal distribution的选取

当proposal distribution与目标分布越靠近时,抽取的样本也就越合理。但是proposal distribution下的马氏链如何确定,两个分布的距离如何衡量,这些也都是可以继续探讨也需要权衡的问题。
3、共轭的正态分布示例
我们用M-H抽样算法来检验上面得后验分布是否准确。即在已知得各参数和观测值y下抽出一系列的
找到下一个状态
。这里proposal distribution设为正态分布。生成
,
.
- 接受率
.其中,
为随机变量
的概率密度。
- 接受率的概率实现。如果接受,
,否则,
。
import
二、Gibbs sampling
1、算法理解
Gibbs sampling适用于高维分布的抽样问题。在M-H抽样算法的基础上,如果我们能够比较容易的得到条件分布,那么就可以通过固定其他维度,一次只对一个维度上的条件分布抽样的方法进行全局抽样。
Gibbs sampling里的接受率恒为1。举例说明,

2、示例
一只鸡每天会下N个蛋,N服从参数为
在不引入随机变量N的时候,后验分布比较麻烦。引入N后,可得,
通过迭代,即可得到p,N的抽样值。
x, lambda1, a, b = 7, 10, 1, 1
niter = 10000
p = [0 for i in range(niter)]
N = [0 for i in range(niter)]#初始值
p[0] = 0.5
N[0] = 2*x
for i in range(1,niter):p[i] = random.betavariate(x+a, N[i-1]-x+b)N[i] = x + np.random.poisson(lambda1*(1-p[i-1]))plt.hist(x = p, bins = 100,normed=True)
plt.hist(x = N, bins = 100,normed=True)
plt.show()
[1][2][3]
参考
- ^https://blog.csdn.net/lin360580306/article/details/51240398
- ^https://www.jianshu.com/p/dc7624cf6adb
- ^Introduction to Probability--Joseph K.Blitzstein