Условие
Вы летите в Москву и хотите решить, стоит ли брать зонт. Звоните трём случайным москвичам и спрашиваете, идёт ли дождь. Каждый говорит правду с вероятностью 3/5 и врёт с вероятностью 2/5. Каждый утверждает, что у него за окном идёт дождь.
Какова вероятность, что действительно идёт дождь? В среднем в Москве 30 дождливых дней за год. Опишите процесс решения.
Решение
Подход
Это классическая байесовская задача. Дано:
- Априорная вероятность дождя: .
- Правдивость каждого: .
Наблюдение: все трое сказали «дождь идёт» — обозначим как событие .
Нужно: — апостериорная вероятность дождя при условии трёх «дождь»-ответов.
Предположение: правдивость трёх москвичей — независимые события, и они отвечают независимо друг от друга.
Реализация — байесовский расчёт
1. Правдоподобие при условии «дождь идёт»
Если действительно дождь, каждый москвич говорит «дождь» когда говорит правду — с вероятностью 3/5. Вероятность всех трёх сказать «дождь»:
2. Правдоподобие при условии «дождя нет»
Если дождя нет, москвич говорит «дождь» только когда врёт — с вероятностью 2/5. Вероятность всех трёх соврать:
3. Полная вероятность события
4. Байесовская формула
Анализ / интерпретация
Ответ: примерно 23%.
Несмотря на то, что три «свидетеля» подтвердили дождь, апостериорная вероятность дождя — всего около 23%. Причина — низкая априорная вероятность () и не очень высокая «правдивость» ().
Если бы каждый говорил правду с вероятностью 90%, ответ был бы:
— уверенность 98.5%. Видим, как чувствительность ответа к «правдивости» свидетеля очень высокая.
Реализация — Python (sanity check симуляцией)
import numpy as np
np.random.seed(42)
N = 1_000_000
prior_rain = 30/365
truth = 3/5
rain = np.random.rand(N) < prior_rain
# Для каждого жителя: говорит правду с p=truth, иначе врёт
# Если дождь и правда → "дождь"; если дождь и врёт → "нет"
# Если нет дождя и правда → "нет"; если нет дождя и врёт → "дождь"
def answers(rain):
a = np.zeros((N, 3), dtype=bool) # True = ответил "дождь"
for i in range(3):
truthful = np.random.rand(N) < truth
a[:, i] = np.where(rain, truthful, ~truthful)
return a
a = answers(rain)
all_say_rain = a.all(axis=1)
posterior = rain[all_say_rain].mean()
print(f"P(R | all 3 said 'rain') ≈ {posterior:.4f}")
# ~0.2321Подводные камни
- Игнорировать априорную вероятность. «Три из трёх сказали — значит, точно дождь». Это интуиция, ломающаяся, когда базовый rate низок (paradox of low base rate).
- Перепутать и . Это не одно и то же: первое — «вероятность увидеть три "дождя", если он идёт», второе — «вероятность дождя, если все трое сказали "дождь"». Это ровно то, для чего нужна теорема Байеса.
- Зависимость москвичей. Условие предполагает независимость их ответов. В реальности это не так: они смотрят в общее окно общей погоды, и если у одного «дождь» — у других вероятнее тоже дождь. Но в задаче москвичи случайные и их ответы условно независимы при заданной погоде — это корректное допущение.
- 30 дней — это база на год, но не на сегодня. В реальности зимой и летом дожди разные. Если бы знали месяц —
priorуточнить. - Бинарность ответа «правду / неправду». В реальности человек может «не быть уверен», окно может быть в крытом помещении и т.п. Задача упрощённая — модель честная.
Эталонный ответ
.
Расчёт: prior , likelihood «дождь» , likelihood «не дождь» , теорема Байеса. Главное — не путать с и учитывать априорную вероятность.