Alasan untuk menggunakan fungsi set.seed

185

Banyak kali saya melihat set.seedfungsi di R, sebelum memulai program. Saya tahu itu pada dasarnya digunakan untuk pembuatan angka acak. Apakah ada kebutuhan khusus untuk mengatur ini?

Vignesh
sumber

Jawaban:

264

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.

Dirk Eddelbuettel
sumber
5
Terima kasih Dirk, untuk contoh yang bagus .. Saya telah menjernihkannya dengan 99%, tetapi masih mempertanyakan. 1. Dalam jawaban Anda, Anda telah menggunakan set.seed dengan 42 sebagai argumen..Apakah ada alasan terkait untuk memilih nilai ini?
Vignesh
43
Untuk RNG normal dengan kualitas yang layak, nilainya tidak masalah. "42" adalah referensi ke sebuah buku terkenal; orang lain menggunakan tanggal lahir atau "123" atau hanya "1".
Dirk Eddelbuettel
7
Itu 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.
Greg Snow
8
Dimungkinkan untuk menjalankan kembali kode yang sama dengan biji yang berbeda sampai Anda mendapatkan hasil "terbaik" (Saya telah melakukan ini sebagai contoh). Untuk menghindari tuduhan melakukan ini, yang terbaik adalah memilih benih yang memiliki makna yang jelas, apakah selalu benih yang sama, atau tanggal, atau saya menggunakan char2seeddan nama belakang penyelidik utama pada suatu proyek.
Greg Snow
5
Nilai seed @DirkEddelbuettel dapat menjadi masalah karena alasan non-komputasi, seorang teman saya memiliki masalah dengan menerbitkan hasil berbasis simulasi karena kode dimulai dengan set.seed(666)dan pengulas tidak menyukai benih Iblis dalam kode ...
Tim
33

Anda harus mengatur seed setiap kali Anda ingin mendapatkan hasil acak yang dapat direproduksi.

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)
Chia-hung
sumber
17

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.

Ridingstar
sumber
7

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

  1. (Mengatur benih)
  2. Diberi nilai untuk sd, hasilkan data yang didistribusikan secara normal
  3. Mengevaluasi kemungkinan data Anda diberikan distribusi simulasi

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:

Histogram estimasi parameter tanpa memperbaiki benih Histogram estimasi parameter memperbaiki seed

Ketika kami memperbaiki seed, pencarian numerik berakhir dekat dengan nilai parameter sebenarnya dari 2 jauh lebih sering.

Matthias Schmidtblaicher
sumber
6

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.

pengguna4388407
sumber
uraikan jawabannya
Spry Techies