Условие
Юзеру показали рекламу, он не кликнул. Pre-show prior: «это бот» = 30%. P(не кликнул | бот) = 0.9, P(не кликнул | человек) = 0.7. Какова posterior probability, что он бот?
Решение
Формула Bayes
P(bot | no_click) = P(no_click | bot) × P(bot) / P(no_click)
P(no_click) = 0.9 × 0.3 + 0.7 × 0.7 = 0.27 + 0.49 = 0.76
P(bot | no_click) = 0.9 × 0.3 / 0.76 = 0.27 / 0.76 ≈ 35.5%
Prior 30% → posterior 35.5%. Не-клик слегка усилил подозрение, но не радикально.
Несколько обновлений (sequential)
P(bot | no_click_1) = 35.5%
Если показали ещё раз и снова не кликнул, posterior становится новым prior:
P(no_click) = 0.9 × 0.355 + 0.7 × 0.645 = 0.32 + 0.45 = 0.77
P(bot | 2 не-клика) = 0.9 × 0.355 / 0.77 ≈ 41.5%
Каждый новый сигнал тащит уверенность вверх.
Лог-odds форма
Когда обновлений много, удобнее логарифмическая форма:
log_odds_posterior = log_odds_prior + log(LR)
где LR = P(evidence | bot) / P(evidence | human).
Для нашего примера LR = 0.9 / 0.7 = 1.286, log(LR) = 0.252.
log_odds_prior = log(0.3/0.7) = -0.847
log_odds_post = -0.847 + 0.252 = -0.595
P = e^-0.595 / (1 + e^-0.595) = 0.355
Применения
- Anti-fraud: каждый сигнал умножает odds.
- Customer scoring: history событий → score.
- ML calibration: prior + evidence.
Подводные камни
- Независимость сигналов — обычно нарушается. «Не кликнул 5 раз» не = 5 × log(LR), если события зависимы.
- Prior выбирается субъективно — будьте готовы защитить выбор.
- При очень сильных сигналах (LR > 100) одно обновление меняет картину радикально — проверяйте, что сигнал не баг.
- Posterior 99.99% всё равно не определённость — оставайтесь Bayesian.
- На больших выборках частотный и Bayesian подходы сходятся; на малых — Bayes сильнее зависит от prior.
Эталонный ответ
Posterior = Prior × Likelihood ratio. В лог-odds форме: каждый сигнал добавляет log(LR) к log-odds. Для независимых сигналов — суммируем; для зависимых — нужна модель.