Jawaban:
Yang dibutuhkan adalah keinginan yang mungkin untuk hasil yang dapat direproduksi, yang mungkin misalnya berasal dari mencoba debug program Anda, atau tentu saja dari mencoba untuk mengulang apa yang dilakukannya:
Dua hasil ini kami akan "tidak pernah" mereproduksi karena saya hanya meminta sesuatu yang "acak":
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
Namun, keduanya identik karena saya menetapkan benih :
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>
Ada banyak literatur tentang semua itu; Wikipedia adalah awal yang baik. Intinya, RNG ini disebut Pseudo Random Number Generator karena sebenarnya sepenuhnya algoritmik : karena diberi seed yang sama, Anda mendapatkan urutan yang sama. Dan itu adalah fitur dan bukan bug.
char2seed
fungsi dalam paket TeachingDemos memungkinkan Anda untuk mengatur benih (atau memilih benih untuk masuk ke set.seed
) berdasarkan string karakter. Misalnya Anda dapat meminta siswa menggunakan nama mereka sebagai seed maka setiap siswa memiliki dataset unik tetapi instruktur juga dapat membuat dataset yang sama untuk penilaian.
char2seed
dan nama belakang penyelidik utama pada suatu proyek.
set.seed(666)
dan pengulas tidak menyukai benih Iblis dalam kode ...
Hanya menambahkan beberapa aspek tambahan. Kebutuhan untuk mengatur benih: Dalam dunia akademik, jika seseorang mengklaim bahwa algoritmenya mencapai, katakanlah kinerja 98,05% dalam satu simulasi, yang lain harus dapat mereproduksi itu.
?set.seed
Melalui file bantuan fungsi ini, ini adalah beberapa fakta menarik:
(1) set.seed () mengembalikan NULL, tidak terlihat
(2) "Awalnya, tidak ada benih; yang baru dibuat dari waktu saat ini dan ID proses ketika diperlukan. Oleh karena itu sesi yang berbeda akan memberikan hasil simulasi yang berbeda, secara default. Namun, benih mungkin dipulihkan dari sesi sebelumnya jika ruang kerja yang disimpan sebelumnya dipulihkan. ", inilah mengapa Anda ingin memanggil set.seed () dengan nilai integer yang sama saat berikutnya Anda menginginkan urutan urutan acak yang sama.
Memperbaiki seed sangat penting ketika kami mencoba untuk mengoptimalkan fungsi yang melibatkan angka yang dihasilkan secara acak (misalnya dalam estimasi berbasis simulasi). Secara longgar, jika kita tidak memperbaiki seed, variasi karena menggambar angka acak yang berbeda kemungkinan akan menyebabkan algoritma optimasi gagal.
Misalkan, untuk beberapa alasan, Anda ingin memperkirakan standar deviasi (sd) dari distribusi normal rata-rata dengan simulasi, diberikan sampel. Ini dapat dicapai dengan menjalankan optimasi numerik di sekitar langkah-langkah
Fungsi-fungsi berikut melakukan ini, sekali tanpa langkah 1., sekali termasuk itu:
# 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)))
}
Kami dapat memeriksa kinerja relatif kedua fungsi dalam menemukan nilai parameter sebenarnya dengan studi singkat 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)
Distribusi estimasi parameter yang dihasilkan adalah:
Ketika kami memperbaiki seed, pencarian numerik berakhir dekat dengan nilai parameter sebenarnya dari 2 jauh lebih sering.
pada dasarnya fungsi set.seed () akan membantu menggunakan kembali set variabel acak yang sama, yang mungkin kita perlukan di masa depan untuk mengevaluasi kembali tugas tertentu lagi dengan varibales acak yang sama
kita hanya perlu mendeklarasikannya sebelum menggunakan fungsi penghasil angka acak.