Set.seed işlevini kullanmanın nedenleri


Yanıtlar:


264

İhtiyaç, örneğin programınızda hata ayıklamaya çalışmaktan veya elbette yaptığı şeyi yeniden yapmaya çalışmaktan kaynaklanabilecek tekrarlanabilir sonuçlara yönelik olası arzudur:

Bu iki sonuç "rastgele" bir şey istediğim gibi "asla" yeniden üretmeyeceğiz:

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

Bununla birlikte, bu ikisi aynıdır çünkü tohumu ayarladım :

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> 

Bütün bunlarla ilgili geniş literatür var; Wikipedia iyi bir başlangıç. Aslında, bu RNG'lere Pseudo Random Number Generators denir, çünkü aslında tamamen algoritmiktir : aynı tohum verildiğinde aynı diziyi alırsınız. Ve bu bir özellik , bir hata değil.


5
Teşekkürler Dirk, böyle güzel bir örnek için ...% 99 ile temizledim, ama yine de soru. 1. Cevabınızda set.seed'i 42 olarak argüman olarak kullandınız .. bu değeri seçmenin herhangi bir ilgili nedeni var mı?
Vignesh

43
İyi kalitede normal bir RNG için değer önemli değildir. "42" ünlü bir kitaba gönderme; diğer insanlar doğum günlerini veya "123" veya sadece "1" kullanırlar.
Dirk Eddelbuettel

7
char2seedTeachingDemos paketinde fonksiyonu tohum ayarlamak (veya içine geçmesine bir tohum seçmenize olanak verir set.seedbir karakter dizisine dayanan). Örneğin, öğrencilerin tohum olarak adlarını kullanmasını sağlayabilirsiniz, o zaman her öğrencinin benzersiz bir veri kümesi vardır, ancak eğitmen ayrıca notlandırma için aynı veri kümelerini oluşturabilir.
Greg Snow

8
"En iyi" sonucu elde edene kadar aynı kodu farklı tohumlarla tekrar çalıştırmak mümkündür (bunu örnekler için yaptım). Bunu yapmakla suçlamalara karşı korunmak için, her zaman aynı tohum ya da tarih gibi açık bir anlamı olan bir tohum seçmek ya da char2seedbir projede prensip araştırmacısının soyadını seçmek en iyisidir .
Greg Snow

5
@DirkEddelbuettel tohum değeri hesaplama dışı nedenlerden dolayı önemli olabilir , bir arkadaşım simülasyon tabanlı sonuçlarını yayınlamakta sorun yaşadı çünkü kod başladı set.seed(666)ve yorumcular koddaki Devils tohumunu beğenmedi ...
Tim

33

Tekrarlanabilir bir rastgele sonuç elde etmek istediğinizde tohum ayarlamanız gerekir.

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

17

Sadece bazı ekleme özellikleri ekleyerek. Tohum yerleştirme ihtiyacı: Akademik dünyada, eğer algoritmasının bir simülasyonda% 98.05 performans elde ettiğini iddia ederse, diğerlerinin onu yeniden üretebilmesi gerekir.

?set.seed

Bu işlevin yardım dosyasını inceleyerek, bunlar bazı ilginç gerçekler:

(1) set.seed () görünmez NULL döndürür

(2) "Başlangıçta tohum yoktur; geçerli saatten ve gerektiğinde işlem kimliğinden yeni bir tane oluşturulur. Bu nedenle farklı oturumlar varsayılan olarak farklı simülasyon sonuçları verir. Ancak, tohum bir Daha önce kaydedilmiş bir çalışma alanı geri yüklendiyse önceki oturum. "


7

Rastgele üretilen sayıları içeren bir işlevi optimize etmeye çalıştığımızda tohumun sabitlenmesi çok önemlidir (örn. Simülasyon tabanlı tahminlerde). Gevşek olarak, eğer tohumu tamir etmezsek, farklı rasgele sayılar çizmekten kaynaklanan varyasyon muhtemelen optimizasyon algoritmasının başarısız olmasına neden olacaktır.

Herhangi bir nedenle, bir örnek verildiğinde, simülasyonla ortalama sıfır normal dağılımının standart sapmasını (sd) tahmin etmek istediğinizi varsayalım. Bu, adımlar etrafında sayısal bir optimizasyon gerçekleştirerek elde edilebilir

  1. (Tohumun ayarlanması)
  2. Sd için bir değer verildiğinde, normal olarak dağıtılmış veriler oluşturun
  3. Simüle edilen dağılımlar göz önüne alındığında verilerinizin olasılığını değerlendirin

Aşağıdaki işlevler bunu adım 1 olmadan bir kez dahil eder.

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

Kısa bir Monte Carlo çalışması ile iki parametrenin gerçek parametre değerini keşfetmedeki göreceli performansını kontrol edebiliriz:

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)

Parametre tahminlerinin sonuçtaki dağılımları:

Tohumu sabitlemeden parametre tahminlerinin histogramı Tohumu sabitleyen parametre tahminlerinin histogramı

Çekirdeği sabitlediğimizde, sayısal arama 2'nin gerçek parametre değerine çok daha yakın olur.


6

temel olarak set.seed () işlevi, gelecekte belirli görevleri aynı rastgele değişkenlerle tekrar değerlendirmek için ihtiyaç duyabileceğimiz aynı rastgele değişken kümesinin yeniden kullanılmasına yardımcı olacaktır.

herhangi bir rasgele sayı üreten fonksiyonu kullanmadan önce bildirmemiz gerekiyor.


cevabı detaylandı
Spry Techies
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.