संभावना के साथ एक बर्नौली चर का अनुकरण करें


9

क्या कोई मुझे बता सकता है कि मैं कैसे अनुकरण कर सकता हूं Bernoulli(ab), कहाँ पे a,bN, एक सिक्का टॉस (के रूप में कई बार के रूप में आप की आवश्यकता के साथ) का उपयोग कर P(H)=p ?

मैं अस्वीकृति नमूने का उपयोग करने के बारे में सोच रहा था, लेकिन इसे नीचे नहीं कर सकता था।


1
यह मूल रूप से एक पाठ्यक्रम या पाठ्यपुस्तक से एक प्रश्न है? यदि हां, तो कृपया [self-study]टैग जोड़ें और इसकी विकी पढ़ें । ध्यान दें कि आपके प्रश्न के अंत में मदद के लिए कोई दलील देने की आवश्यकता नहीं है - हम जानते हैं कि जो कोई भी यहाँ पोस्ट करता है वह मदद की उम्मीद कर रहा है!
सिल्वरफिश

1
यहाँ @Glen_b द्वारा एक उत्कृष्ट पोस्ट है (हालांकि मुझे याद नहीं आ रहा है जहाँ) के बारे में क्यों "संभावना के साथ एक" पक्षपाती सिक्का जैसी कोई चीज नहीं है p", लेकिन मुझे पता है कि यह आपके सवाल का केवल एक परिधीय मुद्दा है!
सिल्वरफ़िश

2
@dsaxton प्रश्न कहता है "जितने की आवश्यकता है"; यह संभावना 1 के साथ परिमित होगा, लेकिन बाध्य नहीं है (आप किसी भी निश्चित संख्या से अधिक हो सकते हैं) लेकिन इस आधार पर आपत्ति यह कहना उचित होगा कि "उचित सिक्का प्राप्त करें जब तक कि आपको एक सिर न मिल जाए" ज्यामितीय उत्पादन के लिए एक विधि के रूप में व्यवहार्य नहीं है। (12यादृच्छिक संख्या।
Glen_b -Reinstate मोनिका

1
@AbracaDabra क्या यह एक कक्षा के लिए एक अभ्यास है? यदि नहीं, तो यह कैसे उत्पन्न होता है?
Glen_b -Reinstate मोनिका

1
@ गलेन_ बी: यह मेरी कक्षा से एक अभ्यास नहीं है। यह सिर्फ विचार की इस श्रृंखला में मेरे साथ हुआ है ...: शास्त्रीय संभावना के अनुसार, एक उचित सिक्का लें, जैसे ही आप टॉज़ की संख्या बढ़ाते हैं, अनुपात#Heads#tailsआधे में परिवर्तित हो जाता है। तो यह पक्षपाती लोगों के लिए भी सही होना चाहिए ... इसका मतलब है कि एक सिक्के को किसी विशेष संख्या में परिवर्तित करने के लिए, आपको इसकी आवश्यकता हैP(H)उस संख्या के लिए। अब मैंने सोचा, अगर हम एक नंबर का उत्पादन करना चाहते हैं, तो क्या होगा, लेकिन हमारे पास एक सिक्का हैP(H)एक अन्य संख्या (ज्ञात या अज्ञात)?
अबरकदरा

जवाबों:


8

क्योंकि बेशुमार समाधान हैं, चलो एक कुशल खोजें ।

इसके पीछे एक विचार बर्नौली चर को लागू करने के लिए एक मानक तरीके से शुरू होता है: एक समान यादृच्छिक चर की तुलना करें U पैरामीटर के लिए a/b। कबU<a/b, वापसी 1; अन्यथा, वापस लौटें0

हम उपयोग कर सकते हैं p-एक समान यादृच्छिक संख्या जनरेटर के रूप में यूरो । एक संख्या उत्पन्न करने के लिएU किसी भी अंतराल के भीतर समान रूप से [x,y), सिक्का पलटें। जब यह प्रमुख होता है, पुनरावर्ती रूप से एक समान मूल्य उत्पन्न करता हैX पहली बार में pअंतराल का हिस्सा; जब यह पूंछ, पुनरावृत्ति उत्पन्न करता हैX के पिछले 1pअंतराल का हिस्सा। कुछ बिंदु पर लक्ष्य अंतराल इतना छोटा हो जाएगा कि वास्तव में इससे कोई फर्क नहीं पड़ता कि आप इससे कोई संख्या कैसे लेते हैं: यही कारण है कि पुनरावृत्ति शुरू हो जाती है। यह स्पष्ट है कि यह प्रक्रिया समान रूप से (किसी भी वांछित परिशुद्धता तक) उत्पन्न करती है, जैसा कि आसानी से प्रेरण द्वारा सिद्ध किया जाता है।

यह विचार कुशल नहीं है, लेकिन यह एक कुशल विधि की ओर जाता है। चूंकि प्रत्येक चरण में आप कुछ दिए गए अंतराल से एक संख्या आकर्षित करने जा रहे हैं[x,y), पहले यह क्यों नहीं जांचें कि क्या आपको इसे खींचने की आवश्यकता है? यदि आपका लक्ष्य मान इस अंतराल के बाहर है, तो आप पहले से ही यादृच्छिक मूल्य और लक्ष्य के बीच तुलना का परिणाम जानते हैं। इस प्रकार, यह एल्गोरिथ्म तेजी से समाप्त होता है। (यह प्रश्न में अनुरोधित अस्वीकृति नमूना प्रक्रिया के रूप में माना जा सकता है ।)

हम आगे इस एल्गोरिथ्म को अनुकूलित कर सकते हैं। किसी भी स्तर पर, हमारे पास वास्तव में दो सिक्के हैं जिनका हम उपयोग कर सकते हैं: हमारे सिक्के को रीलेबल करके हम इसे एक में बदल सकते हैं जो कि मौका के साथ प्रमुख है1p। इसलिए, एक प्रीकम्प्यूटेशन के रूप में, हम पुनरावर्ती रूप से चयन कर सकते हैं, जो भी relabeling समाप्ति की जरूरत flips की कम अपेक्षित संख्या की ओर जाता है। (यह गणना एक महंगा कदम हो सकता है।)

उदाहरण के लिए, एक सिक्के का उपयोग करना अक्षम है p=0.9 एक बर्नौली का अनुकरण करने के लिए(0.01)चर सीधे: यह औसत पर लगभग दस flips लेता है। लेकिन अगर हम एp=10.0=0.1 सिक्का है, तो सिर्फ दो flips में हम सुनिश्चित किया जाएगा और flips की अपेक्षित संख्या बस है 1.2

यहाँ विवरण हैं।

किसी भी आधे-खुले अंतराल में विभाजन I=[x,y) अंतराल में

[x,y)=[x,x+(yx)p)[x+(yx)p,y)=s(I,H)s(I,T).

यह दो परिवर्तनों को परिभाषित करता है s(,H) तथा s(,T) जो आधे-खुले अंतराल पर काम करते हैं।

शब्दावली के रूप में, यदि I वास्तविक संख्याओं के किसी भी सेट को अभिव्यक्ति दें

t<I

मतलब कि t के लिए एक कम बाध्य है I: t<x सबके लिए xI। इसी तरह,t>I माध्यम t के लिए एक ऊपरी बाध्य है I

लिखो a/b=t। (वास्तव में, इससे कोई फर्क नहीं पड़ेगा अगरtतर्कसंगत के बजाय वास्तविक है; हमें केवल इसकी आवश्यकता है0t1।)

यहाँ एक वैरिएबल का उत्पादन करने के लिए एल्गोरिथ्म है Z वांछित बर्नौली पैरामीटर के साथ:

  1. सेट n=0 तथा In=I0=[0,1)

  2. जबकि (tIn) {उत्पादन के लिए सिक्का टॉस Xn+1। सेटIn+1=S(In,Xn+1). वेतन वृद्धि n।}

  3. अगर t>In+1 फिर सेट करें Z=1। अन्यथा, सेट करेंZ=0


कार्यान्वयन

वर्णन करने के लिए, यहां Rफ़ंक्शन के रूप में अलोरिथ का कार्यान्वयन है draw। इसके तर्क लक्ष्य मूल्य हैंt और अंतराल [x,y), शुरू में [0,1)। यह सहायक फ़ंक्शन sकार्यान्वयन का उपयोग करता हैs। हालाँकि इसकी आवश्यकता नहीं है, यह भी सिक्के की संख्या को ट्रैक करता है। यह यादृच्छिक चर, tosses की गिनती, और अंतिम अंतराल का निरीक्षण करता है।

s <- function(x, ab, p) {
  d <- diff(ab) * p
  if (x == 1) c(ab[1], ab[1] + d) else c(ab[1] + d, ab[2])
}
draw <- function(target, p) {
  between <- function(z, ab) prod(z - ab) <= 0
  ab <- c(0,1)
  n <- 0
  while(between(target, ab)) {
    n <- n+1; ab <- s(runif(1) < p, ab, p)
  }
  return(c(target > ab[2], n, ab))
}

इसके उपयोग और इसकी सटीकता के परीक्षण के एक उदाहरण के रूप में, मामला लें t=1/100 तथा p=0.9। आओ बनाते हैं10,000 एल्गोरिथ्म का उपयोग करने वाले मूल्य, माध्य (और इसकी मानक त्रुटि) पर रिपोर्ट करते हैं, और उपयोग किए गए फ़्लिप की औसत संख्या का संकेत देते हैं।

target <- 0.01
p <- 0.9
set.seed(17)
sim <- replicate(1e4, draw(target, p))

(m <- mean(sim[1, ]))                           # The mean
(m - target) / (sd(sim[1, ]) / sqrt(ncol(sim))) # A Z-score to compare to `target`
mean(sim[2, ])                                  # Average number of flips

इस सिमुलेशन में 0.0095फ़्लिप के प्रमुख थे। हालांकि के लक्ष्य से कम है0.01, का जेड-स्कोर 0.5154महत्वपूर्ण नहीं है: इस विचलन को संयोग के लिए जिम्मेदार ठहराया जा सकता है। फ़्लिप की औसत संख्या थी9.886- दस से थोड़ा कम। अगर हमने इस्तेमाल किया होता1p सिक्का, मतलब होता 0.0094--still लक्ष्य से बहुत अलग नहीं है, लेकिन केवल 1.177 औसत रूप से फ़्लिप की आवश्यकता होती।


मैं अपने जवाब में इस समाधान और समाधान 2 के बीच समानताएं देखने में मदद नहीं कर सकता। जबकि मैं एक निष्पक्ष सिक्का (पक्षपाती सिक्का समस्या के लिए वास्तव में दिलचस्प समाधान) मानता हूं, और बेस -2 में सभी गणना / तुलना करता हूं, आप आधार 10 में सभी गणना / तुलना करते हैं। आपके विचार क्या हैं?
Cam.Davidson.Pilon 3:26 बजे

1
@ मुझे लगता है कि आपको मेरे उदाहरणों से धोखा हो सकता है: हालांकि वे आधार संख्या में अच्छी संख्या का उपयोग करते हैं, निर्माण में किसी विशेष आधार के साथ कुछ भी नहीं करना है।
whuber

2
(+1) बहुत साफ संकल्प। अनुकूलन ऊपरी और निचले-बाउंडिंग में खड़ा हैa/b जैसी शक्तियों द्वारा pn(1p)m और / या (n+mm)pn(1p)m। सिम्युलेटेड बर्नौलीस की संख्या के संदर्भ में इष्टतम डाइकोटॉमी को ढूंढना अच्छा होगा।
शीआन

5

यहाँ एक समाधान है (थोड़ा गड़बड़ है, लेकिन यह मेरा पहला छुरा है)। आप वास्तव में अनदेखी कर सकते हैंP(H)=p और WLOG मान लेते हैं P(H)=1/2। क्यों? दो पक्षपाती सिक्का फ़्लिप से एक निष्पक्ष सिक्का फ्लिप करने के लिए एक चतुर एल्गोरिथ्म मौजूद है । तो हम मान सकते हैंP(H)=1/2

उत्पन्न करने के लिए Bernoulli(ab), मैं दो समाधानों के बारे में सोच सकता हूं (पहला मेरा अपना नहीं है, लेकिन दूसरा एक सामान्यीकरण है):

समाधान 1

निष्पक्ष सिक्के को पलटें bबार। अगरaसिर मौजूद नहीं हैं, शुरू करें। अगरaसिर कर रहे हैं वर्तमान, वापसी है कि क्या पहले सिक्का एक सिर है या नहीं (क्योंकिP(first coin is heads | a heads in b coins)=ab)

समाधान २

इसे किसी भी मूल्य तक बढ़ाया जा सकता है Bernoulli(p)। लिखोpद्विआधारी रूप में। उदाहरण के लिए,0.1=0.0001100110011001100110011...base 2

हम सिक्का फ़्लिप का उपयोग करके एक नया बाइनरी नंबर बनाएंगे। के साथ शुरू0., और अगर एक सिर (1) या पूंछ (0) प्रकट होता है, तो अंकों को जोड़ते हैं। प्रत्येक फ्लिप पर, बाइनरी प्रतिनिधित्व के साथ अपने नए बाइनरी नंबर की तुलना करेंp उसी अंक तक । आखिरकार दोनों अलग हो जाएंगे, और अगर लौटेंगे तोbin(p) आपके बाइनरी नंबर से अधिक है।

पायथन में:

def simulate(p):
    binary_p = float_to_binary(p)
    binary_string = '0.'
    index = 3
    while True:
        binary_string += '0' if random.random() < 0.5 else '1'
        if binary_string != binary_p[:index]:
            return binary_string < binary_p[:index]
        index += 1

कुछ प्रमाण:

np.mean([simulate(0.4) for i in range(10000)])

0.4 के बारे में है (हालांकि तेज़ नहीं)


अच्छा जवाब है, लेकिन क्या आप अपने तरीके से समझा सकते हैं 1 तर्कहीन पी के लिए कैसे करें?
AbracaDabra

2
@AbracaDabra की तर्कसंगतता क्यों होगी pमामला?
Glen_b -Reinstate मोनिका

@AbracaDabra: का मूल्य जो भी हो pहोने की संभावना (0,1) तथा (1,0) एक ही हैं, अर्थात् p(1p), इसलिए दूसरे के खिलाफ एक होने की संभावना है 1/2
शीआन

4

मुझे एक सरल समाधान दिखाई देता है, लेकिन इसमें कोई संदेह नहीं है कि इसे करने के कई तरीके हैं, कुछ संभवतः इससे सरल हैं। इस दृष्टिकोण को दो चरणों में विभाजित किया जा सकता है:

  1. समान संभावना वाले दो घटनाओं से उत्पन्न एक अनुचित सिक्का-टॉसिंग प्रक्रिया (विशेष सिक्के के संयोजन और विधि जिसके द्वारा यह संभावना के साथ एक सिर पैदा करने के लिए फेंक दिया जाता है) p)। हम इन दोनों को समान रूप से संभावित घटनाओं को कह सकते हैंH, तथा T। [इसके लिए एक सरल तरीका है जिसमें टॉज़ के जोड़े लेने की आवश्यकता होती हैH=(H,T) तथा T=(T,H) दो समान रूप से संभावित परिणामों का उत्पादन करने के लिए, अन्य सभी परिणामों के साथ फिर से प्रयास करने के लिए एक नई जोड़ी बनाने के लिए अग्रणी।]

  2. अब आप नकली मेले का उपयोग करके दो अवशोषित राज्यों के साथ एक यादृच्छिक चलना उत्पन्न करते हैं। मूल से अवशोषित राज्यों की दूरी (ऊपर एक और उसके नीचे एक) का चयन करके, आप अवशोषण की संभावना को ऊपरी अवशोषक राज्य को पूर्णांकों का वांछित अनुपात कह सकते हैं। विशेष रूप से, यदि आप ऊपरी अवशोषित अवरोध को जगह पर रखते हैंa और निचले एक पर (ba) (और मूल से प्रक्रिया शुरू), और अवशोषण तक यादृच्छिक चलना चलाते हैं, ऊपरी बाधा पर अवशोषण की संभावना है aa+(ba)=ab

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

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