[英]What I am doing wrong in R to python translation?
我在 R 中有一个代码,它实现了 Metropolis Hastings 算法:
trials <- 100000
sim <- numeric(trials)
sim[1] <- 2
for (i in 2: trials) {
old <- sim[i-1]
prop <- runif(1,0,5)
acc <- (exp(-(prop-1)^2/2) + exp(-(prop-4)^2/2)) /
( (exp(-(old-1)^2/2) + exp(-(old-4)^2/2)) )
if (runif(1) < acc)
sim[i] <- prop
else
sim[i] <- old }
mean(sim)
var(sim)
结果是正确的。
但是当我在 Python 中翻译它时,结果就不同了。
trials = 100000
sim = np.repeat(0,trials+1)
sim[0] = 2
for i in range (2, trials):
old = sim[i-1]
prop = np.random.uniform(0,5,1)
acc = (np.exp(-(prop-1)**2/2) + np.exp(-(prop-4)**2/2)) /( (np.exp(-(old-1)**2/2) + np.exp(-(old-4)**2/2)) )
if np.random.uniform(1) < acc:
sim[i] = prop
else:
sim[i] = old
为什么? 我在这里做错了什么?
首先,由于 Python 从0
开始,因此您希望在range(1, trials)
中的i=1
处启动 python for 循环。
其次, if np.random.uniform(1)
你只是生产1.0
,所以需要改变,例如np.random.uniform(min, max, size=1)
或np.random.uniform(size=1)
如果您只想要一个介于 0 和 1 之间的统一数字。如果不清楚,请查看np.random.uniform
的文档。
更新
第三,你在不知不觉中转换为整数,所以这也需要处理。 当习惯了 R 时,这很容易忘记(我只是自己做的)。 我在下面重构了您的代码,该解决方案应该为您提供与您在 R 中看到的类似的结果。
在这里,我将 sim 转换为float
向量,并确保在exp
函数中使用浮点数进行减法和除法。 希望这对你有用。
trials = 100000
sim = np.repeat(0,trials).astype(np.float64)
sim[0] = 2.0
for i in range (1, trials):
old = sim[i-1]
prop = np.random.uniform(0,5,1)
acc = (np.exp(-(prop-1.0)**2/2.0) + np.exp(-(prop-4.0)**2/2.0)) \
/ ( (np.exp(-(old-1.0)**2/2.0) + np.exp(-(old-4.0)**2/2.0)) )
if np.random.uniform(size=1) < acc:
sim[i] = prop
else:
sim[i] = old
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.