0Pricing
R Academy · บทเรียน

แนะนำแนวคิดแบบเบย์

ทำความเข้าใจการแจกแจงก่อนหน้า ฟังก์ชันภาวะน่าจะเป็น และการแจกแจงภายหลังในกรอบแบบเบย์

แนะนำแนวคิดแบบเบย์ เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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(α, β) และสังเกตพบผลหัว h ครั้งจากการโยน n ครั้ง การแจกแจงภายหลังคือ 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)

การแจกแจงก่อนแบบสอดคล้อง

การแจกแจงก่อนแบบสอดคล้องคือการแจกแจงก่อนที่การแจกแจงภายหลังอยู่ในตระกูลเดียวกัน ทำให้สามารถอนุมานเชิงวิเคราะห์ได้ คู่การแจกแจงแบบสอดคล้องที่พบบ่อย ได้แก่ เบตา-ทวินาม (สัดส่วน) ปกติ-ปกติ (ค่าเฉลี่ยที่ทราบความแปรปรวน) และแกมมา-ปัวซง (อัตรา)

# 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) เป็นแนวคิดแบบเบย์ที่สอดคล้องกับช่วงความเชื่อมั่น: CI 95% หมายความว่ามีความน่าจะเป็นภายหลัง 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

ค่าประมาณความน่าจะเป็นภายหลังสูงสุด (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)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คุณโยนเหรียญ 10 ครั้งและพบผลหัว 7 ครั้ง การแจกแจงก่อนของคุณคือ Beta(2, 2) การแจกแจงภายหลังที่ถูกต้องคืออะไร

ทบทวน: แนวคิดแบบเบย์

ประเด็นสำคัญ:

  • ทฤษฎีบทของเบย์: P(θ|data) ∝ P(data|θ) × P(θ)
  • การแจกแจงก่อนบันทึกความเชื่อก่อนเห็นข้อมูล ความน่าจะเป็นบันทึกการสนับสนุนจากข้อมูล และการแจกแจงภายหลังรวมทั้งสองอย่างเข้าด้วยกัน
  • การแจกแจงก่อนแบบสอดคล้องให้การแจกแจงภายหลังเชิงวิเคราะห์ (เบตา-ทวินาม ปกติ-ปกติ แกมมา-ปัวซง)
  • การปรับปรุงเบตา-ทวินาม: 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')

คำถามที่พบบ่อย

บทเรียน “แนะนำแนวคิดแบบเบย์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “แนะนำแนวคิดแบบเบย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แนะนำแนวคิดแบบเบย์”

ทำความเข้าใจการแจกแจงก่อนหน้า ฟังก์ชันภาวะน่าจะเป็น และการแจกแจงภายหลังในกรอบแบบเบย์ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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