理由使用set.seed功能(Reasons for using the set.seed func

2019-06-21 07:55发布

很多时候,我已经看到了set.seed中的R功能,在启动程序之前。 我知道它基本上用于随机数生成。 有没有具体的需要设置呢?

Answer 1:

我们需要的是可重复的结果可能欲望,这可能例如来自努力,当然还是从试图重新它做什么调试你的程序:

这两个结果,我们将“从不”重现,我刚才问的东西“随机”:

R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"

这两个,然而,相同的,因为我设置种子

R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> 

还有就是所有由大量文献; 维基百科是一个良好的开端。 在本质上,这些随机数发生器被称为伪随机数发生器,因为它们实际上是完全的算法 :给予相同的种子,你会得到相同的序列。 这是一个功能 ,而不是一个错误。



Answer 2:

你必须要得到一个可重复的随机结果每次都设定种子。

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)


Answer 3:

只是增加了一些另外的方面。 需要设定种子:在学术界,如果一个人声称,他的算法实现,例如在一个模拟98.05%的表现,别人需要能够重现它。

?set.seed

通过这个功能的帮助文件去,这些都是一些有趣的事实:

(1)set.seed()返回NULL,隐形

(2)“最初,没有种子;一个新的从当前时间和当需要一个进程ID创建的。因此不同的会话会给出不同的模拟结果,在默认情况下然而,种子可以从一个被恢复。如果恢复先前保存的工作区前一交易日“,这就是为什么你会想打电话set.seed()用相同的整数值你想随机序列的同一序列的下一次。



Answer 4:

基本上set.seed()函数将有助于重复使用同一个组随机变量,我们可能需要在将来再次与相同的随机varibales再次评估特定任务的

我们只需要使用任何随机数生成函数之前声明它。



Answer 5:

固定种子,当我们试图优化涉及随机生成的数字(例如,在模拟基于估计)的功能是必不可少的。 宽泛地说,如果我们不种子,变异修复因绘制不同的随机数将可能导致算法失败。

假设,由于某种原因,你要估计通过模拟一个均值为零的正态分布的标准偏差(SD),给定的样本。 这可以通过运行围绕步骤的数值优化来实现

  1. (设定种子)
  2. 鉴于SD的值,生成正态分布的数据
  3. 评估给出的模拟分布数据的可能性

以下功能做到这一点,没有一次第1步,一旦它包括:

# without fixing the seed
simllh <- function(sd,y,Ns){
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
  set.seed(48)
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}

我们可以在发现有短蒙特卡洛研究真正的参数值检查的两个功能相对性能:

N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for(i in 1:1000){
  as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
  y <- rnorm(N,sd=sd) # generate the data
  est1[i] <- optim(1,simllh,y=y,Ns=1000,lower=0.01)$par
  est2[i] <- optim(1,simllh.fix.seed,y=y,Ns=1000,lower=0.01)$par
}
hist(est1)
hist(est2)

得到的参数估计值的分布是:

  • 参数估计值的直方图,而不固定种子
  • 参数估计值的直方图固定种子

当我们解决种子,数值搜索更经常结束了接近2真正的参数值。



文章来源: Reasons for using the set.seed function
标签: r random