सेट.सेड फ़ंक्शन का उपयोग करने के कारण


184

set.seedकार्यक्रम शुरू करने से पहले कई बार मैंने आर में फ़ंक्शन देखा है । मुझे पता है कि यह मूल रूप से यादृच्छिक संख्या पीढ़ी के लिए उपयोग किया जाता है। क्या इसे सेट करने के लिए कोई विशेष आवश्यकता है?


2
यह इसका जवाब देगा: stattrek.com/statistics/random-number-generator.aspx
duffymo

जवाबों:


264

आवश्यकता प्रजनन योग्य परिणामों की संभावित इच्छा है, जो उदाहरण के लिए आपके कार्यक्रम को डिबग करने की कोशिश से आ सकती है, या निश्चित रूप से यह करने की कोशिश करने से फिर से करता है:

ये दो परिणाम हम "कभी नहीं" दोहराएंगे क्योंकि मैंने अभी कुछ "यादृच्छिक" के लिए कहा था:

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

हालांकि, ये दोनों समान हैं क्योंकि मैं बीज सेट करता हूं :

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> 

उस सब पर बहुत बड़ा साहित्य है; विकिपीडिया एक अच्छी शुरुआत है। संक्षेप में, इन RNG को छद्म रैंडम नंबर जेनरेटर कहा जाता है क्योंकि वे वास्तव में पूरी तरह से एल्गोरिथम हैं : एक ही बीज को देखते हुए, आपको एक ही क्रम मिलता है। और वह एक विशेषता है और बग नहीं है।


5
धन्यवाद डर्क, ऐसे अच्छे उदाहरण के लिए..मैंने इसे 99% के साथ मंजूरी दे दी है, लेकिन अभी भी सवाल है। 1. आपके उत्तर में आपने 42. तर्क के साथ सेट का उपयोग किया है..इस मूल्य को चुनने का कोई संबंधित कारण है?
विग्नेश

43
सभ्य गुणवत्ता के एक सामान्य आरएनजी के लिए, मूल्य मायने नहीं रखता है। "42" एक प्रसिद्ध पुस्तक का संदर्भ है; अन्य लोग अपने जन्मदिन या "123" या सिर्फ "1" का उपयोग करते हैं।
डिर्क एडडेलबेटेल

7
char2seedTeachingDemos पैकेज में समारोह आप बीज सेट (या में पारित करने के लिए एक बीज का चयन करने के लिए अनुमति देता है set.seedएक चरित्र स्ट्रिंग के आधार पर)। उदाहरण के लिए, आप छात्रों को बीज के रूप में उनके नाम का उपयोग कर सकते हैं तब प्रत्येक छात्र के पास एक अद्वितीय डेटासेट होता है, लेकिन प्रशिक्षक ग्रेडिंग के लिए समान डेटासेट भी बना सकता है।
ग्रेग हिमपात

8
जब तक आपको "सर्वश्रेष्ठ" परिणाम नहीं मिलता है तब तक अलग-अलग बीजों के साथ एक ही कोड को फिर से जोड़ना संभव है (मैंने उदाहरण के लिए ऐसा किया है)। ऐसा करने के आरोपों से बचाव के लिए, एक ऐसे बीज का चयन करना सबसे अच्छा है जिसका कुछ स्पष्ट अर्थ हो, या तो हमेशा एक ही बीज, या तिथि, या मैं उपयोग करता हूं char2seedऔर एक परियोजना पर सिद्धांत अन्वेषक का अंतिम नाम।
ग्रेग स्नो

5
@DirkEddelbuettel बीज मूल्य गैर-कम्प्यूटेशनल कारणों के लिए मायने रख सकता है, मेरे एक दोस्त को अपने सिमुलेशन-आधारित परिणाम प्रकाशित करने में समस्या थी क्योंकि कोड के साथ शुरू हुआ था set.seed(666)और समीक्षकों को कोड में डेविल्स बीज पसंद नहीं आया ...
टिम

33

आपको हर बार जब आप एक प्रतिलिपि प्रस्तुत करने योग्य यादृच्छिक परिणाम प्राप्त करना चाहते हैं तो बीज सेट करना होगा।

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

17

बस कुछ अतिरिक्त पहलुओं को जोड़ना। बीज स्थापित करने की आवश्यकता: अकादमिक दुनिया में, अगर कोई दावा करता है कि उसका एल्गोरिथ्म हासिल करता है, तो एक सिमुलेशन में 98.05% प्रदर्शन का कहना है, दूसरों को इसे पुन: पेश करने में सक्षम होने की आवश्यकता है।

?set.seed

इस फ़ंक्शन की मदद फ़ाइल के माध्यम से जा रहे हैं, ये कुछ दिलचस्प तथ्य हैं:

(1) set.seed () रिटर्न NULL, अदृश्य

(2) "प्रारंभ में, कोई बीज नहीं है; एक नया वर्तमान समय और प्रक्रिया आईडी से बनाया जाता है जब एक की आवश्यकता होती है। इसलिए अलग-अलग सत्र अलग-अलग सिमुलेशन परिणाम देंगे, डिफ़ॉल्ट रूप से। हालांकि, बीज को बहाल किया जा सकता है। पिछले सत्र यदि पहले से सहेजे गए कार्यक्षेत्र को पुनर्स्थापित किया जाता है। ", यही कारण है कि जब आप अगली बार यादृच्छिक क्रम का एक ही क्रम चाहते हैं, तो आप पूर्णांक मानों के साथ set.seed () कॉल करना चाहेंगे।


7

बीज को ठीक करना तब आवश्यक होता है जब हम एक ऐसे फ़ंक्शन को अनुकूलित करने का प्रयास करते हैं जिसमें यादृच्छिक रूप से उत्पन्न संख्याएं होती हैं (जैसे सिमुलेशन आधारित अनुमान में)। धीरे-धीरे बोलना, अगर हम बीज को ठीक नहीं करते हैं, तो अलग-अलग यादृच्छिक संख्याओं को खींचने के कारण भिन्नता अनुकूलन एल्गोरिथ्म को विफल करने की संभावना होगी।

मान लीजिए कि, किसी कारण से, आप नमूना द्वारा दिए गए माध्य-शून्य सामान्य वितरण के मानक विचलन (एसडी) का अनुमान लगाना चाहते हैं। यह चरणों के आसपास संख्यात्मक अनुकूलन चलाकर प्राप्त किया जा सकता है

  1. (बीज की स्थापना)
  2. एसडी के लिए एक मूल्य दिया, सामान्य रूप से वितरित डेटा उत्पन्न
  3. नकली वितरण को देखते हुए आपके डेटा की संभावना का मूल्यांकन करें

निम्नलिखित कार्य यह करते हैं, एक बार चरण 1 के बिना, एक बार इसे सहित:

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

हम एक छोटा मोंटे कार्लो अध्ययन के साथ वास्तविक पैरामीटर मान की खोज में दो कार्यों के सापेक्ष प्रदर्शन की जांच कर सकते हैं:

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)

पैरामीटर अनुमानों के परिणामस्वरूप वितरण हैं:

बीज को ठीक किए बिना पैरामीटर के अनुमान का हिस्टोग्राम बीज को ठीक करने वाले पैरामीटर अनुमानों का हिस्टोग्राम

जब हम बीज को ठीक करते हैं, तो संख्यात्मक खोज 2 गुना अधिक के वास्तविक पैरामीटर मान के करीब समाप्त होती है।


6

मूल रूप से set.seed () फ़ंक्शन यादृच्छिक चर के उसी सेट का पुन: उपयोग करने में मदद करेगा, जिसे हमें भविष्य में उसी यादृच्छिक चर के साथ फिर से विशेष कार्य का मूल्यांकन करने की आवश्यकता हो सकती है

हमें बस किसी भी यादृच्छिक संख्या उत्पन्न करने वाले फ़ंक्शन का उपयोग करने से पहले इसे घोषित करने की आवश्यकता है।


जवाब विस्तृत करें
Spry Techies
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.