R 使用set.seed函数的原因

R 使用set.seed函数的原因,r,random,R,Random,在启动程序之前,我多次看到R中的set.seed函数。我知道它基本上是用来生成随机数的。是否有任何特定需要设置此设置 需要的是对可再现结果的可能期望,例如,可能来自调试程序,当然也可能来自尝试重做程序: 这两个结果我们将“永远”复制,因为我只是要求一些“随机的”: 但是,这两个是相同的,因为我设定了种子: 关于这一切有大量的文献;维基百科是一个良好的开端。本质上,这些RNG被称为伪随机数生成器,因为它们实际上是完全算法的:给定相同的种子,得到相同的序列。这是一个特性,而不是一个bug。每当你想要

在启动程序之前,我多次看到R中的
set.seed
函数。我知道它基本上是用来生成随机数的。是否有任何特定需要设置此设置

需要的是对可再现结果的可能期望,例如,可能来自调试程序,当然也可能来自尝试重做程序:

这两个结果我们将“永远”复制,因为我只是要求一些“随机的”:

但是,这两个是相同的,因为我设定了种子:


关于这一切有大量的文献;维基百科是一个良好的开端。本质上,这些RNG被称为伪随机数生成器,因为它们实际上是完全算法的:给定相同的种子,得到相同的序列。这是一个特性,而不是一个bug。

每当你想要得到一个可重复的随机结果时,你必须设置种子

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

只是添加了一些附加方面。 设定种子的需要:在学术界,如果一个人声称他的算法在一次模拟中达到了98.05%的性能,那么其他人需要能够复制它

?set.seed
浏览此函数的帮助文件,以下是一些有趣的事实:

(1) seed()返回NULL,不可见

(2) “最初,没有种子;当需要种子时,将根据当前时间和进程ID创建一个新的种子。因此,默认情况下,不同的会话将给出不同的模拟结果。但是,如果还原以前保存的工作区,则可能会从上一个会话还原种子。”,这就是您希望调用set.seed()的原因下次使用相同的整数值时,需要相同的随机序列序列

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


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

当我们试图优化涉及随机生成数字的函数时(例如,在基于模拟的估计中),固定种子是至关重要的。粗略地说,如果我们不固定种子,由于绘制不同的随机数而产生的变化可能会导致优化算法失败

假设,出于某种原因,您希望通过模拟来估计给定样本的平均零正态分布的标准偏差(sd)。这可以通过围绕步骤运行数值优化来实现

  • (播种)
  • 给定sd值,生成正态分布数据
  • 评估给定模拟分布的数据的可能性
  • 以下功能完成此操作,一次不包括步骤1,一次包括步骤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)))
    }
    
    #不固定种子
    
    simllh
    set.seed
    是一个基本函数,它能够(每次需要时)与其他函数一起生成相同的随机值(
    rnorm
    runif
    sample

    下面是一个未设置种子的示例

    > set.seed(NULL)
    > rnorm(5)
    [1]  1.5982677 -2.2572974  2.3057461  0.5935456  0.1143519
    > rnorm(5)
    [1]  0.15135371  0.20266228  0.95084266  0.09319339 -1.11049182
    > set.seed(NULL)
    > runif(5)
    [1] 0.05697712 0.31892399 0.92547023 0.88360393 0.90015169
    > runif(5)
    [1] 0.09374559 0.64406494 0.65817582 0.30179009 0.19760375
    > set.seed(NULL)
    > sample(5)
    [1] 5 4 3 1 2
    > sample(5)
    [1] 2 1 5 4 3
    
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1
    
    下面是一个带有set.seed的示例

    > set.seed(NULL)
    > rnorm(5)
    [1]  1.5982677 -2.2572974  2.3057461  0.5935456  0.1143519
    > rnorm(5)
    [1]  0.15135371  0.20266228  0.95084266  0.09319339 -1.11049182
    > set.seed(NULL)
    > runif(5)
    [1] 0.05697712 0.31892399 0.92547023 0.88360393 0.90015169
    > runif(5)
    [1] 0.09374559 0.64406494 0.65817582 0.30179009 0.19760375
    > set.seed(NULL)
    > sample(5)
    [1] 5 4 3 1 2
    > sample(5)
    [1] 2 1 5 4 3
    
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1
    

    这将回答它:谢谢德克,为这么好的例子…我已经清除了99%,但仍然是一个问题。1.在您的回答中,您使用了set.seed和42作为参数。选择此值有任何相关原因吗?对于质量良好的正常RNG,该值无关紧要。“42”指的是一本名著;其他人使用他们的生日或“123”或“1”。TeachingDemos软件包中的
    char2seed
    功能允许您基于字符串设置种子(或选择要传递到
    set.seed
    )中的种子。例如,您可以让学生使用他们的名字作为种子,然后每个学生都有一个唯一的数据集,但讲师也可以创建相同的数据集进行评分。可以使用不同的种子重新运行相同的代码,直到获得“最佳”结果(我已经这样做了示例)。为了防止有人指责我这样做,最好选择一个具有明显意义的种子,要么总是同一个种子,要么是日期,要么我使用
    char2seed
    和项目主要调查员的姓氏。@DirkEddelbuettel种子值可能因非计算原因而重要,我的一个朋友在发布基于模拟的结果时遇到了问题,因为代码是从
    set.seed(666)
    开始的,而审阅者不喜欢代码中的魔鬼种子。。。
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > rnorm(5)
    [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > runif(5)
    [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1
    > set.seed(123)
    > sample(5)
    [1] 3 2 5 4 1