Yanıtlar:
İ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.
char2seed
TeachingDemos paketinde fonksiyonu tohum ayarlamak (veya içine geçmesine bir tohum seçmenize olanak verir set.seed
bir 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.
char2seed
bir projede prensip araştırmacısının soyadını seçmek en iyisidir .
set.seed(666)
ve yorumcular koddaki Devils tohumunu beğenmedi ...
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. "
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
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ı:
Çekirdeği sabitlediğimizde, sayısal arama 2'nin gerçek parametre değerine çok daha yakın olur.
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.