繁体   English   中英

我在 R 到 python 的翻译中做错了什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM