Mensimulasikan variabel Bernoulli dengan probabilitas menggunakan koin bias

9

Dapatkah seseorang memberi tahu saya cara mensimulasikan , di mana , menggunakan lemparan koin (sebanyak yang Anda perlukan) dengan ?Bernoulli(ab)a,bNP(H)=p

Saya sedang berpikir untuk menggunakan sampel penolakan, tetapi tidak bisa mengatasinya.

Omong kosong
sumber
1
Apakah ini pertanyaan yang berasal dari kursus atau buku teks? Jika demikian, silakan tambahkan [self-study]tag & baca wiki -nya . Perhatikan bahwa tidak perlu mengajukan permohonan bantuan di akhir pertanyaan Anda - kami tahu bahwa semua orang yang memposting di sini mengharapkan bantuan!
Silverfish
1
Ada posting yang sangat baik oleh @Glen_b di sini di suatu tempat (meskipun saya tidak ingat di mana) tentang mengapa tidak ada yang namanya "koin bias dengan probabilitas ", tapi saya tahu ini hanya masalah kecil untuk pertanyaan Anda! p
Silverfish
2
@dsaxton Pertanyaannya mengatakan "sebanyak yang Anda butuhkan"; itu akan terbatas dengan probabilitas 1, tetapi tidak dibatasi (Anda mungkin melebihi jumlah lemparan tetap) tetapi menolak atas dasar itu akan seperti mengatakan "melemparkan koin yang adil sampai Anda mendapatkan kepala" tidak layak sebagai metode untuk menghasilkan geometris ( angka acak.12
Glen_b -Reinstate Monica
1
@AbracaDabra Apakah ini latihan untuk kelas? Jika tidak, bagaimana ini muncul?
Glen_b -Reinstate Monica
1
@ Glen_b: Ini bukan latihan dari kelas saya. Baru saja terpikir oleh saya dalam rantai pemikiran ini:: Menurut probabilitas klasik, ambil koin yang adil, saat Anda meningkatkan jumlah lemparan, rasio menyatu menjadi setengah. Jadi itu harus benar untuk yang bias juga ... Ini berarti untuk mendapatkan koin untuk bertemu ke nomor tertentu, Anda perlu menjadi nomor itu. Sekarang saya berpikir, bagaimana jika kita ingin menghasilkan nomor, tetapi kita memiliki koin dengan nomor lain (dikenal atau tidak dikenal)? #Heads#tailsP(H)P(H)
AbracaDabra

Jawaban:

8

Karena ada banyak solusi yang tidak terhitung jumlahnya, mari kita cari yang efisien .

Ide di balik ini satu dimulai dengan cara standar untuk menerapkan variabel Bernoulli: membandingkan variabel acak seragam untuk parameter . Saat , kembalikan ; jika tidak, kembalikan .Ua/bU<a/b10

Kita dapat menggunakan -coin sebagai penghasil angka acak yang seragamp . Untuk menghasilkan angka secara seragam dalam interval apa pun , balikkan koin. Ketika head, secara rekursif menghasilkan nilai seragam di bagian pertama dari interval; ketika itu buntut, secara menghasilkan secara rekursif dari bagian terakhir dari interval. Pada titik tertentu, interval target akan menjadi sangat kecil sehingga tidak masalah bagaimana Anda memilih nomor dari itu: itulah cara rekursi dimulai. Jelas prosedur ini menghasilkan variasi yang seragam (hingga presisi yang diinginkan), seperti yang mudah dibuktikan dengan induksi.U[x,y)XpX1p

Ide ini tidak efisien, tetapi mengarah pada metode yang efisien. Karena pada setiap tahap Anda akan menggambar angka dari beberapa interval yang diberikan , mengapa tidak pertama-tama memeriksa apakah Anda perlu menggambar sama sekali? Jika nilai target Anda berada di luar interval ini, Anda sudah tahu hasil perbandingan antara nilai acak dan target. Dengan demikian, algoritma ini cenderung berakhir dengan cepat. (Ini dapat ditafsirkan sebagai prosedur pengambilan sampel penolakan yang diminta dalam pertanyaan.)[x,y)

Kami dapat mengoptimalkan algoritme ini lebih lanjut. Pada tahap apa pun, kita sebenarnya memiliki dua koin yang dapat kita gunakan: dengan memberi label ulang koin kita, kita dapat membuatnya menjadi satu yang berkepala . Oleh karena itu, sebagai perhitungan awal kami dapat secara rekursif memilih mana yang menandai ulang mengarah ke jumlah flips yang diharapkan lebih rendah yang diperlukan untuk penghentian. (Perhitungan ini bisa menjadi langkah mahal.)1p

Misalnya, tidak efisien untuk menggunakan koin dengan untuk mengemulasi variabel Bernoulli secara langsung: dibutuhkan rata-rata hampir sepuluh flips. Tetapi jika kita menggunakan koin, maka hanya dalam dua flips kita pasti akan selesai dan jumlah flips yang diharapkan hanya .p=0.9(0.01)p=10.0=0.11.2

Berikut detailnya.

Partisi setiap interval setengah terbuka ke dalam intervalI=[x,y)

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

Ini mendefinisikan dua transformasi dan yang beroperasi pada interval setengah terbuka.s(,H)s(,T)

Sebagai masalah terminologi, jika adalah kumpulan bilangan real biarkan ungkapanI

t<I

berarti bahwa adalah batas bawah untuk : untuk semua . Demikian pula, berarti adalah batas atas untuk .tIt<xxIt>ItI

Tulis . (Sebenarnya, tidak ada bedanya jika nyata dan bukan rasional; kita hanya memerlukan )a/b=tt0t1

Berikut adalah algoritma untuk menghasilkan varian dengan parameter Bernoulli yang diinginkan:Z

  1. Set dan I n = I 0 = [ 0 , 1 ) .n=0In=I0=[0,1)

  2. While {Aduk koin untuk menghasilkan X n + 1 . Set I n + 1 = S ( I n , X n + 1 ) . Penambahan n .}(tIn)Xn+1In+1=S(In,Xn+1).n

  3. Jika maka atur Z = 1 . Jika tidak, atur Z = 0 .t>In+1Z=1Z=0


Penerapan

Sebagai ilustrasi, berikut ini adalah Rimplementasi dari aloritma sebagai fungsinya draw. Argumennya adalah nilai target dan interval [ x , y ) , awalnya [ 0 , 1 ) . Ini menggunakan fungsi bantu menerapkan . Meskipun tidak perlu, itu juga melacak jumlah lemparan koin. Ini mengembalikan variabel acak, jumlah lemparan, dan interval terakhir yang diperiksa.t[x,y)[0,1)ss

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

Sebagai contoh penggunaan dan uji keakuratannya, ambil case dan . Mari menggambar nilai menggunakan algoritma, melaporkan rata-rata (dan kesalahan standarnya), dan menunjukkan jumlah rata-rata flips yang digunakan.t=1/100p=0.910,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

Dalam simulasi ini flips adalah kepala. Meskipun lebih rendah dari target , skor-Z tidak signifikan: penyimpangan ini dapat dikaitkan dengan kebetulan. Jumlah rata-rata flips adalah - sedikit kurang dari sepuluh. Jika kita menggunakan koin , nilai rata-rata adalah masih tidak jauh berbeda dari target, tetapi hanya flips yang diperlukan rata-rata.0.00950.010.51549.8861p0.00941.177

whuber
sumber
Saya tidak bisa tidak melihat kesamaan antara solusi ini dan Solusi 2 dalam jawaban saya. Sedangkan saya menganggap koin tidak bias (solusi PS benar-benar menarik untuk masalah koin bias), dan melakukan semua perhitungan / perbandingan di basis-2, Anda melakukan semua perhitungan / perbandingan di basis 10. Apa pendapat Anda?
Cam.Davidson.Pilon
1
@cam Saya pikir Anda mungkin tertipu oleh contoh saya: meskipun mereka menggunakan angka yang bagus di basis 10, konstruksi tidak ada hubungannya dengan basis tertentu.
whuber
2
(+1) Resolusi sangat rapi. Optimalisasi berada pada dengan batas atas dan batas oleh kekuatan seperti dan / atau . Akan menyenangkan untuk menemukan dikotomi optimal dalam hal jumlah Bernoullis yang disimulasikan. a/bpn(1p)m(n+mm)pn(1p)m
Xi'an
4

Ini solusinya (agak berantakan, tapi ini tikaman pertamaku). Anda benar-benar dapat mengabaikan dan WLOG menganggap . Mengapa? Ada algoritma pintar untuk menghasilkan flip koin yang tidak bias dari dua membalik koin bias. Jadi kita dapat mengasumsikan .P(H)=pP(H)=1/2P(H)=1/2

Untuk menghasilkan , saya dapat memikirkan dua solusi (yang pertama bukan milik saya, tetapi yang kedua adalah generalisasi):Bernoulli(ab)

Solusi 1

Balikkan koin yang tidak bias kali. Jika kepala tidak hadir, mulai dari awal. Jika kepala yang hadir, kembali apakah koin pertama adalah kepala atau tidak (karena )baaP(first coin is heads | a heads in b coins)=ab

Solusi 2

Ini dapat diperluas ke nilai . Tulis dalam bentuk biner. Misalnya,Bernoulli(p)p0.1=0.0001100110011001100110011...base 2

Kami akan membuat nomor biner baru menggunakan koin membalik. Mulai dengan , dan tambahkan digit tergantung pada apakah kepala (1) atau ekor (0) muncul. Pada setiap flip, bandingkan angka biner baru Anda dengan representasi biner hingga digit yang sama . Akhirnya keduanya akan berbeda, dan kembali jika lebih besar dari nomor biner Anda.0.p bin(p)

Dengan Python:

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

Beberapa bukti:

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

sekitar 0,4 (namun tidak cepat)

Cam.Davidson.Pilon
sumber
Jawaban yang bagus, tetapi bisakah Anda menjelaskan dengan metode Anda 1 bagaimana melakukannya untuk p irasional?
AbracaDabra
2
@AbracaDabra mengapa rasionalitas materi? p
Glen_b -Reinstate Monica
@AbracaDabra: berapapun nilai , probabilitas untuk mendapatkan dan adalah sama, yaitu , maka probabilitas untuk mendapatkan satu terhadap yang lain adalah . p(0,1)(1,0)p(1p)1/2
Xi'an
4

Saya melihat solusi sederhana, tetapi tidak diragukan lagi ada banyak cara untuk melakukannya, beberapa mungkin lebih sederhana dari ini. Pendekatan ini dapat dipecah menjadi dua langkah:

  1. Menghasilkan dari dua peristiwa dengan probabilitas yang sama diberikan prosedur melempar koin yang tidak adil (kombinasi koin tertentu dan metode yang digunakan untuk menghasilkan kepala dengan probabilitas ). Kita dapat menyebut dua peristiwa yang sama-sama berpeluang ini , dan . [Ada pendekatan sederhana untuk ini yang mengharuskan mengambil pasangan lemparan dan untuk menghasilkan dua hasil yang kemungkinannya sama, dengan semua hasil lainnya mengarah pada menghasilkan pasangan baru gulungan untuk mencoba lagi.]pHTH=(H,T)T=(T,H)

  2. Sekarang Anda menghasilkan jalan acak dengan dua negara menyerap menggunakan koin adil yang disimulasikan. Dengan memilih jarak kondisi serapan dari titik asal (satu di atas dan satu di bawahnya), Anda dapat mengatur peluang penyerapan dengan mengatakan kondisi serapan atas menjadi rasio bilangan bulat yang diinginkan. Khususnya, jika Anda menempatkan penghalang penyerap atas di dan yang lebih rendah di (dan memulai proses dari asal), dan menjalankan jalan acak hingga penyerapan, probabilitas penyerapan di penghalang atas adalah .a(ba)aa+(ba)=ab

    (Ada beberapa perhitungan yang harus dilakukan di sini untuk menunjukkannya, tetapi Anda bisa mengeluarkan probabilitas dengan cukup mudah dengan bekerja dengan relasi perulangan ... atau Anda dapat melakukannya dengan menjumlahkan seri tak terbatas ... atau ada cara lain.)

Glen_b -Reinstate Monica
sumber