Python中的yield用法,python中yield的作用

  Python中的yield用法,python中yield的作用

  马尔可夫链蒙特卡罗(MCMC)方法是一类基于构造马尔可夫链从概率分布中进行采样的算法,该马尔可夫链具有作为其平稳分布的期望分布。在许多步骤之后,链的状态被用作期望分布的样本。样品的质量随着步骤数的增加而提高。

  使用MCMC,我们从(简单)建议分布中抽取样本,以便每次抽取仅取决于前一次抽取的状态(即,样本形成马尔可夫链,p=,N(0,))。

  理解MCMC及一系列改进的采样算法的关键在于对马尔可夫随机过程的理解。关于更详细的讨论,请参考重温马尔可夫随机过程。

  对于给定的概率分布(x),我们希望有一种便捷的方式来生成其对应的样本。由于mdbq链可以收敛到平稳分布,一个非常好的想法(Metropolis,1953)是,如果我们可以用转移矩阵P构造一个mdbq链,使得mdbq链的平稳分布正好是(x),那么我们将从任意初始状态开始,沿着mdbq链移动,得到一个转移序列x0,x1,x2,xn,xn1。

  mdbq链的收敛性质主要由转移矩阵P决定,所以基于mdbq链(如MCMC)采样的关键问题是如何构造转移矩阵,使其对应的平稳分布正好是我们需要的分布(x)。

  我们先来看看经典的MCMC采样算法:

  基于MCMC算法的低采样率((xt,y)=p(y)q(y,xt)太小,使得u(xt,y)难以成立),提出了一种广为人知且应用广泛的Metropolis-Hastings采样算法(只修改了(xt,y)的选取):

  用MCMC抽样算法对贝塔分布进行抽样

  关于贝塔分布的更多细节,请参考贝塔函数和伽玛函数以及它们与贝塔分布的关系。已知贝塔分布的概率密度函数(pdf)为:

  f(x;a,b)==constantx1(1x)1x1(1x)1b(a,b)

  假设我们的任意一条马氏链在区间[0,1]上有无限个状态,转移矩阵为P,满足Pij=Pji(对称矩阵)。在下面的描述和实现中,我们实际上不需要任何关于p的信息。

  初始化mdbq链Initial State(初始状态)IU (0,1)

  在随机转移矩阵P的第I行中选择新的Proposal State(表示从当前状态I开始的可能状态)。为了简单起见,我们选择jU(0,1)。

  计算接受概率(本质还是舍选):

  ij=min{sjPjisiPij,1}

  利用上述约束条件Pij=Pji,ij的定义可以简化如下:

  ij=min{sjsi,1}

  其中si=cia1 (1i) B1,SJ=cja1 (1j) B1,

  取UU(0,1),如果uij,接受转移ij,否则,不接受。

  重复的

  import numpy as NP import scipy . special as ssimport matplotlib . py plot as PLT def beta _ s(x,a,b):return x * *(a-1)*(1-x)* *(b-1)def beta(x,a,b): return beta_s(x,a,b)/ss beta(a,b)def plot_mcmc(a,b):cur=NP . random . rand()States=[cur]for I in range(10 * * 5):next,u=NP . randformat(a,b)) plt.hist(states[-1000:],25,normed=True,label=simu mcmc: a={},b={} 。format(a,b))PLT . show()if _ _ name _ _= _ _ main _ _ :plot _ MCMC(0.1,0.1) plot_mcmc(1,1) plot_mcmc(2,3)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: