Собесов

Яндекс — Китайские фейерверки: байесовская вероятность

Статистика и теорверУсловная вероятность / BayesСредняяMiddle

Условие

Владимир купил набор из 3 китайских фейерверков. Они выглядят одинаково и перепутаны, но имеют разную надёжность:

  • «Элитный» — вероятность брака 10% (успех 0.9),
  • «Стандарт» — брак 20% (успех 0.8),
  • «Эконом» — брак 40% (успех 0.6).

Владимир наугад достаёт первый фейерверк, поджигает его, и тот успешно сработал. Он решает запустить два оставшихся один за другим.

Какова вероятность того, что и второй, и третий тоже сработают (без брака)? Ответ округлить до тысячных.

Решение

Подход

Сначала используем апостериорные вероятности типа первого фейерверка после наблюдения «успех». По Байесу:

P(тип = T | успех) = P(успех | T) · P(T) / P(успех)

P(успех) = (0.9 + 0.8 + 0.6) / 3 = 2.3 / 3

Тогда:

Тип первого P(тип | успех)
Элитный 0.9 / 2.3
Стандарт 0.8 / 2.3
Эконом 0.6 / 2.3

Если первый — Элитный, то оставшиеся {Стандарт, Эконом}, и нужны оба успеха: 0.8 · 0.6 = 0.48. Если первый — Стандарт, то {Элитный, Эконом}: 0.9 · 0.6 = 0.54. Если первый — Эконом, то {Элитный, Стандарт}: 0.9 · 0.8 = 0.72.

Считаем итог

p_succ_first = (0.9 + 0.8 + 0.6) / 3  # = 2.3/3
post = {"Элит": 0.9 / 2.3, "Стд": 0.8 / 2.3, "Эко": 0.6 / 2.3}
 
remaining_success = {
    "Элит": 0.8 * 0.6,  # 0.48
    "Стд":  0.9 * 0.6,  # 0.54
    "Эко":  0.9 * 0.8,  # 0.72
}
 
ans = sum(post[t] * remaining_success[t] for t in post)
print(round(ans, 3))  # 0.574

Численно: (0.9·0.48 + 0.8·0.54 + 0.6·0.72) / 2.3 = (0.432 + 0.432 + 0.432) / 2.3 = 1.296 / 2.3 ≈ 0.5635.

Округление до тысячных: 0.563 (или 0.564 в зависимости от способа округления — посмотрим точнее).

1.296 / 2.3 = 0.56347826...0.563.

Реализация

from fractions import Fraction
 
probs = [Fraction(9, 10), Fraction(8, 10), Fraction(6, 10)]
 
# Перебираем, кто из трёх был первым
ans = Fraction(0)
total_first_success = sum(probs) / len(probs)
 
for i in range(3):
    pi = probs[i] / 3 / total_first_success  # P(тип i | успех)
    rest = [probs[j] for j in range(3) if j != i]
    ans += pi * rest[0] * rest[1]
 
print(float(ans))  # 0.5634782608695652

Подводные камни

  1. Забыть про апостериор. Если просто умножать 0.8 · 0.6 или среднее (0.9+0.8+0.6)/3 = 0.7666 дважды — это неверно: нет учёта информации, что первый сработал.
  2. Считать, что фейерверк возвращается в коробку. Нет, оставшихся — двое, разных типов.
  3. Округление. «До тысячных» = 3 знака после запятой. 0.563, не 0.5635.

Альтернативы

Можно решать перечислением 3! = 6 порядков: для каждого порядка (t1, t2, t3) считаем P(t1 = успех)·P(t2 = успех)·P(t3 = успех) / P(t1 = успех). Получим то же значение.

Эталонный ответ

P ≈ 0.563 (точно 1.296 / 2.3 ≈ 0.5635).

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти