पारंपरिक प्रोग्रामिंग भाषा का उपयोग करके ज्ञात माध्य और विचरण के साथ एक सामान्य वितरण से नमूना कैसे लें?


36

मेरे पास आँकड़ों में कोई कोर्स नहीं है, इसलिए मुझे उम्मीद है कि मैं यहाँ सही जगह पूछ रहा हूँ।

मान लीजिए मैं केवल दो एक सामान्य वितरण का वर्णन डेटा है: मतलब μ और विचरण σ2 । मैं इस वितरण से बेतरतीब ढंग से नमूने के लिए एक कंप्यूटर का उपयोग करना चाहता हूं, जैसे कि मैं इन दो आंकड़ों का सम्मान करता हूं।

यह बहुत स्पष्ट है कि मैं लगभग 0 को सामान्य करके इसका मतलब संभाल सकता हूं: बस नमूने को आउटपुट करने से पहले प्रत्येक नमूने में जोड़ें μ। लेकिन मैं नहीं दिख रहा है प्रोग्राम का सम्मान करने के नमूने उत्पन्न करने के लिए σ2

मेरा कार्यक्रम एक पारंपरिक प्रोग्रामिंग भाषा में होगा; मेरे पास किसी सांख्यिकीय पैकेज तक पहुंच नहीं है।


क्या आपकी भाषा में यादृच्छिक संख्या जनरेटर है? क्या यह जनरेटर केवल समान वितरण से है या यह सामान्य वितरण से भी उत्पन्न हो सकता है?
ttnphns

@ttnphns: बहुत अधिक हर कंप्यूटर भाषा एक यादृच्छिक संख्या जनरेटर के साथ आती है। वे कुछ परिमित डोमेन पर अत्यधिक समान जनरेटर हैं।
फिक्सिंग

जवाबों:


33

आप मतलब 0 के साथ एक निर्दिष्ट वितरण और विचरण 1 से स्वाद ले सकते हैं, तो आप कर सकते हैं आसानी से एक से नमूना पैमाने-स्थान परिवर्तन है कि वितरण की है, जो मतलब है और विचरण σ 2 । अगर एक्स एक मतलब 0 और विचरण 1 वितरण से एक नमूना है तो σ x + μ मतलब के साथ एक नमूना है μ और विचरण σ 2 । तो, आपको बस इतना करना है कि माध्य μ को जोड़ने से पहले मानक विचलन var (विचरण के वर्गमूल) द्वारा चर को स्केल करना है ।μσ2x

σx+μ
μσ2σμ

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

संपादित करें: टिप्पणियों के प्रकाश में, कुछ अन्य उत्तर और तथ्य यह है कि Fixee ने इस उत्तर को स्वीकार कर लिया है, मैं कुछ और विवरण दूंगा कि कैसे सामान्य चरों के उत्पादन के लिए एक समान चर के परिवर्तनों का उपयोग किया जा सकता है।

  • वाइटलस्टैटिस्टिक्स की एक टिप्पणी में पहले से वर्णित एक विधि, बॉक्स-मुलर विधि है जो दो स्वतंत्र वर्दी यादृच्छिक चर लेती है और दो स्वतंत्र सामान्य यादृच्छिक चर उत्पन्न करती है। इसी तरह की एक विधि जो दो पारलौकिक कार्यों की गणना से बचती है, कुछ और सिमुलेशन की कीमत पर पाप और कॉस को फ्रैन्कोग्रेक्स द्वारा उत्तर के रूप में पोस्ट किया गया था ।
  • एक पूरी तरह से सामान्य विधि उलटा वितरण फ़ंक्शन द्वारा एक समान यादृच्छिक चर का परिवर्तन है। अगर समान रूप से वितरित किया जाता है पर [ 0 , 1 ] तो Φ - 1 ( यू ) है एक मानक सामान्य वितरण। हालांकि, के लिए स्पष्ट विश्लेषणात्मक सूत्र है Φ - 1 , यह सही संख्यात्मक अनुमानों से गणना की जा सकती। आर (वर्तमान में मैंने जाँच की गई) में वर्तमान कार्यान्वयन इस विचार का उपयोग करता है। विधि धारणात्मक बहुत सरल है, लेकिन का सही कार्यान्वयन की आवश्यकता है Φ - 1 , जो शायद के रूप में व्यापक नहीं है (अन्य) दिव्य कार्यों के रूप मेंU[0,1]
    Φ1(U)
    Φ1Φ1लॉग , पाप और कॉस
  • कई उत्तरों में केंद्रीय वितरण प्रमेय का उपयोग करने की संभावना का उल्लेख समान वितरण यादृच्छिक चर के औसत के रूप में सामान्य वितरण को अनुमानित करने के लिए किया गया है। यह आमतौर पर अनुशंसित नहीं है। प्रस्तुत तर्क, जैसे कि माध्य 0 और विचरण 1 का मिलान, और वितरण के समर्थन के विचार पुष्ट नहीं हैं। क्रिस्चियन पी। रॉबर्ट और जॉर्ज कैसैला द्वारा "आर के साथ मोंटे कार्लो मेथड्स का परिचय" एक्सरसाइज 2.3 में इस जनरेटर को एंटीक्वेटेट कहा जाता है और सन्निकटन को बहुत खराब कहा जाता है ।
  • अन्य विचारों की एक चौंकाने वाली संख्या है। अध्याय 3 और, विशेष रूप से, "द आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग" खंड में धारा 3.4। 2 डोनाल्ड ई। नुथ यादृच्छिक संख्या पीढ़ी पर एक शास्त्रीय संदर्भ है। ब्रायन रिप्ले ने रैंडम वेरिएबल्स का कंप्यूटर जनरेशन: ए ट्यूटोरियल लिखा , जो उपयोगी हो सकता है। रॉबर्ट और कैसला, या शायद अध्याय 2 द्वारा उनकी दूसरी पुस्तक, "मोंटे कार्लो सांख्यिकीय विधियों" में उल्लिखित पुस्तक की भी सिफारिश की गई है।

दिन के अंत में, एक सही ढंग से कार्यान्वित विधि एक समान छद्म यादृच्छिक संख्या जनरेटर का उपयोग करने से बेहतर नहीं है। व्यक्तिगत रूप से, मैं विशेष उद्देश्य पुस्तकालयों पर भरोसा करना पसंद करता हूं जो मुझे विश्वास है कि भरोसेमंद हैं। मैं लगभग हमेशा R में लागू किए गए तरीकों पर या सीधे C / C ++ में API के माध्यम से भरोसा करता हूं। जाहिर है, यह हर किसी के लिए एक समाधान नहीं है, लेकिन मैं विकल्पों की सिफारिश करने के लिए अन्य पुस्तकालयों के साथ पर्याप्त रूप से परिचित नहीं हूं।


(+1) ओपी के लिए अच्छा जवाब और सलाह।
कार्डिनल

18
मुझे यकीन नहीं है कि मैं यहां एक अनावश्यक टिप्पणी कर रहा हूं, लेकिन, यदि आपके पास केवल एक समान यादृच्छिक संख्या जनरेटर तक पहुंच है, तो आप स्वतंत्र एन (0,1) यादृच्छिक संख्या उत्पन्न करने के लिए बॉक्स-मुलर ट्रांसफॉर्म का उपयोग कर सकते हैं । संक्षेप में, अगर U_1 और U_2 स्वतंत्र हैं वर्दी से (0,1) वितरण तो ड्रॉ और
2log(U1)cos(2πU2)
के रूप में स्वतंत्र N (0,1) यादृच्छिक परिवर्तनीय वितरित कर रहे हैं। मूल विचार
2log(U1)sin(2πU2)
विटालिस्टिस्टिक्स

2
@ वैताल: अनावश्यक टिप्पणी नहीं; एक अच्छी पहल। बॉक्स-मुलर ट्रांसफॉर्म शायद अनजाने में कुछ बुरा करने की न्यूनतम संभावना के साथ प्रोग्राम करना सबसे आसान है। यह सबसे तेज़ नहीं है , लेकिन यह काफी प्रतिस्पर्धी है। उस ने कहा, एक स्थापित कोड लाइब्रेरी का उपयोग करना शायद अभी भी सुरक्षित है, खासकर उस जगह से जहां एक मिसस्टेप करने की सबसे अधिक संभावना है कि एक समान यादृच्छिक चर इनपुट कैसे उत्पन्न होते हैं!
कार्डिनल

@ वैताल: धन्यवाद, यह वही है जिसकी मुझे तलाश थी। यदि आप अपनी टिप्पणी को एक उत्तर में बदलना चाहते हैं, तो मैं खुशी से इसे बढ़ा दूंगा।
फिक्सिंग

1
@VitalStatistix, यह एक अच्छी टिप्पणी है, और ऐसा प्रतीत होता है कि यह वही था जो ओपी देख रहा था। क्यों नहीं इसे एक उत्तर में बदल दें और शायद समान यादृच्छिक चर के परिवर्तनों का उपयोग करने के सामान्य विचार पर इसे थोड़ा विस्तृत करें। मैं इस कारण से कार्डिनल उल्लेख करने से हिचकिचाया क्योंकि मुझे नहीं पता कि किसी भी भाषा से डिफ़ॉल्ट एकसमान जनरेटर एक अच्छा जनरेटर है।
NRH 8

10

यह वास्तव में माइकल ल्यू के जवाब और फिक्सी की टिप्पणी पर एक टिप्पणी है, लेकिन एक उत्तर के रूप में पोस्ट किया गया है क्योंकि मुझे टिप्पणी करने के लिए इस साइट पर प्रतिष्ठा नहीं है।

बारह स्वतंत्र यादृच्छिक चर का योग समान रूप से पर वितरित किया गया है , जिसका अर्थ है 6 और विचरण 1 । दूसरे शब्दों में, [ 12 Σ मैं = 1 एक्स मैं ] = 12 Σ मैं = 1[ एक्स मैं ] = 12 × 1[0,1]61 और वर[ 12 Σ मैं = 1 एक्समैं]= 12 Σ मैं=1वर[एक्समैं]=12×1

E[i=112Xi]=i=112E[Xi]=12×12=6
CLT तो ज़ोर करने के लिए इस्तेमाल किया जा सकता है कि के वितरण Σ 12 मैं = 1 एक्समैं-6 लगभग एक मानक सामान्य वितरण है। की तुलना मेंदसमाइकल ल्यू और Fixee द्वारा विचार चर, यादृच्छिक संख्या जनरेटर के लिए दो अतिरिक्त कॉल के लिए आवश्यक हैं, लेकिन हम द्वारा विभाजन से बचने
var[i=112Xi]=i=112var[Xi]=12×112=1.
i=112Xi6 वांछित इकाई विचरण पाने के लिए। यह भी लायक याद है कि हैΣ 12 मैं = 1 एक्समैं-6केवल सीमा में मूल्यों पर ले जा सकते हैं[-6,6]और इस प्रकारचरम(बहुत कम संभावना) मूल्यों से अधिक से माध्य से भिन्न6मानक विचलन होगा कभी नहीं। यह अक्सर कंप्यूटर और संचार प्रणालियों के सिमुलेशन में एक समस्या है जहां इस तरह की बहुत कम संभावना घटनाओं में बहुत रुचि है।10/12i=112Xi6[6,6]6

5

NRH के उत्तर के अलावा, यदि आपके पास अभी भी "मानक सामान्य वितरण" N (0,1) से यादृच्छिक नमूने उत्पन्न करने का कोई साधन नहीं है, तो नीचे एक अच्छा और सरल तरीका है (क्योंकि आप उल्लेख करते हैं कि आपके पास सांख्यिकीय नहीं है पैकेज, नीचे दिए गए कार्य अधिकांश मानक प्रोग्रामिंग भाषाओं में उपलब्ध होने चाहिए)।

1. यू और वी को दो समान रूप से वितरित यादृच्छिक संख्या में रेंज में -1 से 1 तक
u = 2 r1 - 1औरv = 2 r2 - 1

2. w = u^2 + v^2अगर w> 1 को 1 पर वापस जाएं

3. ग्रेट यू * z और y = v * z के साथ z= sqrt(-2ln(w)/w) एक नमूना कोड इस तरह दिखेगा:

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

फिर MHR ने यादृच्छिक विचलन प्राप्त करने के लिए ऊपर जो सुझाव दिया है उसका उपयोग करें N(mu, sigma^2)


जब मैंने अपना उत्तर ऊपर दिया तो मुझे ध्यान नहीं आया कि @vitalStatistix ने आपको बॉक्स-मुलर ट्रांसफॉर्म एल्गोरिथ्म दिया है। मैं जो ऊपर देता हूं वह भी उतना ही अच्छा है जितना मुझे लगता है।
फ्राँकोग्रेक्स

2
क्या आप कृपया समान वितरण (एक एल्गोरिथम दृष्टिकोण के अलावा) से सामान्य चर उत्पन्न करने का कारण बता सकते हैं और न कि सीधे गौसियन / सामान्य वितरण के pdf का उपयोग कर सकते हैं? या यह पूरी तरह से गलत है?
अरुण

4
@ अरुन एक कारण: मार्साग्लिया का ध्रुवीय तरीका उपयोगी है जब आपके पास केवल एक आरएनजी है जो समान विचलन उत्पन्न करता है।
chl

1
@ अगर यह सबसे आसान तरीका है। आप "स्वीकृति अस्वीकृति" उदाहरण के लिए सीधे पीडीएफ से भी उत्पन्न कर सकते हैं। मैंने आपके लिए अपनी साइट पर एक सरल उदाहरण पोस्ट किया है (क्योंकि यहां टिप्पणी बॉक्स में पर्याप्त जगह नहीं है)।
फ्रैंकक्रेक्स

4

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

यह कहें कि आपके समान रैंडम मान 0 और 1 के बीच समान रूप से वितरित किए गए हैं। योग तब 0 और 10. के बीच होगा। योग से 5 घटाएं और परिणामी वितरण का मतलब 0. होगा। अब आप परिणाम को मानक विचलन द्वारा विभाजित करते हैं (निकट) सामान्य वितरण और वांछित मानक विचलन द्वारा परिणाम गुणा करें। दुर्भाग्य से मुझे यकीन नहीं है कि दस समान यादृच्छिक विचलन की राशि का मानक विचलन क्या है, लेकिन अगर हम भाग्यशाली हैं कि कोई हमें टिप्पणी में बताएगा!

मैं इन शर्तों में सामान्य वितरण के बारे में छात्रों से बात करना पसंद करता हूं क्योंकि कई प्रणालियों में एक सामान्य वितरण की धारणा की उपयोगिता संपत्ति से पूरी तरह से उपजी है कि कई यादृच्छिक प्रभावों के योग एक सामान्य वितरण की ओर ले जाते हैं।


आप यहां सेंट्रल लिमिट थाइम का उपयोग कर रहे हैं (यानी सामान्य यादृच्छिक चर के लिए आईआईडी यादृच्छिक चर का एक गुच्छा)। मैंने इस पर विचार नहीं किया क्योंकि मुझे लगा कि यह बहुत धीमा होगा, लेकिन आप कहते हैं कि 10 पर्याप्त है ?! यह एक लॉग और एक पाप / कॉस और एक sqrt की गणना करने से बेहतर है!
फिक्सिंग

इसके अलावा, [0,1] पर समान आरवी का मतलब विचरण 1/12 के साथ 0.5 है। यदि आप इनमें से 10 का योग करते हैं, तो आपको 5 और माध्य 10/12 = 5/6 का माध्य मिलता है।
फिक्सि

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

1
@ फ़िक्सी: आपको निश्चित होना चाहिए और की गणना को संतुलित करना चाहिएलॉग, पाप, क्योंकिऔर अतिरिक्त वर्दी यादृच्छिक चर की पीढ़ी के खिलाफ वर्गमूल। उदाहरण के लिए, इंटेल सीपीयू में इन चार कार्यों के रूप में अंतर्निहित ऑपरेशन हार्डवेयर में किए गए हैं। स्क्वायर-रूट IEEE 754 मानकों के अनुसार एक मौलिक "अंकगणित" ऑपरेशन है।
कार्डिनल

1
@ मिचेल: इसकी घोषणा करने से "अधिकार" वितरण में थोड़ा खिंचाव होता है, विशेष रूप से चूंकि सन्निकटन वितरण में कॉम्पैक्ट समर्थन होता है और कई अनुप्रयोगों में, कोई इस बात की परवाह करता है कि कैसे कुशलता से चर उत्पन्न हो सकते हैं। :) बिंदु वहाँ कई हैं ज्यादा बेहतर विकल्प उपलब्ध। लेकिन, मुझे अभी भी लगता है कि यह शैक्षणिक रूप से कुछ उपयोगी प्रदान करता है।
कार्डिनल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.