首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在R到python的翻译中做错了什么?

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

Stack Overflow用户
提问于 2021-04-18 12:35:04
回答 1查看 46关注 0票数 0

我在R中有一个代码,它实现了大都会黑斯廷斯算法:

代码语言:javascript
复制
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翻译它时,结果是不同的。

代码语言:javascript
复制
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 

为什么?我在这里做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 12:55:56

首先,您希望在i=1range(1, trials)中启动python循环,因为0是从0开始的。

其次,在if np.random.uniform(1)中,您只是在生成1.0,所以这需要更改,例如,如果您只想要一个0到1之间的统一数字,则需要更改np.random.uniform(min, max, size=1)np.random.uniform(size=1)。如果不清楚,请查看文档 for np.random.uniform

更新

第三,你是在不知不觉中转换成整数,所以这也需要处理。当习惯于R时,这很容易被忘记(我只是做了自己的事情)。我在下面重构了您的代码,这个解决方案应该为您提供一个与您在R中看到的类似的结果。

这里,我将sim转换成一个float向量,并确保使用exp-functions中的浮点数减去和除以。希望这对你有用。

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67148584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档