0Pricing
R Academy · Урок

Введение в байесовское мышление

Изучите априорное распределение, функцию правдоподобия и апостериорное распределение в байесовском подходе

«Введение в байесовское мышление» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Частотная и байесовская статистика

В частотной статистике вероятность — это долгосрочная частота события. В байесовской статистике вероятность представляет собой степень уверенности. Главное различие заключается в том, что сторонники частотного подхода считают параметры фиксированными (неизвестными константами), а байесовского — случайными переменными с распределениями вероятностей.

# Frequentist: parameter theta is fixed, data is random
# Bayesian: data is fixed (observed), theta has a distribution

# Example: estimating coin bias p
# Frequentist: MLE -> p_hat = heads / total
heads <- 7; total <- 10
p_mle <- heads / total
cat('MLE estimate:', p_mle, '\n')

# Bayesian: update prior belief with observed data
# Prior: Beta(2, 2) -> slightly informative, centered at 0.5
# Posterior: Beta(2 + heads, 2 + (total - heads)) = Beta(9, 5)
alpha_post <- 2 + heads
beta_post  <- 2 + (total - heads)
p_bayes <- alpha_post / (alpha_post + beta_post)  # posterior mean
cat('Bayesian posterior mean:', round(p_bayes, 3), '\n')

Теорема Байеса

Теорема Байеса связывает априорное представление о параметре, правдоподобие данных при заданном параметре и апостериорное представление после наблюдения данных:

P(θ|data) = P(data|θ) × P(θ) / P(data)

Знаменатель P(data) — нормирующая константа: она превращает апостериорное распределение в корректное распределение вероятностей.

# Bayes' theorem components
# P(theta | data)   = posterior  (what we want)
# P(data  | theta)  = likelihood (how well theta explains data)
# P(theta)          = prior      (what we believed before data)
# P(data)           = evidence   (normalising constant)

# Medical test example
P_disease   <- 0.01   # prior: 1% prevalence
P_pos_given_disease  <- 0.99  # sensitivity
P_pos_given_no_disease <- 0.05  # false positive rate

P_pos <- P_pos_given_disease * P_disease +
         P_pos_given_no_disease * (1 - P_disease)

P_disease_given_pos <- (P_pos_given_disease * P_disease) / P_pos

cat('P(positive test):', round(P_pos, 4), '\n')
cat('P(disease | positive test):', round(P_disease_given_pos, 4), '\n')
cat('Only', round(P_disease_given_pos * 100, 1), '% chance despite positive test!\n')

Априорные распределения

Априорное распределение выражает ваши представления о параметре до получения данных. Априорные распределения могут быть неинформативными (плоскими, отражающими минимальные знания) или информативными (с ярко выраженным пиком, отражающим экспертные знания в предметной области). Распространённые варианты: Beta(1,1) = равномерное распределение, Normal(0, 10) = слабо информативное распределение.

# Visualise different Beta priors for a probability parameter
theta <- seq(0, 1, length.out = 200)

# Uniform (no prior knowledge)
prior_uniform <- dbeta(theta, 1, 1)

# Informative: believe p ~ 0.3
prior_informative <- dbeta(theta, 3, 7)

# Strong: believe p ~ 0.5
prior_strong <- dbeta(theta, 20, 20)

plot(theta, prior_uniform, type = 'l', col = 'gray',
     ylim = c(0, 8), xlab = 'theta', ylab = 'Density',
     main = 'Different Prior Beliefs')
lines(theta, prior_informative, col = 'blue')
lines(theta, prior_strong, col = 'red')
legend('topright', c('Uniform Beta(1,1)', 'Informative Beta(3,7)', 'Strong Beta(20,20)'),
       col = c('gray', 'blue', 'red'), lty = 1)

Функции правдоподобия

Правдоподобие P(data|θ) показывает, насколько вероятны наблюдаемые данные при заданном значении параметра. Для подбрасываний монеты правдоподобие имеет биномиальное распределение. Для непрерывных данных часто используется гауссово распределение. Мы вычисляем правдоподобие для множества значений θ, чтобы найти значение, которое лучше всего объясняет данные.

# Likelihood for a coin flip experiment
# Data: 7 heads in 10 flips
heads <- 7; n <- 10

# Evaluate likelihood at many theta values
theta <- seq(0.01, 0.99, length.out = 200)
likelihood <- dbinom(heads, n, theta)

# Maximum likelihood
mle <- theta[which.max(likelihood)]
cat('MLE (max likelihood theta):', mle, '\n')

# Plot the likelihood function
plot(theta, likelihood, type = 'l', col = 'steelblue',
     xlab = 'theta (coin bias)', ylab = 'Likelihood P(7H|theta)',
     main = '7 Heads in 10 Flips: Likelihood')
abline(v = mle, lty = 2, col = 'red')
legend('topleft', paste('MLE =', mle), lty = 2, col = 'red')

Апостериорное распределение = априорное распределение × правдоподобие

Апостериорное распределение пропорционально произведению априорного распределения и правдоподобия. Для бета-биномиальной модели это можно вычислить аналитически: если априорное распределение имеет вид Beta(α, β), а среди n подбрасываний наблюдается h выпадений орла, апостериорное распределение имеет вид Beta(α + h, β + n − h).

# Beta-Binomial conjugate model
heads <- 7; n <- 10
alpha_prior <- 2; beta_prior <- 2  # prior: Beta(2,2)

# Update: posterior = Beta(alpha + heads, beta + tails)
alpha_post <- alpha_prior + heads
beta_post  <- beta_prior  + (n - heads)

theta <- seq(0.01, 0.99, length.out = 300)

prior     <- dbeta(theta, alpha_prior, beta_prior)
likelihood <- dbinom(heads, n, theta)
likelihood <- likelihood / max(likelihood)  # normalise for plotting
posterior  <- dbeta(theta, alpha_post, beta_post)

plot(theta, posterior,  type = 'l', col = 'red',  lwd = 2,
     xlab = 'theta', ylab = 'Density', main = 'Prior vs Posterior')
lines(theta, prior,      col = 'blue', lwd = 2)
lines(theta, likelihood, col = 'gray', lwd = 2, lty = 2)
legend('topleft', c(paste0('Prior Beta(', alpha_prior, ',', beta_prior, ')'),
                    'Likelihood (scaled)',
                    paste0('Posterior Beta(', alpha_post, ',', beta_post, ')')),
       col = c('blue', 'gray', 'red'), lty = c(1,2,1), lwd = 2)

Сопряжённые априорные распределения

Сопряжённое априорное распределение — это распределение, при котором апостериорное распределение принадлежит тому же семейству, что и априорное. Это упрощает аналитический вывод. Распространённые сопряжённые пары: Beta–Binomial (доли), Normal–Normal (средние при известной дисперсии), Gamma–Poisson (интенсивности).

# Conjugate prior table (analytical results)
conjugates <- data.frame(
  Likelihood    = c('Binomial',    'Poisson',    'Normal (known sigma)',
                    'Exponential', 'Multinomial'),
  Prior         = c('Beta',        'Gamma',      'Normal',
                    'Gamma',       'Dirichlet'),
  Posterior     = c('Beta',        'Gamma',      'Normal',
                    'Gamma',       'Dirichlet'),
  Update_Rule   = c('(a+h, b+t)',  '(a+x, b+n)', '(mu_n, sigma_n)',
                    '(a+n, b+sum)', '(a+counts)')
)
print(conjugates, row.names = FALSE)

# Beta-Binomial update
cat('\nBeta(2,3) + 7 heads, 3 tails -> Beta(',
    2+7, ',', 3+3, ')\n')

Достоверные интервалы

Достоверный интервал (CI) — байесовский аналог доверительного интервала: 95%-ный CI означает, что апостериорная вероятность попадания θ в этот интервал равна 95%. Именно так большинство людей ошибочно интерпретируют доверительные интервалы в частотной статистике.

# 95% credible interval for Beta posterior
alpha_post <- 9; beta_post <- 5  # posterior from earlier

# Credible interval via quantile function
ci_lower <- qbeta(0.025, alpha_post, beta_post)
ci_upper <- qbeta(0.975, alpha_post, beta_post)
posterior_mean <- alpha_post / (alpha_post + beta_post)

cat('Posterior mean: ', round(posterior_mean, 3), '\n')
cat('95% Credible Interval: [',
    round(ci_lower, 3), ',',
    round(ci_upper, 3), ']\n')
cat('Interpretation: 95% probability theta is in this interval\n')

# Visualise
theta <- seq(0, 1, length.out = 300)
plot(theta, dbeta(theta, alpha_post, beta_post), type = 'l', col = 'red', lwd = 2,
     main = '95% Credible Interval', xlab = 'theta', ylab = 'Density')
abline(v = c(ci_lower, ci_upper), lty = 2, col = 'blue')

Байесовское обновление: последовательное обучение

Байесовское обновление является последовательным: сегодняшнее апостериорное распределение становится завтрашним априорным. Благодаря этому байесовский вывод естественным образом выполняется поэтапно — при поступлении новых данных не нужно заново строить модель, достаточно обновить существующее апостериорное распределение.

# Sequential Bayesian updating for a coin
# Start with uninformative prior Beta(1,1)
flips <- c(1, 0, 1, 1, 0, 1, 1, 1, 0, 1)  # 1=H, 0=T

alpha <- 1; beta_p <- 1  # prior
cat('Prior: Beta(', alpha, ',', beta_p, ') mean =', round(alpha/(alpha+beta_p), 3), '\n')

for (i in seq_along(flips)) {
  if (flips[i] == 1) alpha <- alpha + 1 else beta_p <- beta_p + 1
  mean_post <- alpha / (alpha + beta_p)
  cat('After flip', i, '(', flips[i], '): Beta(',
      alpha, ',', beta_p, ') mean =', round(mean_post, 3), '\n')
}

Оценка MAP

Оценка Maximum A Posteriori (MAP) — это мода апостериорного распределения. Для апостериорного распределения Beta(α, β) MAP = (α−1)/(α+β−2). MAP уравновешивает влияние априорного распределения и правдоподобия, смещая оценки в сторону априорного распределения при небольших выборках.

# Compare MLE vs MAP for small sample
heads <- 3; n <- 5
alpha_p <- 5; beta_p <- 5  # informative prior: believe p ~ 0.5

# MLE: ignores prior
mle <- heads / n

# MAP: mode of Beta posterior
alpha_post <- alpha_p + heads
beta_post  <- beta_p  + (n - heads)
map <- (alpha_post - 1) / (alpha_post + beta_post - 2)

# Posterior mean (alternative point estimate)
post_mean <- alpha_post / (alpha_post + beta_post)

cat('Data: 3 heads in 5 flips\n')
cat('MLE:           ', round(mle, 3), '(ignores prior)\n')
cat('MAP:           ', round(map, 3), '(mode of posterior)\n')
cat('Posterior mean:', round(post_mean, 3), '(mean of posterior)\n')
cat('Note: MAP and mean shrink toward prior (0.5) for small n\n')

Когда использовать байесовские методы

Байесовские методы особенно полезны, когда: (1) у вас есть информативные априорные знания, (2) размеры выборок невелики, (3) требуется полная оценка неопределённости, (4) необходимо формулировать вероятностные утверждения о параметрах или (5) вы проводите последовательный анализ, в котором априорные распределения переносятся из предыдущих экспериментов.

# Comparison: when Bayesian vs frequentist is preferred
comparison <- data.frame(
  Scenario = c(
    'Small sample (n < 30)',
    'Prior domain knowledge',
    'Probability about parameter',
    'Sequential updating',
    'Large sample, no prior',
    'Regulatory/simple inference'
  ),
  Preferred = c(
    'Bayesian', 'Bayesian', 'Bayesian',
    'Bayesian', 'Either',   'Frequentist'
  )
)
print(comparison, row.names = FALSE)

# Example: medical device testing with historical data
alpha_historical <- 15  # prior based on 20 historical tests
beta_historical  <- 5
cat('\nHistorical prior: Beta(', alpha_historical, ',', beta_historical, ')\n')
cat('Prior mean:', round(alpha_historical/(alpha_historical+beta_historical), 3), '\n')

Байесовский вывод на практике

Для простых сопряжённых моделей вывод выполняется аналитически (как показано выше). Для сложных моделей (иерархических, несопряжённых) мы используем выборку методом Монте-Карло по цепям Маркова (MCMC) через Stan (RStan), JAGS или BUGS, чтобы численно приблизить апостериорное распределение.

# Analytical vs MCMC approaches
approaches <- data.frame(
  Method        = c('Conjugate (exact)', 'Grid approximation',
                    'Laplace approx.', 'MCMC (Stan/JAGS)',
                    'Variational Bayes'),
  When          = c('Conjugate prior+likelihood', 'Low-dim, discrete',
                    'Unimodal posterior', 'General complex models',
                    'Large scale, approximate'),
  Speed         = c('Instant', 'Fast', 'Fast', 'Slow', 'Moderate'),
  Exactness     = c('Exact', 'Exact on grid', 'Approximate',
                    'Asymptotically exact', 'Approximate')
)
print(approaches, row.names = FALSE)

Быстрая проверка

Вы наблюдаете 7 выпадений орла в 10 подбрасываниях монеты. Ваше априорное распределение — Beta(2, 2). Каким будет правильное апостериорное распределение?

Итоги: байесовское мышление

Основные выводы:

  • Теорема Байеса: P(θ|data) ∝ P(data|θ) × P(θ)
  • Априорное распределение выражает представления до получения данных; правдоподобие — согласованность с данными; апостериорное распределение объединяет оба источника информации
  • Сопряжённые априорные распределения дают аналитические апостериорные распределения (Beta–Binomial, Normal–Normal, Gamma–Poisson)
  • Обновление Beta–Binomial: Beta(α, β) + (h орлов, t решек) → Beta(α+h, β+t)
  • Достоверные интервалы имеют естественную вероятностную интерпретацию, которой нет у доверительных интервалов
  • Байесовское обновление является последовательным: сегодняшнее апостериорное распределение становится завтрашним априорным
  • Для сложных моделей используйте выборку MCMC (Stan, JAGS), чтобы приблизить апостериорные распределения
# Full Bayesian inference cycle for a proportion
alpha0 <- 2; beta0 <- 2  # prior
heads  <- 12; total <- 20  # observed data

alpha_post <- alpha0 + heads
beta_post  <- beta0  + (total - heads)

post_mean  <- alpha_post / (alpha_post + beta_post)
ci         <- qbeta(c(0.025, 0.975), alpha_post, beta_post)

cat('Prior: Beta(', alpha0, ',', beta0, ') mean =', round(alpha0/(alpha0+beta0), 2), '\n')
cat('Data:', heads, 'heads in', total, 'flips\n')
cat('Posterior: Beta(', alpha_post, ',', beta_post, ')\n')
cat('Posterior mean:', round(post_mean, 3), '\n')
cat('95% CI: [', round(ci[1],3), ',', round(ci[2],3), ']\n')

Часто задаваемые вопросы

Урок «Введение в байесовское мышление» бесплатный?

Да — полный текст урока «Введение в байесовское мышление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Введение в байесовское мышление»?

Изучите априорное распределение, функцию правдоподобия и апостериорное распределение в байесовском подходе Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Введение в байесовское мышление»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Введение в байесовское мышление
  2. Написание моделей Stan в R
  3. Выборка MCMC и диагностика
  4. Проверка апостериорных предсказаний
← Назад к R Academy