理解 R 中的 set.seed()
Understanding set.seed() in R
我正在使用 R,但在复制以下输出时遇到了一些问题:
mod1 <- glm(TVAR ~ .,data = df, family = "binomial")
y <- predict.glm(mod1)
由于它依赖于 set.seed()
。
我有一些与此相关的问题?
我知道如果我初步使用 set.seed(123)
(或任何其他种子),随机生成将始终从同一级别开始,因此我将获得可复制的结果.尽管如此,假设我想通过从一个好的结果开始然后检索种子以在下一次复制那个好的结果来对种子进行逆向工程。换句话说,假设我 运行 相同的代码 n
次,而没有预先设置种子,目的是找到最适合我的结果,然后检索使用的种子。那可能吗?这听起来有点像作弊,但事实并非如此,因为我只是想确定代码的结果取决于它的种子依赖性,假设代码背后的整体思想被感知并且只需要实现可复制状态。
仅供理解:只有当我删除环境中的所有变量时才会使用新种子?事实上,如果我 运行 多次使用相同的代码但没有清理环境,结果是相同的,因此使用了相同的种子。我希望对此有所澄清。
最后:有没有办法理解函数何时依赖于set.seed()
?例如,在 CRAN 手册上,我找不到任何说明这似乎是一个关键问题。
依次回答你的观点:
Would [reverse engineering the seed from the result of a computation] be possible?
这取决于实际使用的随机数生成器,但通常这很难,因为好的 RNG 的状态 space 很大,您可能需要彻底搜索它。这可能不仅需要几个小时,还需要 年 .
a new seed is only used when I delete all the variables in the environment?
每当您调用 set.seed
时,都会使用一个新种子。实际的当前种子值存储在全局环境中的隐藏变量.Random.seed
中。但是,删除种子不会使您的最后一次计算可重现,因为 R 会根据不确定的值(实际上是当前操作系统时间)重新初始化该种子的值。
if I run the same code more than once but without cleaning the environment, the results are the same, hence the same seed was used.
否:使用随机值(通过调用随机函数)更改 随机种子。因此,运行 在不清理环境的情况下连续进行多次计算 而不是 产生相同的结果。事实上,那将是 可怕的 。你自己可以很容易地看到这个:
〉rnorm(1)
[1] -0.3156453
〉rnorm(1)
[1] 0.7345465
…很明显,随机函数的两次连续调用(这里,rnorm
)不是产生相同的结果,即使我没有清理环境在通话之间。
is there a way to understand when a function is dependent on set.seed()
?
您可以设置不同的随机种子,重新运行该函数,然后查看输出是否发生变化。
除此之外,没有通用、直接的方法来执行此操作。如果该函数没有记录它对 set.seed
的依赖性,那么您唯一的办法就是仔细查看该函数的源代码(以及它依次调用的所有函数)。
奖金(如 Roland 在评论中指出的那样):
glm
和 predict.glm
是 not 随机函数,not 不依赖 set.seed
.
@KonradRudolph 在这里给出了很好的答案。我只想给它加一分:
设置随机种子有三种种方式,而且不尽相同:
- 使用
set.seed(n)
将其设置为易于重现的状态。
- 调用任何内部随机数生成器也会以确定性但不太可预测的方式更改它。
- 保存它并稍后恢复它会将其设置为较早的状态。
一般来说,set.seed()
只能输出随机种子可能值的一小部分,而调用 RNG 应该(最终)循环遍历所有这些值。可能有大约 2^20000
个不同的随机种子,但 set.seed()
只能创建大约 2^32
个。 (这两个数字都被高估了,但比例差不多。)
您可以保存和恢复 .Random.seed
变量,或调用 set.seed(n)
将随机种子设置为已知状态。重现特定状态的唯一可行方法是从已知状态开始并重复导致您想要的状态的调用。
我正在使用 R,但在复制以下输出时遇到了一些问题:
mod1 <- glm(TVAR ~ .,data = df, family = "binomial")
y <- predict.glm(mod1)
由于它依赖于 set.seed()
。
我有一些与此相关的问题?
我知道如果我初步使用
set.seed(123)
(或任何其他种子),随机生成将始终从同一级别开始,因此我将获得可复制的结果.尽管如此,假设我想通过从一个好的结果开始然后检索种子以在下一次复制那个好的结果来对种子进行逆向工程。换句话说,假设我 运行 相同的代码n
次,而没有预先设置种子,目的是找到最适合我的结果,然后检索使用的种子。那可能吗?这听起来有点像作弊,但事实并非如此,因为我只是想确定代码的结果取决于它的种子依赖性,假设代码背后的整体思想被感知并且只需要实现可复制状态。仅供理解:只有当我删除环境中的所有变量时才会使用新种子?事实上,如果我 运行 多次使用相同的代码但没有清理环境,结果是相同的,因此使用了相同的种子。我希望对此有所澄清。
最后:有没有办法理解函数何时依赖于
set.seed()
?例如,在 CRAN 手册上,我找不到任何说明这似乎是一个关键问题。
依次回答你的观点:
Would [reverse engineering the seed from the result of a computation] be possible?
这取决于实际使用的随机数生成器,但通常这很难,因为好的 RNG 的状态 space 很大,您可能需要彻底搜索它。这可能不仅需要几个小时,还需要 年 .
a new seed is only used when I delete all the variables in the environment?
每当您调用 set.seed
时,都会使用一个新种子。实际的当前种子值存储在全局环境中的隐藏变量.Random.seed
中。但是,删除种子不会使您的最后一次计算可重现,因为 R 会根据不确定的值(实际上是当前操作系统时间)重新初始化该种子的值。
if I run the same code more than once but without cleaning the environment, the results are the same, hence the same seed was used.
否:使用随机值(通过调用随机函数)更改 随机种子。因此,运行 在不清理环境的情况下连续进行多次计算 而不是 产生相同的结果。事实上,那将是 可怕的 。你自己可以很容易地看到这个:
〉rnorm(1)
[1] -0.3156453
〉rnorm(1)
[1] 0.7345465
…很明显,随机函数的两次连续调用(这里,rnorm
)不是产生相同的结果,即使我没有清理环境在通话之间。
is there a way to understand when a function is dependent on
set.seed()
?
您可以设置不同的随机种子,重新运行该函数,然后查看输出是否发生变化。
除此之外,没有通用、直接的方法来执行此操作。如果该函数没有记录它对 set.seed
的依赖性,那么您唯一的办法就是仔细查看该函数的源代码(以及它依次调用的所有函数)。
奖金(如 Roland 在评论中指出的那样):
glm
和 predict.glm
是 not 随机函数,not 不依赖 set.seed
.
@KonradRudolph 在这里给出了很好的答案。我只想给它加一分:
设置随机种子有三种种方式,而且不尽相同:
- 使用
set.seed(n)
将其设置为易于重现的状态。 - 调用任何内部随机数生成器也会以确定性但不太可预测的方式更改它。
- 保存它并稍后恢复它会将其设置为较早的状态。
一般来说,set.seed()
只能输出随机种子可能值的一小部分,而调用 RNG 应该(最终)循环遍历所有这些值。可能有大约 2^20000
个不同的随机种子,但 set.seed()
只能创建大约 2^32
个。 (这两个数字都被高估了,但比例差不多。)
您可以保存和恢复 .Random.seed
变量,或调用 set.seed(n)
将随机种子设置为已知状态。重现特定状态的唯一可行方法是从已知状态开始并重复导致您想要的状态的调用。