मेरा प्रश्न आर के अंतर्निहित घातीय यादृच्छिक संख्या जनरेटर, फ़ंक्शन से प्रेरित है rexp()
। जब तेजी से वितरित यादृच्छिक संख्याओं को उत्पन्न करने की कोशिश की जा रही है, तो कई पाठ्यपुस्तक इस विकिपीडिया पृष्ठ में उल्लिखित व्युत्क्रम परिवर्तन विधि की सिफारिश करती हैं । मुझे पता है कि इस कार्य को पूरा करने के लिए अन्य तरीके हैं। विशेष रूप से, आर के स्रोत कोड एक पेपर में उल्लिखित एल्गोरिथ्म का उपयोग करता है, जो अहरेंस एंड डाइटर (1972) द्वारा उल्लिखित है ।
मैंने खुद को आश्वस्त किया है कि एहरेंस-डाइटर (एडी) विधि सही है। फिर भी, मुझे उलटा परिवर्तन (आईटी) विधि की तुलना में उनकी विधि का उपयोग करने का लाभ नहीं दिखता है। IT की तुलना में AD केवल लागू करने के लिए अधिक जटिल नहीं है। कोई गति लाभ भी प्रतीत नहीं होता है। परिणामों के बाद दोनों तरीकों को बेंचमार्क करने के लिए मेरा आर कोड है।
invTrans <- function(n)
-log(runif(n))
print("For the inverse transform:")
print(system.time(invTrans(1e8)))
print("For the Ahrens-Dieter algorithm:")
print(system.time(rexp(1e8)))
परिणाम:
[1] "For the inverse transform:"
user system elapsed
4.227 0.266 4.597
[1] "For the Ahrens-Dieter algorithm:"
user system elapsed
4.919 0.265 5.213
दो विधियों के लिए कोड की तुलना में, AD एक घातीय यादृच्छिक संख्या प्राप्त करने के लिए कम से कम दो समान यादृच्छिक संख्या ( C फ़ंक्शन के साथunif_rand()
) खींचता है । आईटी को केवल एक समान यादृच्छिक संख्या की आवश्यकता है। संभवतः आर कोर टीम ने आईटी को लागू करने के खिलाफ फैसला किया क्योंकि यह मान लिया था कि लॉगरिथम लेने से अधिक समान यादृच्छिक संख्या उत्पन्न करने की तुलना में धीमी हो सकती है। मैं समझता हूं कि लॉगरिथम लेने की गति मशीन पर निर्भर हो सकती है, लेकिन कम से कम मेरे लिए इसके विपरीत सच है। शायद आईटी के संख्यात्मक मुद्दों के चारों ओर 0 पर लघुगणक की विलक्षणता के साथ कुछ मुद्दे हैं? लेकिन फिर, आर
स्रोत कोड sexp.cप्रकट करता है कि AD का कार्यान्वयन कुछ संख्यात्मक परिशुद्धता भी खो देता है क्योंकि C कोड का निम्नलिखित भाग समान यादृच्छिक रैंडम यू से अग्रणी बिट्स को हटा देता है ।
double u = unif_rand();
while(u <= 0. || u >= 1.) u = unif_rand();
for (;;) {
u += u;
if (u > 1.)
break;
a += q[0];
}
u -= 1.;
u को बाद में sexp.c के शेष भाग में एक समान यादृच्छिक संख्या के रूप में पुनर्नवीनीकरण किया गया । अब तक, ऐसा प्रतीत होता है जैसे
- आईटी कोड के लिए आसान है,
- आईटी तेज है, और
- आईटी और AD दोनों संभवतः संख्यात्मक सटीकता खो देते हैं।
मैं वास्तव में सराहना करूंगा कि अगर कोई यह समझा सके कि आर अभी भी एडी को केवल उपलब्ध विकल्प के रूप में क्यों लागू करता है rexp()
।
rexp(n)
अड़चन होगी, गति में अंतर परिवर्तन के लिए एक मजबूत तर्क नहीं है (कम से कम मेरे लिए)। मैं संख्यात्मक सटीकता के बारे में अधिक चिंतित हो सकता हूं, हालांकि यह मेरे लिए स्पष्ट नहीं है कि कौन सा अधिक संख्यात्मक रूप से विश्वसनीय होगा।