베이지안

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)분산() 추정. 금융 데이터의 변동성 예측
  1. 조건부 독립성 가정 (Conditional Independence Assumption)

    • B와 C가 A라는 조건 하에 **조건부 독립(Conditional Independence)**이라는 가정이 전제되어야 한다.
  2. 전체 확률의 법칙 (Law of Total Probability) 및 상호 배반성

  3. 증거 확률의 비영성 (Non-zero Evidence Probability)

  4. 사전 확률(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)