Bernoulli değişkenini olasılıkla simüle eder


9

Birisi bana nasıl benzetileceğini söyleyebilir mi Bernoulli(ab), nerede a,bN, bir bozuk para kullanarak (istediğiniz kadar) P(H)=p ?

Reddetme örneklemesi kullanmayı düşünüyordum ama çivilemedim.


1
Bu aslında bir ders veya ders kitabından gelen bir soru mu? Öyleyse, lütfen [self-study]etiketi ekleyin ve wiki'sini okuyun . Sorunuzun sonunda yardım talebinde bulunmanıza gerek olmadığını unutmayın - burada mesaj gönderen herkesin yardım umduğunu biliyoruz!
Gümüş Balık

1
@Blen_b tarafından burada bir yerde mükemmel bir yazı var (nerede hatırlayamıyorum da) neden "olasılıkla taraflı bir bozuk para" diye bir şey yok p", ancak bunun sorunuzun yalnızca çevresel bir sorunu olduğunu biliyorum!
Silverfish

2
@dsaxton Soru "istediğiniz kadar" diyor; olasılık 1 ile sonlu olacak, ancak sınırlandırılmayacak (sabit herhangi bir fırlatma sayısını aşabilirsiniz), ancak bu temelde itiraz etmek, "bir kafa elde edene kadar adil bir para atmak" demek, geometrik üretmenin bir yöntemi olarak geçerli değildir. (12rastgele sayılar.
Glen_b

1
@AbracaDabra Bu bir sınıf egzersizi mi? Değilse, nasıl ortaya çıkıyor?
Glen_b

1
@ Glen_b: Sınıfımdan bir alıştırma değil. Bu düşünce zincirinde başıma geldi ...: Klasik olasılığa göre, fırlatma sayısını, oranını arttırdıkça adil bir para al#Heads#tailsyarıya yakınsar. Bu yüzden önyargılı olanlar için de doğru olmalı ... Belirli bir sayıya yakınlaşmak için bir bozuk para almak anlamına gelir,P(H)o sayı olmak için. Şimdi düşündüm, ya bir sayı üretmek istiyorsak, ama bir madeni paramız varP(H)başka bir numara (bilinen veya bilinmeyen)?
AbracaDabra

Yanıtlar:


8

Sayılamayacak kadar çok çözüm olduğu için verimli bir çözüm bulalım .

Bunun arkasındaki fikir, bir Bernoulli değişkenini uygulamanın standart bir yoluyla başlar: tek tip rastgele bir değişkeni karşılaştırın U parametreye a/b. Ne zamanU<a/b, dönüş 1; aksi halde geri dön0.

Biz kullanabilirsiniz p-örnek rastgele sayı üreteci olarak para . Sayı oluşturmak içinU herhangi bir aralıkta eşit olarak [x,y), parayı Çevir. Kafalar olduğunda, özyinelemeli olarak eşit bir değer üretinX İlk olarak paralığın bir kısmı; kuyruk olduğunda, özyineli olarak üretmekX sondan 1paralığın bir parçası. Bir noktada hedef aralığı o kadar küçük olur ki, ondan nasıl bir sayı seçeceğiniz önemli değildir: özyineleme bu şekilde başlar. Bu prosedürün, indüksiyonla kolayca kanıtlandığı gibi, tekdüze değişkenler (istenen herhangi bir hassasiyete kadar) oluşturduğu açıktır.

Bu fikir etkili değildir, ancak etkili bir yönteme yol açar. Her aşamada belirli bir aralıktan bir sayı çizeceğiniz için[x,y), neden ilk önce çizmeniz gerekip gerekmediğini kontrol etmiyorsunuz? Hedef değeriniz bu aralığın dışındaysa , rastgele değer ile hedef arasındaki karşılaştırmanın sonucunu zaten biliyorsunuzdur. Böylece, bu algoritma hızla sona ermeye meyillidir. (Bu , soruda istenen ret örnekleme prosedürü olarak yorumlanabilir .)

Bu algoritmayı daha da optimize edebiliriz. Herhangi bir aşamada, aslında kullanabileceğimiz iki jetonumuz var: jetonumuzu yeniden etiketleyerek, şans eseri olan bir paraya dönüştürebiliriz1p. Bu nedenle, bir ön hesaplama olarak, hangi yeniden etiketlemenin sonlandırma için gerekli olan daha düşük sayıdaki döndürmeye yol açacağını yinelemeli olarak seçebiliriz. (Bu hesaplama pahalı bir adım olabilir.)

Örneğin, bozuk para kullanmak p=0.9 Bernoulli'yi taklit etmek(0.01)doğrudan değişken: ortalama olarak yaklaşık on döndürür. Ama eğer birp=10.0=0.1 madeni para, o zaman sadece iki döndürme yapıldığından emin olacağız ve beklenen döndürme sayısı sadece 1.2.

Detaylar burada.

Herhangi bir yarı açık aralığı bölme I=[x,y) aralıklarla

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

Bu iki dönüşümü tanımlar s(,H) ve s(,T) yarı açık aralıklarla çalışan

Bir terminoloji meselesi olarak, I herhangi bir gerçek sayı kümesi ifade izin

t<I

demek istediğim t için bir alt sınır I: t<x hepsi için xI. Benzer şekilde,t>I anlamına geliyor t için bir üst sınır I.

Yazmak a/b=t. (Aslında, eğer fark etmeztrasyonel yerine gerçek; sadece buna ihtiyacımız var0t1.)

İşte bir değişken üretmek için algoritma Z istenen Bernoulli parametresiyle:

  1. Ayarlamak n=0 ve In=I0=[0,1).

  2. Süre (tIn) {Üretmek için jetonu atın Xn+1. AyarlamakIn+1=S(In,Xn+1). artım n.}

  3. Eğer t>In+1 sonra ayarla Z=1. Aksi takdirde,Z=0.


uygulama

Açıklamak gerekirse, burada Raloritmanın bir işlevi olarak uygulanması söz konusudur draw. Argümanları hedef değerdirt ve aralık [x,y), başlangıçta [0,1). Yardımcı fonksiyon suygulamasını kullanırs. Gerek duymasa da, madeni para sayısını da izler. Rastgele değişkeni, fırlatma sayısını ve incelediği son aralığı döndürür.

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))
}

Kullanımının ve doğruluğunun testinin bir örneği olarak, davayı ele alın t=1/100 ve p=0.9. Hadi çizelim10,000 algoritmayı kullanarak değerleri, ortalama (ve standart hatasını) rapor edin ve kullanılan ortalama döndürme sayısını belirtin.

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

Bu simülasyonda 0.0095döndürürlerin kafaları vardı. Hedefinden daha düşük olmasına rağmen0.01, Z puanı 0.5154önemli değildir: bu sapma şansa bağlanabilir. Ortalama döndürme sayısı9.886- ondan biraz daha az. Eğer kullansaydık1p sikke, ortalama olurdu 0.0094--Hedeften önemli ölçüde farklı değil, sadece 1.177 flips ortalama olarak gerekli olurdu.


Cevabımda bu çözüm ve Çözüm 2 arasındaki benzerlikleri göremiyorum. Tarafsız bir madeni para varsayıyorum (PS önyargılı madeni para problemine gerçekten ilginç bir çözüm) ve taban-2'deki tüm hesaplamaları / karşılaştırmaları yaparken, taban 10'daki tüm hesaplamaları / karşılaştırmaları yaparsınız.
Cam.Davidson.Pilon

1
@cam Örneklerim tarafından aldatılabileceğinizi düşünüyorum: taban 10'da güzel sayılar kullanmasına rağmen, inşaatın belirli bir bazla hiçbir ilgisi yok.
whuber

2
(+1) Çok düzgün çözünürlük. Optimizasyon üst ve alt sınırda duruyora/b gibi güçler tarafından pn(1p)m ve / veya (n+mm)pn(1p)m. Simüle edilmiş Bernoullis sayısı açısından en uygun ikiliği bulmak güzel olurdu.
Xi'an

5

İşte bir çözüm (dağınık bir çözüm, ama bu benim ilk bıçakım). Aslında yok sayabilirsiniz ve WLOG varsayalım . Neden? İki önyargılı madeni para saygısından tarafsız bir madeni para çevirme üretmek için akıllı bir algoritma vardır . Böylece 1/2 olduğunu varsayabiliriz .P(H)=pP(H)=1/2P(H)=1/2

Bir oluşturmak için iki çözüm düşünebilirim (birincisi benim değil, ikincisi bir genellemedir):Bernoulli(ab)

Çözüm 1

Tarafsız parayı çevirin bzamanlar. Eğerakafalar mevcut değil, baştan başla. Eğerakafaları vardır (nedeniyle ilk para bir heads olup dönüş olup, buP(first coin is heads | a heads in b coins)=ab)

Çözüm 2

Bu herhangi bir değere genişletilebilir Bernoulli(p). Yazmakpikili biçimde. Örneğin,0.1=0.0001100110011001100110011...base 2

Bozuk para kullanarak yeni bir ikili sayı oluşturacağız. İle başla0.ve bir kafa (1) veya kuyruk (0) görünmesine bağlı olarak rakam ekleyin. Her kapakta, yeni ikili numaranızı,p aynı basamağa kadar . Sonunda ikisi birbirinden ayrılacak ve eğerbin(p) ikili numaranızdan büyük.

Python'da:

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

Bazı kanıtlar:

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

yaklaşık 0.4 (hızlı değil)


Güzel cevap, ancak yöntem 1 ile irrasyonel p için nasıl yapılacağını açıklayabilir misiniz?
Abracadabra

2
@AbracaDabra neden rasyonalite pÖnemli olmak?
Glen_b

@AbracaDabra: değeri ne olursa olsun p, elde etme olasılığı (0,1) ve (1,0) aynı, yani p(1p)dolayısıyla birini diğerine karşı alma olasılığı 1/2.
Xi'an

4

Basit bir çözüm görüyorum, ancak şüphesiz bunu yapmanın birçok yolu var, bazıları muhtemelen bundan daha basit. Bu yaklaşım iki adıma ayrılabilir:

  1. Eşit olmayan bir madeni para atma prosedürü (belirli madalyonun kombinasyonu ve olasılıkla bir kafa üretme yönteminin kombinasyonu) eşit olasılıkla iki olaydan üretilir p). Bu iki eşit olay olabilirH, ve T. [Bunun için çiftler fırlatmayı gerektiren basit bir yaklaşım varH=(H,T) ve T=(T,H) eşit derecede olası iki sonuç üretmek için, diğer tüm sonuçlar tekrar denemek için yeni bir çift rulo üretilmesine yol açar.]

  2. Simüle edilmiş adil parayı kullanarak iki emici durumla rastgele bir yürüyüş oluşturuyorsunuz. Emici durumların başlangıç ​​noktasından uzaklığını (bir üst ve bir alt) seçerek, üst emme durumunun istenen tamsayı oranı olduğunu söyleyerek emilim şansını ayarlayabilirsiniz. Özellikle, üst emici bariyeria ve altta (ba) (ve süreci başlangıç ​​noktasından başlatın) ve emilim kadar rastgele yürüyüşü çalıştırın, üst bariyerdeki emilim olasılığı aa+(ba)=ab.

    (Burada göstermek için bazı hesaplamalar var, ancak rekürrens ilişkileri ile çalışarak olasılıkları kolayca elde edebilirsiniz ... ya da sonsuz serileri toplayarak yapabilirsiniz ... ya da başka yollar var.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.