Моделюйте змінну Бернуллі з вірогідністю за допомогою упередженої монети


9

Може хтось скаже мені, як імітувати , де a, b \ in \ mathbb {N} , використовуючи викидання монети (стільки разів, скільки потрібно) з P (H) = p ?Bernoulli(ab)a,bNP(H)=p

Я думав використовувати вибірку відхилення, але не зміг її зняти.


1
Це питання спочатку з курсу чи підручника? Якщо так, додайте [self-study]тег і прочитайте його вікі . Зауважте, що не потрібно ставити прохання про допомогу в кінці вашого питання - ми знаємо, що всі, хто тут публікує, сподіваються на допомогу!
Срібна рибка

1
Тут є чудовий пост від @Glen_b (хоча я не можу згадати де) про те, чому немає такого поняття, як "упереджена монета з вірогідністю p ", але я знаю, що це лише периферійна проблема вашого запитання!
Срібна рибка

2
@dsaxton Питання говорить "стільки, скільки вам потрібно"; це буде кінцевим із ймовірністю 1, але не обмеженим (ви можете перевищити будь-яку фіксовану кількість кидків), але заперечувати на цій основі було б як сказати "кидати справедливу монету, поки не отримаєш голову" не є життєздатним як метод генерування геометричних ( 12 випадкові числа.
Glen_b -Встановити Моніку

1
@AbracaDabra Це вправа для заняття? Якщо ні, то як воно виникає?
Glen_b -Встановити Моніку

1
@Glen_b: Це не вправа мого класу. Мені просто прийшло в голову в цьому ланцюжку думок ...: За класичною вірогідністю візьміть справедливу монету, коли ви збільшуєте кількість кидок, відношення до половини. Тож це має бути правдою і для упереджених… Це означає, щоб отримати монету, щоб сходити до певного числа, вам потрібно, щоб було таким числом. Тепер я подумав: що, якщо ми хочемо створити число, але у нас є монета з іншим номером (відомим чи невідомим)? #Heads#tailsP(H)P(H)
AbracaDabra

Відповіді:


8

Оскільки рішень незліченно багато, давайте знайдемо ефективне .

Ідея, що стоїть за цим, починається зі стандартного способу реалізації змінної Бернуллі: порівняння рівномірної випадкової змінної з параметром . Коли , поверніть ; в іншому випадку поверніть .Ua/bU<a/b10

Ми можемо використовувати -coin як рівномірний генератор випадкових чиселp . Щоб генерувати число рівномірно протягом будь-якого інтервалу , переверніть монету. Коли це голови, рекурсивно генерують рівномірне значення у першій частині інтервалу; коли це хвости, рекурсивно генерують з останньої частини інтервалу. В якийсь момент цільовий інтервал стане настільки малим, що насправді не має значення, як ви вибираєте з нього число: саме так починається рекурсія. Очевидно, що ця процедура генерує рівномірні змінні (до будь-якої бажаної точності), що легко довести індукцією.U[x,y)XpX1p

Ця ідея не є ефективною, але призводить до ефективного методу. Оскільки на кожному етапі ви збираєтеся намалювати число з певного інтервалу , чому б спочатку не перевірити, чи потрібно взагалі його малювати? Якщо ваше цільове значення лежить поза цим інтервалом, ви вже знаєте результат порівняння між випадковим значенням і цільовим. Таким чином, цей алгоритм має тенденцію швидко припинятися. (Це може бути витлумачено як процедура відбору проб відхилення, яку вимагає питання.)[x,y)

Ми можемо оптимізувати цей алгоритм далі. На будь-якому етапі ми насправді маємо дві монети, якими ми можемо користуватися: шляхом відновлення нашої монети ми можемо перетворити її в одну, яка є головою з випадковістю . Тому в якості попереднього обчислення ми можемо рекурсивно вибирати те, що пов'язане з маркуванням призводить до меншої очікуваної кількості фліп, необхідних для припинення. (Цей розрахунок може бути дорогим кроком.)1p

Наприклад, неефективно використовувати монету з для емуляції змінної Бернуллі безпосередньо: вона в середньому займає майже десять оборотів. Але якщо ми будемо використовувати монету , то за два перевороти ми впевнені, що буде зроблено, і очікувана кількість фліп - всього .p=0.9(0.01)p=10.0=0.11.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

означає , що є нижньою межею для : для всіх . Аналогічним чином , означає являє собою верхню межу для .tIt<xxIt>ItI

Напишіть . (Насправді це не матиме значення, якщо справжній замість раціонального; нам потрібно лише )a/b=tt0t1

Ось алгоритм отримання змінної з потрібним параметром Бернуллі:Z

  1. Встановіть і .n=0In=I0=[0,1)

  2. Хоча {Киньте монету, щоб отримати . Встановіть Приріст .}(tIn)Xn+1In+1=S(In,Xn+1).n

  3. Якщо тоді задаємо . В іншому випадку встановіть .t>In+1Z=1Z=0


Впровадження

Для ілюстрації тут представлена Rреалізація алоритму як функції draw. Його аргументами є цільове значення та інтервал , спочатку . Він використовує допоміжну функцію, що реалізує . Хоча це і не потрібно, він також відстежує кількість викинутих монет. Він повертає випадкову змінну, кількість викидів та останній інтервал, який вона перевіряла.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))
}

Як приклад його використання та перевірка його точності візьмемо випадок і . Давайте намалюємо значень за допомогою алгоритму, повідомимо про середнє значення (та його стандартну помилку) та вкажемо середню кількість використаних фліп.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

У цьому моделюванні фліп були головами. Хоча нижчий за ціль , Z-бал не суттєвий: це відхилення можна віднести до випадковості. Середня кількість фліп склала - трохи менше десяти. Якби ми використовували монетку, середній було б --still не суттєво відрізняється від мети, але тільки клацання були б необхідні в середньому.0.00950.010.51549.8861p0.00941.177


Я не можу не побачити подібності між цим рішенням та Рішенням 2 у своїй відповіді. В той час, як я припускаю об'єктивну монету (PS дійсно цікаве рішення проблеми упередженої монети), і чи всі розрахунки / порівняння в базі-2, ви робите всі розрахунки / порівняння в базі 10. Які ваші думки?
Cam.Davidson.Pilon

1
@cam Я думаю, що вас можуть обдурити мої приклади: хоча вони використовують хороші числа в базі 10, конструкція не має нічого спільного з якоюсь конкретною базою.
whuber

2
(+1) Дуже акуратна роздільна здатність. Оптимізація стоїть у верхній та нижній межі такими потужностями, як та / або . Було б непогано знайти оптимальну дихотомію за кількістю модельованих Бернуліс. a/bpn(1p)m(n+mm)pn(1p)m
Сіань

5

Ось рішення (трохи безладно, але це мій перший удар). Ви можете фактично ігнорувати і WLOG припустити . Чому? Існує розумний алгоритм для створення об'єктивного відкидання монети з двох упереджених обертів монети. Тож можна припустити .P(H)=pP(H)=1/2P(H)=1/2

Щоб створити , я можу придумати два рішення (перше - це не моє власне, а друге - узагальнення):Bernoulli(ab)

Рішення 1

Переверніть неупереджену монету рази. Якщо голова немає, почніть заново. Якщо голови є присутні, повертають першу монету , чи є голови чи ні (бо )baaP(first coin is heads | a heads in b coins)=ab

Рішення 2

Це може бути розширено до будь-якого значення . Запишіть у двійковій формі. Наприклад,Bernoulli(p)p0.1=0.0001100110011001100110011...base 2

Ми створимо нове двійкове число за допомогою монети фліп. Почніть з І додайте цифри залежно від того, якщо з’являється головка (1) або хвости (0). На кожному фліп порівняйте ваше нове двійкове число з двійковим поданням до однієї і тієї ж цифри . Врешті-решт, вони розійдуться і повернуться, якщо перевищує ваш двійковий номер.0.p bin(p)

На 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

Деякі докази:

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

приблизно 0,4 (але не швидко)


Гарна відповідь, але чи можете ви пояснити своїм методом 1, як це зробити для ірраціонального p?
AbracaDabra

2
@AbracaDabra чому б раціональність мала значення? p
Glen_b -Встановіть Моніку

@AbracaDabra: незалежно від значення , ймовірність отримання та однакова, а саме , отже, ймовірність отримати один проти іншого дорівнює . p(0,1)(1,0)p(1p)1/2
Сіань

4

Я бачу просте рішення, але, без сумніву, є багато способів зробити це, деякі, мабуть, простіші за це. Цей підхід можна розділити на два етапи:

  1. Генерування з двох подій з однаковою ймовірністю дається несправедливою процедурою метання монети (поєднання певної монети та методу, за допомогою якого вона кидається, генеруючи голову з вірогідністю ). Ці дві не менш вірогідні події ми можемо назвати і . [Для цього існує простий підхід, який вимагає проведення пар викидів і для отримання двох однаково вірогідних результатів, при цьому всі інші результати призводять до створення нової пари рулонів, щоб спробувати знову.]pHTH=(H,T)T=(T,H)

  2. Тепер ви генеруєте випадкову прогулянку з двома поглинаючими станами, використовуючи імітовану справедливу монету. Вибравши відстань поглинаючих станів від початку (один вище та один під ним), ви можете встановити шанс поглинання, сказавши, що верхній поглинаючий стан є бажаним співвідношенням цілих чисел. Зокрема, якщо верхній поглинаючий бар'єр розмістити на а нижній на (і почати процес від початку), і запустити випадкову ходу до поглинання, ймовірність поглинання на верхньому бар'єрі дорівнює .a(ba)aa+(ba)=ab

    (Тут потрібно зробити деякі розрахунки, щоб показати це, але ви можете отримати ймовірності досить легко, працюючи з відношеннями рецидивів ... або ви можете це зробити шляхом підсумовування нескінченних рядів ... або є інші способи.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.