我需要在python
中交叉验证R
代码。我的代码包含许多伪随机数生成,因此,为了便于比较,我决定使用rpy2
从R
生成python
代码中的这些值。
例如,在R中,我有:
set.seed(1234)
runif(4)
[1] 0.1137034 0.6222994 0.6092747 0.6233794
在python中,使用rpy2
,我有:
import rpy2.robjects as robjects
set_seed = robjects.r("set.seed")
runif = robjects.r("runif")
set_seed(1234)
print(runif(4))
[1] 0.1137034 0.6222994 0.6092747 0.6233794
如预期的(值相似)。然而,我面对R
sample
函数(相当于numpy.random.choice
函数)的奇怪行为。作为最简单的可复制示例,我在R
中有:
set.seed(1234)
sample(5)
[1] 1 3 2 4 5
而在python
我有:
sample = robjects.r("sample")
set_seed(1234)
print(sample(5))
[1] 4 5 2 3 1
结果是不同的。有没有人可以解释为什么会发生这种情况和/或提供一种方法来获得类似的值在R和python使用R sample
函数?
如果在两种情况下打印R函数RNGkind()
的值,我怀疑您不会得到相同的答案。Python结果看起来像默认输出,而你的R结果看起来像旧的有bug的输出。
例如,在R中:
set.seed(1234, sample.kind = "Rejection")
sample(5)
#> [1] 4 5 2 3 1
set.seed(1234, sample.kind = "Rounding")
#> Warning in set.seed(1234, sample.kind = "Rounding"): non-uniform 'Rounding'
#> sampler used
sample(5)
#> [1] 1 3 2 4 5
set.seed(1234, sample.kind = "default")
sample(5)
#> [1] 4 5 2 3 1
由reprex包(v0.3.0)在2021-01-15创建
所以在我看来,你好像还在使用旧的"四舍五入"方法在你的R会话。您可能很久以前保存了一个工作空间,然后重新加载了它。不要这样做,每次会议都要有一个干净的工作空间。
也许给这个机会(stackoverflow的答案从这里)。引用答案:p参数对应于sample()函数中的prob参数">
import numpy as np
np.random.choice(a, size=None, replace=True, p=None)