首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多次使用set.seed的怪异行为

多次使用set.seed的怪异行为
EN

Stack Overflow用户
提问于 2017-07-26 10:23:44
回答 2查看 2.2K关注 0票数 4

我在R做作业的时候想出了一个奇怪的结果,有人能告诉我发生了什么事吗?

指令告诉我要设置种子1以保持一致性。

一开始,我种了两次种子

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(1)
x <- rnorm(100, mean = 0, sd = 1)
set.seed(1)
epsilon <- rnorm(100, mean = 0, sd = 0.25)
y <- 0.5 * x + epsilon -1
plot(x,y,main = "Scatter plot between X and Y", xlab = "X", ylab = "Y")

我得到了这样的散点图:有两粒种子的情节

在我只使用一个set种子之后,代码是:

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(1)
x <- rnorm(100, mean = 0, sd = 1)
epsilon <- rnorm(100, mean = 0, sd = 0.25)
y <- 0.5 * x + epsilon -1
plot(x,y,main = "Scatter plot between X and Y", xlab = "X", ylab = "Y")

情节变得合理了:一粒种子的情节

有人能向我解释为什么两个结果是不同的增加一个额外的"set.seed(1)“吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-26 10:27:09

Set.seed()确定随后生成的随机数。通常,它用于创建可重复的示例,因此,如果我们运行相同的代码,则得到相同的结果。为了说明:

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(1234)
runif(3)
[1] 0.1137034 0.6222994 0.6092747

set.seed(1234)
runif(3)
[1] 0.1137034 0.6222994 0.6092747

set.seed(12345)
runif(3)
[1] 0.7209039 0.8757732 0.7609823

因此,正如您所看到的,当set.seed(x)用相同的数字两次时,从那个点开始生成相同的随机数。(用于具有相同分布的变量。关于其他问题,见下文的阐述)。所以,在第一个情节中,你得到一条直线,是因为

代码语言:javascript
代码运行次数:0
运行
复制
y <- 0.5 * x + epsilon -1

实际上成了

代码语言:javascript
代码运行次数:0
运行
复制
y <- 0.5 * x + x -1

因为你使用的是相同的随机数序列两次。那就减少到

代码语言:javascript
代码运行次数:0
运行
复制
y <- 1.5 * x -1

这是一个简单的线性方程。

因此,一般来说,您应该只在脚本开始时执行一次set.seed(x)

阐述了这样的评论:“但是我用不同的sd生成了Epsilon,为什么它仍然是相同的x,虽然情节似乎与解释一致?”

这其实是个很有趣的问题。具有分布~N(mean,sd)的随机数通常如下所示:

  1. 产生随机一致数。
  2. 对这些数字(通常是盒子-穆勒变换。 )进行转换,让我们将这些数字称为X。
  3. 通过应用转换sd * X + mean再次转换这些数字

如果您使用相同的种子运行两次,但是使用不同的平均值和sd,则前两个步骤将产生完全相同的结果,因为生成的随机数是相同的,而且还没有使用平均值和sd。只有在第三步,平均值和sd才会发挥作用。我们可以很容易地证实这一点:

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(1)
rnorm(4, mean = 0, sd = 1)
[1] -0.6264538  0.1836433 -0.8356286  1.5952808
set.seed(1)
rnorm(4, mean = 0, sd = 0.25)
[1] -0.15661345  0.04591083 -0.20890715  0.39882020

实际上,第二次产生的随机数正好是第一次产生的数的0.25倍。

所以在我上面的解释中,epsilon实际上是0.25*x,你得到的函数是y <- 0.75 * x - 1,它仍然是一个线性函数。

票数 14
EN

Stack Overflow用户

发布于 2018-11-01 12:08:24

为什么结果是不同的-当set.seed设置一次并运行两次时-

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(123)
runif(3)
[1] 0.2875775 0.7883051 0.4089769
runif(3)
[1] 0.8830174 0.9404673 0.0455565

而当再次设置set.seed时,结果是-

代码语言:javascript
代码运行次数:0
运行
复制
set.seed(123)
runif(6)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565

因此,当种子只设置一次时,程序使用下一组可用的数字来生成下一组随机数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45324208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档