베이지안
import numpy as np
def update_normal_inverse_gamma(data, mu_0, kappa_0, alpha_0, beta_0):
"""
정규-역감마(Normal-Inverse-Gamma) 결합 사전분포의 파라미터를
새로운 관측 데이터를 통해 사후분포 파라미터로 갱신하는 함수.
"""
n = len(data)
if n == 0:
return mu_0, kappa_0, alpha_0, beta_0
x_bar = np.mean(data)
sum_sq_diff = np.sum((data - x_bar)**2)
# 1. 갱신된 사전표본크기
kappa_n = kappa_0 + n
# 2. 갱신된 사후평균 (사전평균과 표본평균의 가중평균)
mu_n = (kappa_0 * mu_0 + n * x_bar) / kappa_n
# 3. 갱신된 역감마 형상 파라미터
alpha_n = alpha_0 + n / 2.0
# 4. 갱신된 역감마 척도 파라미터
beta_n = beta_0 + 0.5 * sum_sq_diff + (kappa_0 * n * (x_bar - mu_0)**2) / (2.0 * kappa_n)
return mu_n, kappa_n, alpha_n, beta_n
# --- 실행 및 검증 ---
# 사전 평균, 사전 표본 크기, 역감마 분포 형상 파라미터, 역감마 분포 척도 파라미터
mu_0, kappa_0, alpha_0, beta_0 = 100.0, 1.0, 2.0, 256.0
# 2. 신규 관측 데이터
new_data = np.array([120.0])
# 3. 사후분포 파라미터 갱신 수행
mu_n, kappa_n, alpha_n, beta_n = update_normal_inverse_gamma(
new_data, mu_0, kappa_0, alpha_0, beta_0
)
# 4. 결과 출력
print(f"[사전 파라미터] mu: {mu_0:.2f}, kappa: {kappa_0:.2f}, alpha: {alpha_0:.2f}, beta: {beta_0:.2f}")
print(f"[사후 파라미터] mu: {mu_n:.2f}, kappa: {kappa_n:.2f}, alpha: {alpha_n:.2f}, beta: {beta_n:.2f}")# 평균이 𝜃이고 분산이 100인 정규분포
# 사전분포가 100, 256
# 120의 값을 가지는 데이터가 있을 경우 사후평균은?
# mu = \theta
var = 100
mu_prior = 100
var_prior = 256
hatx = 120
n=1
(mu_prior/var_prior + n*hatx/var)/(1/var_prior + n/var)
1/(n/var + 1/var_prior)71.91011235955057
| 우도 (Likelihood) | 켤레 사전분포 (Conjugate Prior) | 사후분포 (Posterior) | 통계적 파라미터 및 주요 적용 사례 |
|---|---|---|---|
| 이항 / 베르누이 (Binomial/Bernoulli) | 베타 (Beta) | 베타 (Beta) | 성공 확률() 추정. 동전 던지기, CTR 예측, A/B 테스트 |
| 다항 (Multinomial) | 디리클레 (Dirichlet) | 디리클레 (Dirichlet) | 카테고리 확률 벡터 추정. 텍스트 분류, 토픽 모델링(LDA) |
| 포아송 (Poisson) | 감마 (Gamma) | 감마 (Gamma) | 발생률() 추정. 트래픽 예측, 콜센터 인입량 모델링 |
| 정규 (Normal) (분산을 알고 있을 때) | 정규 (Normal) | 정규 (Normal) | 평균() 추정. 센서 측정치 오차 보정, 연속형 변수 추론 |
| 정규 (Normal) (평균을 알고 있을 때) | 역감마 (Inverse Gamma) | 역감마 (Inverse Gamma) | 분산() 추정. 금융 데이터의 변동성 예측 |
-
조건부 독립성 가정 (Conditional Independence Assumption)
- B와 C가 A라는 조건 하에 **조건부 독립(Conditional Independence)**이라는 가정이 전제되어야 한다.
-
전체 확률의 법칙 (Law of Total Probability) 및 상호 배반성
-
증거 확률의 비영성 (Non-zero Evidence Probability)
-
사전 확률(Prior Probability)의 정의
마르코프 체인
import numpy as np
# 1. 상태 전이 확률 행렬 P 정의 (예: 3개의 상태 A, B, C)
# 각 행의 합은 1이 되어야 함
P = np.array([
[0.7, 0.2, 0.1], # 상태 A에서 A, B, C로 갈 확률
[0.3, 0.6, 0.1], # 상태 B에서 A, B, C로 갈 확률
[0.2, 0.3, 0.5] # 상태 C에서 A, B, C로 갈 확률
])
# 2. 초기 상태 확률 벡터 pi_0 (예: A 상태에서 시작할 확률 100%)
pi_0 = np.array([1.0, 0.0, 0.0])
# 3. t 시점 후의 상태 확률 계산 (행렬 거듭제곱 활용)
t = 10
# np.linalg.matrix_power를 사용하여 P^t 계산
P_t = np.linalg.matrix_power(P, t)
pi_t = np.dot(pi_0, P_t)
print(f"{t}-Step Transition Probabilities:\n", pi_t)
# 4. 안정 상태 분포(Steady-state Distribution) 계산
# pi = pi * P => pi - pi*P = 0 => pi * (I - P) = 0
# 이 방정식의 해를 찾기 위해 전치행렬 P.T의 고유값과 고유벡터를 이용 (고유값이 1인 고유벡터 탐색)
eigenvalues, eigenvectors = np.linalg.eig(P.T)
# 고유값이 1에 가장 가까운 인덱스 탐색
idx = np.argmin(np.abs(eigenvalues - 1.0))
steady_state_vector = np.real(eigenvectors[:, idx])
# 확률 분포이므로 합이 1이 되도록 정규화
steady_state_vector = steady_state_vector / np.sum(steady_state_vector)
print("\nSteady-state Distribution:\n", steady_state_vector)