Câu trả lời:
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.
char2seed
chứ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.
char2seed
và tên cuối cùng của điều tra viên chính trong một dự án.
set.seed(666)
và người đánh giá không thích hạt giống Quỷ trong mã ...
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.
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
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à:
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.
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.