OPEN HYPER STEP
← 목록으로 (math)
MATH · 42 / 45
math
CHAPTER 42 / 45
읽기 약 2
FUNCTION

베이즈 정리: AI 추론의 수학


핵심 개념

P(A|B) = P(B|A)·P(A)/P(B) — 스팸 필터·의료 진단·추천 시스템의 수학적 기반.

본문

베이즈 정리

📋 코드 (9줄)
P(A|B) = P(B|A) × P(A) / P(B)

용어:
- P(A): 사전확률 (Prior) — 데이터 없을 때 A의 확률
- P(B|A): 우도 (Likelihood) — A일 때 B 관찰 확률
- P(B): 증거 (Evidence) — B가 일어날 확률
- P(A|B): 사후확률 (Posterior) — B 관찰 후 A의 확률

즉: 새 정보로 기존 믿음을 업데이트

의료 진단 예시

PYTHON📋 코드 (20줄)
# 질병 발병률 1% (사전확률)
# 양성 시 진짜 환자 95% (민감도)
# 음성 시 진짜 정상 95% (특이도)

# 양성이 나왔을 때 진짜 환자일 확률은?

p_disease = 0.01            # P(질병)
p_healthy = 1 - p_disease   # P(정상)
p_pos_given_disease = 0.95  # 환자가 양성일 확률 (민감도)
p_pos_given_healthy = 0.05  # 정상이 양성일 확률 (1 - 특이도)

# P(양성) = P(양성|질병)·P(질병) + P(양성|정상)·P(정상)
p_pos = p_pos_given_disease * p_disease + p_pos_given_healthy * p_healthy

# P(질병|양성) = P(양성|질병)·P(질병) / P(양성)
p_disease_given_pos = p_pos_given_disease * p_disease / p_pos
print(f"양성일 때 진짜 환자: {p_disease_given_pos:.4f}")
# 약 0.16 — 양성이어도 16%만 진짜 환자!

# 직관과 매우 다름 — 발병률이 낮으면 위양성이 압도적

사전확률의 중요성

PYTHON📋 코드 (17줄)
# 같은 검사 + 발병률만 다른 경우

def bayes_diagnosis(prior, sensitivity, specificity):
    p_pos = sensitivity * prior + (1 - specificity) * (1 - prior)
    return sensitivity * prior / p_pos


# 발병률별 양성 → 진짜 환자 확률
priors = [0.001, 0.01, 0.1, 0.5]
for p in priors:
    posterior = bayes_diagnosis(p, sensitivity=0.95, specificity=0.95)
    print(f"발병률 {p*100:>4}%: 양성→환자 확률 {posterior*100:.1f}%")

# 발병률  0.1%: 양성→환자 1.9% (거의 안 믿어짐)
# 발병률  1.0%: 양성→환자 16.1%
# 발병률 10.0%: 양성→환자 67.9%
# 발병률 50.0%: 양성→환자 95.0%

나이브 베이즈 분류기 — 스팸 필터

PYTHON📋 코드 (56줄)
import numpy as np

# 학습 데이터
emails = [
    {'text': 'free money urgent', 'label': 'spam'},
    {'text': 'win free vacation', 'label': 'spam'},
    {'text': 'free shipping today', 'label': 'spam'},
    {'text': 'meeting notes attached', 'label': 'ham'},
    {'text': 'project status update', 'label': 'ham'},
    {'text': 'lunch tomorrow free?', 'label': 'ham'},  # free가 정상에도
]


# 단어별 빈도
spam_words = {}
ham_words = {}
spam_count = 0
ham_count = 0

for email in emails:
    words = email['text'].split()
    if email['label'] == 'spam':
        spam_count += 1
        for w in words:
            spam_words[w] = spam_words.get(w, 0) + 1
    else:
        ham_count += 1
        for w in words:
            ham_words[w] = ham_words.get(w, 0) + 1


# P(spam) 사전확률
p_spam_prior = spam_count / (spam_count + ham_count)
p_ham_prior = 1 - p_spam_prior


def classify(text, smoothing=1):
    """나이브 베이즈 — 단어 독립 가정"""
    words = text.split()
    spam_total = sum(spam_words.values()) + smoothing * (len(spam_words) + len(ham_words))
    ham_total = sum(ham_words.values()) + smoothing * (len(spam_words) + len(ham_words))

    log_spam = np.log(p_spam_prior)
    log_ham = np.log(p_ham_prior)

    for w in words:
        log_spam += np.log((spam_words.get(w, 0) + smoothing) / spam_total)
        log_ham += np.log((ham_words.get(w, 0) + smoothing) / ham_total)

    return 'spam' if log_spam > log_ham else 'ham'


# 테스트
print(classify('free urgent shipping'))  # spam
print(classify('meeting today lunch'))   # ham
print(classify('free lunch tomorrow'))   # 모호한 케이스

추천 시스템 — 베이즈 평점 평균

PYTHON📋 코드 (31줄)
# 단순 평균은 표본 적은 항목에 불공정
# 평점 5.0 (1명) > 4.5 (1만명) ?? 베이즈로 보정

import numpy as np

# 글로벌 평균 + 글로벌 평균 무게 m
def bayesian_average(ratings, global_mean, m=10):
    n = len(ratings)
    if n == 0:
        return global_mean
    return (m * global_mean + sum(ratings)) / (m + n)


# 모든 영화 평점
all_ratings = {
    'Movie A': [5.0],                          # 1명만 평점 5
    'Movie B': [4.5] * 100,                    # 100명 평점 4.5
    'Movie C': [4.0, 4.5, 5.0, 4.5, 4.0] * 200, # 1000명 평균 4.4
}

global_mean = np.mean([r for ratings in all_ratings.values() for r in ratings])

print("\n단순 평균 vs 베이즈 평균:")
for movie, ratings in all_ratings.items():
    simple = np.mean(ratings)
    bayes = bayesian_average(ratings, global_mean, m=10)
    print(f"{movie}: 단순 {simple:.2f} | 베이즈 {bayes:.2f} (n={len(ratings)})")

# Movie A: 단순 5.00 | 베이즈 4.59 ← 표본 적어 보수적
# Movie B: 단순 4.50 | 베이즈 4.49 ← 표본 충분, 거의 동일
# Movie C: 단순 4.40 | 베이즈 4.40 ← 표본 매우 많음

다음 챕터

CH.43 "통계 기초" — 평균·중앙값·표준편차로 데이터 요약.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 분류 시스템(스팸/이상치/추천)에
베이즈 정리를 적용하는 가이드와
예상 정확도 향상을 알려줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

한국 의료/보안/금융 시스템의
베이즈 활용 사례 5개를 비교해서
실전 패턴을 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 사용자 데이터로 나이브 베이즈
분류기를 학습시키고 정확도/혼동 행렬을
분석해서 보고해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 LLM의 베이즈 추론 활용과
전통 머신러닝과의 차이를 솔직히 알려줘.

⭐ 이것만 기억하세요
베이즈 정리: AI 추론의 수학 이 3가지만 확실히 잡으세요
1.베이즈 정리는 새 정보로 사전확률을 사후확률로 업데이트 — AI 추론의 핵심
2.발병률 1%에서 95% 정확도 검사도 양성→진짜 환자는 16%뿐 — 사전확률의 영향
3.다음 챕터 CH.43에서 통계 기초 — 평균·중앙값·표준편차 + 정규화


공유하기
진행도 42 / 45