सामान्य वितरण के अनुकरण के लिए उलटा CDF पद्धति पर बॉक्स-मुलर के लाभ?


15

समान चर के एक सेट से एक सामान्य वितरण का अनुकरण करने के लिए, कई तकनीकें हैं:

  1. बॉक्स-मुलर एल्गोरिथ्म , जिसमें एक पर दो स्वतंत्र वर्दी के नमूने हैं (0,1)और उन्हें दो स्वतंत्र मानक सामान्य वितरण में बदल देता है:

    Z0=2lnU1cos(2πU0)Z1=2lnU1sin(2πU0)
  2. CDF विधि , जहाँ कोई सामान्य cdf (F(Z)) को समान रूप से भिन्न कर सकता है:

    F(Z)=U
    और व्युत्पन्न
    Z=F1(U)

मेरा सवाल है: जो कम्प्यूटेशनल रूप से अधिक कुशल है? मुझे लगता है कि इसका उत्तरार्द्ध तरीका होगा - लेकिन मैंने जो भी पेपर पढ़े उनमें से अधिकांश बॉक्स-मुलर का उपयोग करते हैं - क्यों?

अतिरिक्त जानकारी:

सामान्य CDF का व्युत्क्रम पता है और इसके द्वारा दिया गया है:

F1(Z)=2erf1(2Z1),Z(0,1).

इसलिए:

Z=F1(U)=2erf1(2U1),U(0,1).

1
सामान्य cdf का विलोम क्या है? यह विश्लेषणात्मक रूप से गणना नहीं की जा सकती है, केवल अगर मूल सीडीएफ को टुकड़े-टुकड़े रैखिक फ़ंक्शन के साथ अनुमानित किया गया है।
आर्टेम सोबोलेव

क्या दोनों निकटता से संबंधित नहीं हैं? बॉक्स मुलर, मेरा मानना ​​है कि, 2-वेरिएंट जनरेशन के लिए एक विशेष मामला है।
ttnphns

हाय बर्माले, मैंने ऊपर कुछ और जानकारी जोड़ी है। व्युत्क्रम CDF की एक अभिव्यक्ति है - हालाँकि गणना कम्प्यूटेशनल रूप से की जानी चाहिए - ताकि बॉक्स मुलर को प्राथमिकता दी जा सके? मुझे लगता है कि erf 1 की गणना लुकअप टेबलों में की जाएगी, बहुत कुछ पाप और कोसिन के मूल्यों की तरह है ? इसलिए इतना अधिक कम्प्यूटेशनल रूप से महंगा नहीं है? मैं हालांकि गलत हो सकता हूं। erf1erf1sincosine
user2350366

2
पाप और कोसाइन के बिना बॉक्स-मुलर के संस्करण हैं।
शीआन

2
@ डिलिप बहुत ही कम सटीक अनुप्रयोगों के लिए, जैसे कि कंप्यूटर ग्राफिक्स, साइन और कोसाइन को वास्तव में उपयुक्त लुकअप तालिकाओं के उपयोग द्वारा अनुकूलित किया जा सकता है। सांख्यिकीय अनुप्रयोगों के लिए, हालांकि, इस तरह के अनुकूलन का उपयोग कभी नहीं किया जाता है। अंत में यह वास्तव में किसी भी कठिन गणना करने के लिए नहीं है से लॉग या sqrt , लेकिन आधुनिक कंप्यूटिंग प्रणालियों पर प्राथमिक कार्यों से संबंधित विस्तार ट्रिग कार्यों --including - अनुकूलित हो जाते हैं ( क्योंकि और लॉग इंटेल पर बुनियादी निर्देश रास्ता वापस थे 8087 चिप!), जबकि erf या तो अनुपलब्ध है या उच्च (= धीमी) स्तर पर कोडित किया गया है। erf1logsqrtexpcoslog
व्हीबर

जवाबों:


16

विशुद्ध रूप से संभाव्य दृष्टिकोण से, दोनों दृष्टिकोण सही हैं और इसलिए समतुल्य हैं। एक एल्गोरिथम दृष्टिकोण से, तुलना को सटीक और कंप्यूटिंग लागत दोनों पर विचार करना चाहिए।

बॉक्स-मुलर एक समान जनरेटर पर निर्भर करता है और इस वर्दी जनरेटर के समान ही खर्च होता है। जैसा कि मेरी टिप्पणी में उल्लेख किया गया है, आप साइन या कोसाइन कॉल के बिना दूर हो सकते हैं, यदि लघुगणक के बिना नहीं:

  • उत्पन्न तक एस = यू 2 1 + यू 2 21
    U1,U2iidU(1,1)
    S=U12+U221
  • ले और परिभाषितएक्स1=जेडयू1Z=2log(S)/S
    X1=ZU1, X2=ZU2

जेनेरिक इनवर्जन एल्गोरिथ्म को qnorm(runif(N))आर में उलटे सामान्य सीएफडी के लिए कॉल की आवश्यकता होती है, उदाहरण के लिए आर में, जो ऊपर की तुलना में अधिक महंगा हो सकता है और अधिक महत्वपूर्ण रूप से सटीक के संदर्भ में पूंछ में विफल हो सकता है, जब तक कि क्वांटाइल फ़ंक्शन अच्छी तरह से कोडित नहीं होता है।

द्वारा की गई टिप्पणियों पर अनुसरण करने के लिए व्हुबेर , इसकी तुलना rnorm(N)और qnorm(runif(N))उलटा सीएफडी के लाभ के लिए, निष्पादन समय में दोनों:

> system.time(qnorm(runif(10^8)))
sutilisateur     système      écoulé
 10.137           0.120      10.251 
> system.time(rnorm(10^8))
utilisateur     système      écoulé
 13.417           0.060      13.472` `

और पूंछ में फिट के संदर्भ में: enter image description here

अपने ब्लॉग पर रेडफोर्ड नील की एक टिप्पणी के बाद , मैं यह बताना चाहता हूं कि rnormआर में डिफ़ॉल्ट व्युत्क्रम विधि का उपयोग करता है, इसलिए कि उपरोक्त तुलना इंटरफ़ेस पर प्रतिबिंबित हो रही है न कि सिमुलेशन विधि पर! RNG पर R प्रलेखन उद्धृत करने के लिए:

‘normal.kind’ can be ‘"Kinderman-Ramage"’, ‘"Buggy
 Kinderman-Ramage"’ (not for ‘set.seed’), ‘"Ahrens-Dieter"’,
 ‘"Box-Muller"’, ‘"Inversion"’ (the default), or ‘"user-supplied"’.
 (For inversion, see the reference in ‘qnorm’.)  The
 Kinderman-Ramage generator used in versions prior to 1.7.1 (now
 called ‘"Buggy"’) had several approximation errors and should only
 be used for reproduction of old results.  The ‘"Box-Muller"’
 generator is stateful as pairs of normals are generated and
 returned sequentially.  The state is reset whenever it is selected
 (even if it is the current normal generator) and when ‘kind’ is
 changed.

3
लॉगΦ-1Φ-1एक्स1X2Ui1101

2
R 3.0.2rowSumsएसqnorm(runif(N))InverseCDF[NormalDistribution[], #] &

1
मैं मानता हूँ, qnorm(runif(N))से भी 20% तेजी से होता हैrnorm(N)
शीआन

3
Φ1sincos

1
तुलना के लिए, निम्न कॉल के लिए i7-3740QM @ 2.7Ghz और R 3.12 का उपयोग करते हुए: RNGkind(kind = NULL, normal.kind = 'Inversion');At <- microbenchmark(A <- rnorm(1e5, 0, 1), times = 100L);RNGkind(kind = NULL, normal.kind = 'Box-Muller');Bt <- microbenchmark(B <- rnorm(1e5, 0, 1), times = 100L)मुझे mean 11.38363 median 11.18718उलटा और mean 13.00401 median 12.48802बॉक्स-मुलर के लिए मिलता है
अवराम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.