簡體   English   中英

了解 R 中的 set.seed()

[英]Understanding set.seed() in R

我正在使用 R 並且在復制以下 output 時遇到了一些問題:

mod1 <- glm(TVAR ~ .,data = df, family = "binomial")
y <- predict.glm(mod1)

由於它依賴於set.seed()

我有一些與此相關的問題?

  • 我知道如果我初步使用set.seed(123) (或任何其他種子),隨機生成將始終從同一級別開始,因此我將獲得可復制的結果。 盡管如此,假設我想從一個好的結果開始對種子進行逆向工程,然后檢索種子以在下次復制該好的結果。 換句話說,假設我在沒有預先設置種子的情況下運行相同的代碼n次,目的是找到最適合我的結果,然后檢索使用的種子。 那可能嗎? 這聽起來像是一種作弊,但實際上並非如此,因為我只是試圖將代碼的結果歸結為種子依賴性,假設代碼背后的整體思想已被感知並且只需要實現一個可復制的狀態。

  • 僅出於我的理解:僅當我刪除環境中的所有變量時才使用新種子? 事實上,如果我多次運行相同的代碼但不清理環境,結果是相同的,因此使用了相同的種子。 我希望能對此有所澄清。

  • 最后:有沒有辦法理解 function 何時依賴於set.seed() 例如,在 CRAN 手冊上,我找不到任何跡象表明這似乎是一個關鍵問題。

@KonradRudolph 在這里給出了一個很好的答案。 我只想補充一點:

設置隨機種子的方式有3種,而且不一樣:

  • 使用set.seed(n)將其設置為易於重現的 state。
  • 調用任何內部隨機數生成器也會改變它,以一種確定性但不太可預測的方式。
  • 保存它並稍后恢復它會將其設置為較早的 state。

一般來說, set.seed()只能 output 隨機種子可能值的一小部分,而調用 RNG 應該(最終)循環遍歷所有這些值。 可能有大約2^20000個不同的隨機種子,但set.seed()只能創建大約2^32 (這兩個數字都被高估了,但比例差不多。)

您可以保存和恢復.Random.seed變量,或調用set.seed(n)將隨機種子設置為已知的 state。 重現特定 state 的唯一可行方法是從已知的 state 開始並重復導致您想要的調用的調用。

依次回答您的觀點:

[從計算結果對種子進行逆向工程] 可能嗎?

這取決於所使用的實際隨機數生成器,但總的來說這很難,因為好的 RNG 的 state 空間很大,您可能必須徹底搜索它。 可能這不僅需要數小時,而且需要數

僅當我刪除環境中的所有變量時才使用新種子?

每當您調用set.seed時,都會使用一個新種子。 實際的當前種子值存儲在全局環境中的隱藏變量.Random.seed中。 但是,刪除種子不會使您的最后一次計算可重現,因為 R 會根據非確定性值(實際上是當前操作系統時間)重新初始化該種子的值。

如果我多次運行相同的代碼但沒有清理環境,結果是相同的,因此使用了相同的種子。

否:使用隨機值(通過調用隨機函數)會改變隨機種子。 因此,在不清理環境的情況下連續運行多個計算不會產生相同的結果。 事實上,那將是可怕的。 您可以自己輕松地看到這一點:

〉rnorm(1)
[1] -0.3156453
〉rnorm(1)
[1] 0.7345465

......顯然,隨機 function (此處為rnorm )的兩次連續調用並沒有產生相同的結果,即使我沒有在兩次調用之間清理環境。

有沒有辦法了解 function 何時依賴於set.seed()

您可以設置不同的隨機種子,重新運行 function,然后查看 output 是否發生變化。

除此之外,沒有通用的、直接的方法可以做到這一點。 如果 function 沒有記錄它對set.seed的依賴,那么你唯一的辦法就是仔細查看 function 的源代碼(以及它依次調用的所有函數)。


獎勵(如 Roland 在評論中指出的那樣):

glmpredict.glm不是隨機函數,也不依賴set.seed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM