मनमाने ढंग से असतत वितरण के आधार पर संख्या कैसे उत्पन्न करें?


28

मैं मनमाने ढंग से असतत वितरण के आधार पर संख्याएँ कैसे उत्पन्न करूँ?

उदाहरण के लिए, मेरे पास संख्याओं का एक समूह है जिसे मैं उत्पन्न करना चाहता हूं। कहते हैं कि उन्हें 1-3 के रूप में लेबल किया गया है।

1: 4%, 2: 50%, 3: 46%

मूल रूप से, प्रतिशत संभावनाएं हैं कि वे यादृच्छिक संख्या जनरेटर से आउटपुट में दिखाई देंगे। मेरे पास एक pesudorandom नंबर जनरेटर है जो अंतराल में एक समान वितरण उत्पन्न करेगा [0, 1]। ऐसा करने का कोई रास्ता नहीं है?

मेरे पास कितने तत्व हैं, इस पर कोई सीमा नहीं है, लेकिन% 100% तक बढ़ जाएगा।


2
यदि आपका प्रश्न है, तो मैं शीर्षक में "... मनमाने ढंग से वितरण" निर्दिष्ट करने का सुझाव दे सकता हूं। निरंतर मामला अलग है।
डेविड एम कपलान

3
एक सामान्य तरीका संचयी संभावनाओं की एक सूची के भीतर एक द्विआधारी खोज करना है, जो इस उदाहरण में होगा । औसतन यह प्रति पीढ़ी की घटना के लिए जांच करता है। यदि कोई संभावना बहुत छोटी नहीं है, तो आप और समान रूप से (एक पूर्व अवस्था में) प्रत्येक मान के लिए एक परिणाम प्रदान करते हुए समान रूप से अंतर मानों का एक वेक्टर बनाकर प्रदर्शन प्राप्त कर सकते हैं । उदाहरण के लिए, इस उदाहरण में आप वेक्टर ( 2 और 3 के साथ)। एक समान उत्पन्न करें, 100 से गुणा करें, और इस वेक्टर में सूचकांक करें: किया गया। लॉग ( n ) / 2 O ( 1 ) [ 0 , 1 ] ( 1 , 1 , 1 , 1 , 2 , , 2 , 3 , , 3 ) 50 46(0,0.04,0.54,1.0)log(n)/2O(1)[0,1](1,1,1,1,2,,2,3,,3)5046
व्हीबर


यह "यहाँ" लिंक वास्तव में इस बहुत ही प्रश्न के लिंक है, @Glen_b ... कॉपी-एन-पेस्ट त्रुटि?
ब्यूरो जूना

@buruzaemon धन्यवाद हाँ जो एक गलती थी; मैंने इसे सुधारा है।
Glen_b -Reinstate मोनिका

जवाबों:


26

असतत वितरण से नमूने के लिए सबसे अच्छा एल्गोरिदम में से एक उपनाम विधि है

उपनाम विधि (कुशलता से) एक द्वि-आयामी डेटा संरचना को प्री-ऑम्प्यूट करता है जो आयतों को संभावनाओं के अनुपात में विभाजित करता है।

आकृति

संदर्भित साइट से इस योजनाबद्ध में, इकाई ऊंचाई की एक आयत क्षेत्रों में से चार प्रकार में विभाजित किया गया है - के रूप में रंग द्वारा पृथक - अनुपात में , 1 / 3 , 1 / 12 , और 1 / 12 , में इन संभावनाओं के साथ असतत वितरण से बार-बार नमूना लेने का आदेश। ऊर्ध्वाधर स्ट्रिप्स में एक स्थिर (इकाई) चौड़ाई होती है। प्रत्येक को केवल एक या दो टुकड़ों में विभाजित किया गया है। टुकड़ों की पहचान और ऊर्ध्वाधर विभाजनों के स्थानों को स्तंभ सूचकांक के माध्यम से सुलभ तालिकाओं में संग्रहीत किया जाता है।1/21/31/121/12

तालिका को दो सरल चरणों (प्रत्येक समन्वय के लिए एक) में नमूना किया जा सकता है, जिसमें केवल दो स्वतंत्र समान मूल्यों और गणना की आवश्यकता होती है । यह अन्य उत्तरों में वर्णित के रूप में असतत सीडीएफ को पलटने के लिए आवश्यक ( लॉग ( एन ) ) संगणना में सुधार करता है।O(1)O(log(n))


2
यह एल्गोरिथ्म केवल तभी सबसे अच्छा है जब संभावनाएं गणना करने के लिए सस्ती हैं। उदाहरण के लिए यदि बहुत बड़ा है तो बेहतर हो सकता है कि वह पूरे पेड़ का निर्माण न करे। n
प्रोबेबिलिसोलॉजिक

3
+1 अब तक यह एक कुशल एल्गोरिदम का सुझाव और वर्णन करने वाला एकमात्र उत्तर है।
whuber

19

आप इसे R में आसानी से कर सकते हैं, बस उस आकार को निर्दिष्ट करें जिसकी आपको आवश्यकता है:

sample(x=c(1,2,3), size=1000, replace=TRUE, prob=c(.04,.50,.46))

3
व्यक्तिगत रूप से, मैं एक एल्गोरिथ्म (या कहीं न कहीं आवश्यक ज्ञान सीखना) पसंद करूंगा, क्योंकि मैं इसे एक ऐप में शामिल करने की कोशिश कर रहा हूं जो मैं बना रहा हूं :) हालांकि आपके उत्तर के लिए बहुत धन्यवाद :)
FurtiveFelon

ह्म्म्म ठीक है ... जो आप करना चाहते हैं उसके बारे में थोड़ा और जानना हमें आपका मार्गदर्शन करने में मदद करेगा। क्या आप हमें इसके बारे में और बता सकते हैं? (प्रयोजन, संदर्भ, आदि)
डोमिनिक कॉमटिस

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

1
@furtivefelon, आप हमेशा R से कोड पोर्ट कर सकते हैं, कोड से एल्गोरिदम का पता लगा सकते हैं और इसे पुन: लागू कर सकते हैं।
एमपिकेटस

मैं सोच रहा हूं कि आपको स्टैक ओवरफ्लो पर कुछ अच्छी (बेहतर) सलाह मिल सकती है, क्योंकि इस विशिष्ट उद्देश्य के लिए कुछ प्रसिद्ध समाधान मौजूद हैं। मेरा सुझाव है कि अपनी अंतिम टिप्पणी से सीधे अपने प्रश्न में जानकारी भी शामिल करें।
डोमिनिक कोम्टिस

19

अपने उदाहरण में, कहते हैं कि आप अपने छद्म आयामी यूनिफ़ॉर्म [0,1] मूल्य को आकर्षित करते हैं और इसे यू कहते हैं। फिर आउटपुट:

1 अगर यू <0.04

2 अगर यू> = 0.04 और यू <0.54

3 अगर यू> = 0.54

यदि निर्दिष्ट% a, b, ... हैं, तो बस आउटपुट

मान 1 यदि यू

मान 2 यदि U> = a और U <(a + b)

आदि।

अनिवार्य रूप से, हम% को [0,1] के सबसेट में मैप कर रहे हैं, और हम इस संभावना को जानते हैं कि एक समान यादृच्छिक मूल्य किसी भी श्रेणी में आता है, बस उस सीमा की लंबाई है। श्रेणियों को क्रम में रखना सबसे सरल लगता है, यदि अद्वितीय नहीं है, तो इसे करने का तरीका। यह मानकर चल रहा है कि आप केवल असतत वितरण के बारे में पूछ रहे हैं; निरंतर के लिए, "अस्वीकृति नमूनाकरण" ( विकिपीडिया प्रविष्टि ) जैसा कुछ कर सकते हैं ।


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

1
केवल छँटाई पर एक त्वरित नोट जोड़ने के लिए - यह केवल तभी प्रभावी होगा जब आप इसे एक बार नमूना योजना की शुरुआत में करते हैं - इसलिए यह उन मामलों के लिए अच्छा नहीं होगा, जहां संभावनाएं खुद को एक बड़ी समग्र योजना के हिस्से के रूप में नमूना लेती हैं ( जैसे। और फिर पी आर ( Y = j ) = पी जे )। जो भी जोड़ेंगे कि - इस मामले में छँटाई करके आप नमूने के हर यात्रा में छँटाई आपरेशन जोड़ रहे हे ( एन लॉग इन करें ( n ) )pjDistPr(Y=j)=pjO(nlog(n))प्रत्येक पुनरावृत्ति के लिए समय। हालांकि, इस मामले में शुरू में संभावनाओं के आकार पर अनुमानित अनुमान के आधार पर छांटना उपयोगी हो सकता है।
probabilityislogic

4

मान लीजिए देखते हैं संभव असतत परिणामों। आप विभाजन ( 0 , 1 ) अंतराल को देने के लिए अंतराल, [ 0 , 1 ] को संचयी प्रायिकता मास फ़ंक्शन, एफ , के आधार पर विभाजित करते हैं।m[0,1]F(0,1)

मैं1मैं2मैंमीटर

जहां और एफ ( 0 ) 0 । आपके उदाहरण में m = 3 औरमैंj=(एफ(j-1),एफ(j))एफ(0)0मीटर=3

I1=(0,.04),     I2=(.04,.54),     I3=(.54,1)

चूँकि और F ( 2 ) = .54 और F ( 3 ) = 1 हैF(1)=.04F(2)=.54F(3)=1

फिर आप निम्न एल्गोरिथम का उपयोग करके वितरण F के साथ उत्पन्न कर सकते हैं :XF

(1) U U n i f o r m m ( 0 , 1 ) उत्पन्न करेंUUniform(0,1)

(2) यदि , तो एक्स = jUIjX=j

  • यह कदम चाहे को देखकर पूरा किया जा सकता में से प्रत्येक से कम है संचयी संभावनाओं, और देख जहां परिवर्तन बिंदु (से करने के लिए ), तब होता है जो और आप उपयोग कर रहे है जो कुछ भी प्रोग्रामिंग भाषा में एक बूलियन ऑपरेटर का उपयोग करने की बात होनी चाहिए वेक्टर में सबसे पहले कहाँ होता है।UTRUEFALSEFALSE

ध्यान दें कि वास्तव में अंतराल में से एक में हो जाएगा मैं j क्योंकि वे संबंध तोड़ना और विभाजन कर रहे हैं [ 0 , 1 ]UIj[0,1]


क्या उन अंतरालों को आधा-बंद नहीं किया जाना चाहिए? अन्यथा अंतराल के बीच की सीमाएँ शामिल नहीं हैं .. अर्थात। {[0,0.04), [0.04,0.54), [0.54,1]}
naught101

1
किसी भी बिंदु u के लिए (यानी आधे खुले अंतराल के लेब्सग्रे माप खुले अंतराल के समान है) इसलिए मुझे नहीं लगता कि यह मायने रखता है। पी(यू=यू)=0यू
मैक्रो

1
एक परिमित परिशुद्धता डिजिटल मशीन पर है, हालांकि, हो सकता है ब्रह्मांड इससे कोई फर्क होगा के अंत से पहले किसी दिन ...
jbowman

1
काफी, @whuber, मेरा संपादन देखें।
मैक्रों

1
ठीक है, यह एक एल्गोरिथ्म है। BTW, तुम सिर्फ कुछ वापस क्यों नहीं करते min(which(u < cp))? यह अच्छा होगा कि प्रत्येक कॉल पर संचयी राशि को फिर से एकत्रित न किया जाए। उस पूर्ववर्ती के साथ, संपूर्ण एल्गोरिथ्म कम हो जाता है min(which(runif(1) < cp))। या बेहतर है, क्योंकि ओपी संख्याओं ( बहुवचन ) को उत्पन्न करने के लिए कहता है , इसे वैसा ही बनाते हैं n<-10; apply(matrix(runif(n),1), 2, function(u) min(which(u < cp)))
whuber

2

एक सरल एल्गोरिथ्म अपनी वर्दी यादृच्छिक संख्या के साथ शुरू करने के लिए है और पहले लूप में पहली संभावना को घटाएं, यदि परिणाम नकारात्मक है, तो आप पहले मान वापस करते हैं, यदि अभी भी सकारात्मक है तो आप अगले पुनरावृत्ति पर जाते हैं और अगली संभावना को घटाते हैं , अगर नकारात्मक, आदि की जाँच करें।

यह इस बात में अच्छा है कि मूल्यों / संभावनाओं की संख्या अनंत हो सकती है लेकिन आपको केवल उन संख्याओं के करीब आने पर संभावनाओं की गणना करने की आवश्यकता होती है (कुछ के लिए एक पॉइसन या नकारात्मक द्विपद वितरण से उत्पन्न)।

यदि आपके पास संभावनाओं का एक सीमित सेट है, लेकिन उनमें से कई संख्याएं उत्पन्न हो रही हैं, तो संभवतया सॉर्ट करने के लिए अधिक कुशल हो सकता है ताकि आप सबसे पहले सबसे बड़ा घटाएं, फिर दूसरा सबसे बड़ा और आगे।


2

सबसे पहले, मुझे अपना ध्यान किसी पूर्णांक पुस्तकालय में पूर्णांक या फ्लोटिंग पॉइंट रैंडम नंबर जनरेशन के लिए तैयार-उपयोग कक्षाओं के साथ आकर्षित करना चाहिए जो मनमाना वितरण का पालन करते हैं।

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


2

मुझे भी यही समस्या थी। ऐसे सेट को देखते हुए जहां प्रत्येक आइटम में एक संभावना होती है और जिसकी वस्तुओं की संभावना एक तक होती है, मैं एक नमूना को कुशलतापूर्वक खींचना चाहता था, अर्थात बिना किसी चीज़ को छांटे और बिना बार-बार सेट पर पुनरावृत्ति किए

निम्न फ़ंक्शन अंतराल [ , 1 ) के भीतर समान रूप से वितरित की सबसे कम यादृच्छिक संख्या खींचता है । चलो आर से एक यादृच्छिक संख्या हो [ 0 , 1 )एन[,1)आर[0,1)

आगामी(एन,)=1-(1-)आरएन

आप एक आकर्षित करने के लिए इस सुविधा का उपयोग कर सकते हैं आरोही श्रृंखला के एन समान रूप में [0,1 यादृच्छिक संख्या वितरित)। यहाँ N = 10 के साथ एक उदाहरण दिया गया है :(मैं)एनएन=10

0=आगामी(10,0)
1=आगामी(9,0)
a2=next(8,a1)

a9=next(1,a8)

(ai)P0k<|P|pkPaikp0pk>aipkai+1


{(1,0.04),(2,0.5),(3,0.46)}N=10

i a_i k Sum Draw
०.०३१ ० ०.०४ १
1 0.200 1 0.54 2
2 0.236 1 0.54 2
3 0.402 1 0.54 2
4 0.488 1 0.54 2
5 0.589 2 1.0 3
6 0.625 2 1.0 3
7 0.638 2 1.0 3
8 0.738 2 1.0 3
९ ०.०४२ २ १.३ ३

(1,2,2,2,2,3,3,3,3,3)


nextN[a,x)x1


ऐसा प्रतीत होता है कि आप जिस समस्या को दूसरे पैराग्राफ में एक से अचानक बदल रहे हैं, वह एक समान वितरण से नमूने के अनियंत्रित असतत वितरण के नमूने हैं । इसका समाधान उस प्रश्न से प्रासंगिक नहीं प्रतीत होता है जो यहां पूछा गया था।
whuber

मैंने पिछले भाग को स्पष्ट किया।
काशी

{1,2,3}

मैंने एक उदाहरण जोड़ा। मेरे उत्तर में डेविड एम कपलान के उत्तर ( आँकड़ें .stackexchange.com/a/26860/93386 ) के साथ सामान्य रूप से कुछ है , लेकिन एन एन (= नमूना आकार) पुनरावृत्तियों के बजाय केवल एक की आवश्यकता है, एन एन ड्राइंग की कीमत पर। वें जड़ें। मैंने दोनों प्रक्रियाओं को प्रोफाइल किया, और मेरा बहुत तेज था।
काशी

aj=i=1jlog(ui)i=1N+1log(ui)
u1,,uN+1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.