- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在阅读 Metropolis-Hastings (MH) 算法。从理论上讲,我了解该算法的工作原理。现在,我正在尝试使用 python 实现 MH 算法。
我遇到了以下 notebook .它完全适合我的问题,因为我想通过一条直线来拟合我的数据,同时考虑到我的数据的测量误差。我将粘贴我发现难以理解的代码:
# initial m, b
m,b = 2, 0
# step sizes
mstep, bstep = 0.1, 10.
# how many steps?
nsteps = 10000
chain = []
probs = []
naccept = 0
print 'Running MH for', nsteps, 'steps'
# First point:
L_old = straight_line_log_likelihood(x, y, sigmay, m, b)
p_old = straight_line_log_prior(m, b)
prob_old = np.exp(L_old + p_old)
for i in range(nsteps):
# step
mnew = m + np.random.normal() * mstep
bnew = b + np.random.normal() * bstep
# evaluate probabilities
# prob_new = straight_line_posterior(x, y, sigmay, mnew, bnew)
L_new = straight_line_log_likelihood(x, y, sigmay, mnew, bnew)
p_new = straight_line_log_prior(mnew, bnew)
prob_new = np.exp(L_new + p_new)
if (prob_new / prob_old > np.random.uniform()):
# accept
m = mnew
b = bnew
L_old = L_new
p_old = p_new
prob_old = prob_new
naccept += 1
else:
# Stay where we are; m,b stay the same, and we append them
# to the chain below.
pass
chain.append((b,m))
probs.append((L_old,p_old))
print 'Acceptance fraction:', naccept/float(nsteps)
代码简单易懂,但我很难理解 MH 是如何实现的。
我的问题在 chain.append
(倒数第三行)中。作者将附加 m
和 b
,无论它们是被接受还是被拒绝。为什么?难道他不应该只附加
接受的点吗?
最佳答案
以下 R 代码演示了为什么捕获被拒绝的案例很重要:
# 20 samples from 0 or 1. 1 has an 80% probability of being chosen.
the.population <- sample(c(0,1), 20, replace = TRUE, prob=c(0.2, 0.8))
# Create a new sample that only catches changes
the.sample <- c(the.population[1])
# Loop though the.population,
# but only copy the.population to the.sample if the value changes
for( i in 2:length(the.population))
{
if(the.population[i] != the.population[i-1])
the.sample <- append(the.sample, the.population[i])
}
这段代码运行时,the.population
得到20个值,例如:
0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1
此总体中 1 的概率为 16/20 或 0.8。正是我们预期的概率......
另一方面,仅记录更改的样本如下所示:
0 1 0 1 0 1
样本中出现 1 的概率为 3/6 或 0.5。
我们正在尝试建立一个分布,拒绝新值意味着旧值比新值更有可能性。这需要被捕获,以便我们的分布是正确的。
关于python - Metropolis-Hastings 接受-拒绝实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538537/
我目前在实现 Metropolis-Hastings 算法时遇到问题。 我正在尝试使用该算法来计算形式的积分 在使用这个算法时,我们可以获得一长串配置(在这种情况下,每个配置只是一个数字),这样在链的
我是一个统计学外行,在阅读了一些关于 Metropolis-Hastings MCMC 算法的博客和示例之后,我有一个问题: 在M-H算法中,一个新样本(比如,x')是否被接受取决于“接受概率”,al
MCMC是从复杂概率模型中采样的通用技术。 蒙特卡洛 马尔可夫链 Metropolis-Hastings算法 问题 如果需要计算有复杂后验pdf p(θ|
我正在尝试在 C 中实现 Metropolis-Hastings 算法以实现简单的线性回归(不使用其他库(boost、Eigen 等)并且不使用二维数组)*。为了更好地测试代码/跟踪图的评估,我通过保
每当我制作Metropolis UI项目并尝试将Label字体更改为除白色以外的任何颜色时,都不会发生任何事情,并且在编译项目时颜色始终为白色, 那么,有什么可以改变颜色的字体吗? 我正在使用Delp
我目前正在用 C 编写一些用于模拟退火的代码。我在使用此函数时遇到了问题: int metrop (E, E1, T) { int j; if (exp((-E-E1)/T) > ran(
我正在尝试使用 Metropolis-Hastings 进行贝叶斯回归。测试数据生成如下(Python代码,我没有复制整个代码): trueA = 5 ; trueB = 7 ;trueSD = 10
我一直在阅读 Metropolis-Hastings (MH) 算法。从理论上讲,我了解该算法的工作原理。现在,我正在尝试使用 python 实现 MH 算法。 我遇到了以下 notebook .它完
我有一个代码,旨在模拟理想气体在盒子中的运动。它基于蒙特卡罗模拟中的大都会方法。但是,我使用了一系列逻辑语句(主要是 ifs)来定义边界条件,以找到与随机选择的粒子相邻的粒子。该算法为 1x4 矩阵内
测试平台目标的不同选项我在 delphi xe5 帮助中找到了以下信息: Note: You cannot set OS X as the target platform for a Metropol
我正在尝试编写一个基于 Haskell 中的 Metropolis 算法的 MCMC 程序,但我在从概率分布中采样(生成伪随机数)和构建程序时遇到问题。目前,我很高兴使用带有硬编码种子的生成器,而不是
我正在尝试编写一个基于 Haskell 中的 Metropolis 算法的 MCMC 程序,但我在从概率分布中采样(生成伪随机数)和构建程序时遇到问题。目前,我很高兴使用带有硬编码种子的生成器,而不是
我正在尝试使用带有 R 的 MH 算法来实现一个简单的 MCMC,问题是我得到了这个错误(我试图计算 alpha 并且它不是 NA 问题) Error in if (runif(1) 0){
我有一个相对简单的函数,具有三个未知输入参数,我只知道它们的上限和下限。我也知道我所有数据的输出 Y 应该是什么。 到目前为止,我已经在 python 中完成了一个简单的网格搜索,遍历所有可能的参数组
我一直在运行一些相当昂贵且老化时间较长的型号。我想保存并恢复 AdaptiveMetropolis 步骤方法的状态(至少)以减少老化时间。有没有推荐的方法来做到这一点,或者我应该腌制 step_met
我遇到了在我的应用程序中使用表单中的 TListBox 时,在 HorzScrollBox 中选择不正确的项目的问题。该表单上有两个(或更多)TListBox。它们彼此远离放置,使得它们的绝对左坐标差
我有一个结构如下图所示的模型: 我有几个人(在这张图片中索引为 1...5)。种群参数(A 和 B,但可以有更多)确定每个个体的潜在变量 L[i] 的分布。潜在变量 L[i] 以概率的方式确定观测值
我的 Metropolis-Hastings 问题具有平稳的二项分布,所有建议分布 q(i,j) 都是 0.5。引用绘图和直方图,算法是否应该如此明确地以 0.5 为中心,二项式分布的概率? pi <
我在使用基于 Metropolis-Hastings 算法的 MCMC 技术对后验分布进行采样(因此是贝叶斯方法)方面很新。 为此,我在 R 中使用了 mcmc 库。我的分布是多维的。为了检查这个me
我正在尝试用 Python 实现一个简单的蒙特卡洛(我对此还很陌生)。来自 C 我可能走的是最错误的道路,因为我的代码对于我所要求的来说太慢了:对于 60 个 3d 粒子和周期性边界条件(PBC),我
我是一名优秀的程序员,十分优秀!