Lý do sử dụng hàm set.seed


Câu trả lời:


264

Nhu cầu là mong muốn có thể có đối với các kết quả có thể lặp lại, ví dụ có thể đến từ việc cố gắng gỡ lỗi chương trình của bạn hoặc tất nhiên là từ việc cố gắng làm lại những gì nó làm:

Hai kết quả này chúng tôi sẽ "không bao giờ" sao chép khi tôi chỉ yêu cầu một cái gì đó "ngẫu nhiên":

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

Hai cái này, tuy nhiên, giống hệt nhau vì tôi đặt hạt giống :

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> 

Có tài liệu rộng lớn về tất cả những điều đó; Wikipedia là một khởi đầu tốt. Về bản chất, các RNG này được gọi là Trình tạo số ngẫu nhiên giả vì thực tế chúng hoàn toàn là thuật toán : được cung cấp cùng một hạt giống, bạn có được cùng một chuỗi. Và đó là một tính năng và không phải là một lỗi.


5
Cảm ơn Dirk, vì ví dụ tuyệt vời như vậy..tôi đã xóa nó với 99%, nhưng vẫn còn câu hỏi. 1. Trong câu trả lời của bạn, bạn đã sử dụng set.seed với 42 làm đối số..có lý do nào liên quan để chọn giá trị này không?
Vignesh

43
Đối với một RNG bình thường có chất lượng tốt, giá trị không thành vấn đề. "42" là một tham chiếu đến một cuốn sách nổi tiếng; những người khác sử dụng sinh nhật của họ hoặc "123" hoặc chỉ "1".
Dirk Eddelbuettel

7
Các char2seedchức năng trong gói TeachingDemos cho phép bạn thiết lập các hạt giống (hoặc chọn một hạt giống để vượt qua thành set.seed) dựa trên một chuỗi ký tự. Ví dụ, bạn có thể yêu cầu sinh viên sử dụng tên của họ làm hạt giống sau đó mỗi sinh viên có một bộ dữ liệu duy nhất nhưng người hướng dẫn cũng có thể tạo cùng một bộ dữ liệu để chấm điểm.
Greg Snow

8
Có thể chạy lại cùng một mã với các hạt khác nhau cho đến khi bạn nhận được kết quả "tốt nhất" (tôi đã làm điều này chẳng hạn). Để bảo vệ chống lại cáo buộc làm điều này, tốt nhất là chọn một hạt giống có ý nghĩa rõ ràng, luôn luôn là cùng một hạt giống, hoặc ngày, hoặc tôi sử dụng char2seedvà tên cuối cùng của điều tra viên chính trong một dự án.
Greg Snow

5
Giá trị hạt giống @DirkEddelbuettel có thể quan trọng vì những lý do không tính toán, một người bạn của tôi gặp vấn đề với việc xuất bản kết quả dựa trên mô phỏng của mình vì mã bắt đầu set.seed(666)và người đánh giá không thích hạt giống Quỷ trong mã ...
Tim

33

Bạn phải đặt hạt giống mỗi lần bạn muốn có được kết quả ngẫu nhiên có thể lặp lại.

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

17

Chỉ cần thêm một số khía cạnh bổ sung. Cần thiết lập hạt giống: Trong thế giới học thuật, nếu một người tuyên bố rằng thuật toán của anh ta đạt được, cho biết hiệu suất 98,05% trong một mô phỏng, những người khác cần có khả năng tái tạo nó.

?set.seed

Xem qua tệp trợ giúp của chức năng này, đây là một số sự thật thú vị:

(1) set.seed () trả về NULL, ẩn

(2) "Ban đầu, không có hạt giống, một cái mới được tạo từ thời điểm hiện tại và ID quy trình khi được yêu cầu. Do đó, các phiên khác nhau sẽ cho kết quả mô phỏng khác nhau, theo mặc định. Tuy nhiên, hạt giống có thể được khôi phục từ một phiên trước nếu không gian làm việc đã lưu trước đó được khôi phục. ", đây là lý do tại sao bạn muốn gọi set.seed () với cùng các giá trị số nguyên vào lần tiếp theo bạn muốn có một chuỗi ngẫu nhiên giống nhau.


7

Sửa lỗi hạt giống là điều cần thiết khi chúng ta cố gắng tối ưu hóa một hàm bao gồm các số được tạo ngẫu nhiên (ví dụ: trong ước tính dựa trên mô phỏng). Nói một cách lỏng lẻo, nếu chúng ta không sửa lỗi hạt giống, biến thể do vẽ các số ngẫu nhiên khác nhau có thể sẽ khiến thuật toán tối ưu hóa thất bại.

Giả sử, vì một số lý do, bạn muốn ước tính độ lệch chuẩn (sd) của phân phối chuẩn trung bình bằng 0 bằng mô phỏng, được đưa ra một mẫu. Điều này có thể đạt được bằng cách chạy tối ưu hóa số xung quanh các bước

  1. (Đặt hạt giống)
  2. Đưa ra một giá trị cho sd, tạo dữ liệu phân phối bình thường
  3. Đánh giá khả năng dữ liệu của bạn được cung cấp cho các bản phân phối mô phỏng

Các chức năng sau đây thực hiện việc này, một lần mà không có bước 1., một lần bao gồm nó:

# 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)))
}

Chúng ta có thể kiểm tra hiệu suất tương đối của hai hàm trong việc khám phá giá trị tham số thực bằng một nghiên cứu ngắn về Monte Carlo:

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)

Các phân phối kết quả của các ước tính tham số là:

Biểu đồ ước tính tham số mà không sửa chữa hạt giống Biểu đồ ước tính tham số cố định hạt giống

Khi chúng tôi sửa hạt giống, tìm kiếm số kết thúc gần với giá trị tham số thực của 2 thường xuyên hơn.


6

Về cơ bản, hàm set.seed () sẽ giúp sử dụng lại cùng một tập hợp các biến ngẫu nhiên mà chúng ta có thể cần trong tương lai để đánh giá lại tác vụ cụ thể một lần nữa với cùng một biến ngẫu nhiên

chúng ta chỉ cần khai báo nó trước khi sử dụng bất kỳ hàm tạo số ngẫu nhiên nào.


xây dựng câu trả lời
Spry Techies
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.