
머신러닝
Bayesian Inference베이즈 추론
베이즈 추론(Bayesian Inference)은 사전 믿음(prior)을 데이터로 갱신하여 사후 확률(posterior)을 구하는 확률적 추론 체계다. 불확실성을 명시적으로 다루며 베이즈 정리를 기반으로 한다.
베이즈 정리
P(θ|X) = P(X|θ) · P(θ) / P(X)
P(θ|X) : 사후 확률 (posterior) — 데이터를 본 후의 믿음
P(X|θ) : 우도 (likelihood) — 파라미터가 θ일 때 X를 관측할 확률
P(θ) : 사전 확률 (prior) — 데이터를 보기 전의 믿음
P(X) : 증거 (evidence) — 정규화 상수
사후 확률 ∝ 우도 × 사전 확률동전 편향 추정 예시
python
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# 베타-이항 켤레 사전분포
# 편향 θ ~ Beta(alpha, beta)
# 관측 X | θ ~ Binomial(n, θ)
# 사후: θ | X ~ Beta(alpha + k, beta + n - k)
def bayesian_coin_update(n_heads, n_tails, prior_alpha=1, prior_beta=1):
"""동전 편향에 대한 베이즈 갱신"""
posterior_alpha = prior_alpha + n_heads
posterior_beta = prior_beta + n_tails
theta = np.linspace(0, 1, 1000)
posterior = stats.beta.pdf(theta, posterior_alpha, posterior_beta)
# 사후 통계량
mean = posterior_alpha / (posterior_alpha + posterior_beta)
ci_95 = stats.beta.interval(0.95, posterior_alpha, posterior_beta)
return {
"posterior_mean": mean,
"credible_interval_95": ci_95,
"alpha": posterior_alpha,
"beta": posterior_beta,
}
# 공정한 사전 (Beta(1,1) = 균등분포)
result = bayesian_coin_update(n_heads=7, n_tails=3)
print(f"사후 평균: {result['posterior_mean']:.3f}")
print(f"95% 신용 구간: [{result['credible_interval_95'][0]:.3f}, {result['credible_interval_95'][1]:.3f}]")나이브 베이즈 분류기
python
from sklearn.naive_bayes import MultinomialNB, GaussianNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline
# 텍스트 분류 (스팸 필터)
pipeline = Pipeline([
('vectorizer', CountVectorizer(ngram_range=(1, 2))),
('classifier', MultinomialNB(alpha=1.0)), # alpha: 라플라스 평활화
])
texts_train = ["무료 당첨 응모", "회의 내일 오전 10시", "로또 당첨 축하"]
labels_train = ["spam", "ham", "spam"]
pipeline.fit(texts_train, labels_train)
print(pipeline.predict(["무료 이벤트 응모 기회"])) # ['spam']