Gibbs Sampling

Ryu Jihoon·2024년 9월 9일

Gibbs Sampling

Gibbs Sampling다차원 확률 분포에서 샘플을 생성하기 위한 마르코프 연쇄 몬테카를로(MCMC) 기법입니다. 각 변수의 조건부 분포를 순차적으로 샘플링하여 전체 분포에서 샘플을 추출합니다. 복잡한 결합 확률 분포에서 샘플링이 어려울 때 유용하게 사용됩니다.

1. 기본 개념

  • 다차원 확률 분포에서 한 번에 한 변수씩 샘플링.
  • 다른 변수들을 고정한 상태에서 조건부 분포로부터 샘플링.

예시:

x(t+1)P(xy(t))x^{(t+1)} \sim P(x \mid y^{(t)})
y(t+1)P(yx(t+1))y^{(t+1)} \sim P(y \mid x^{(t+1)})

2. Gibbs Sampling 과정

  1. 초기 값 설정: 각 변수에 대해 초기 값을 설정.
  2. 조건부 분포로 샘플링: 나머지 변수들을 고정한 상태에서 한 변수씩 조건부 분포로부터 샘플링.
  3. 반복: 충분히 많은 반복 후 수렴.

3. 장점과 단점

장점:

  • 효율성: 다차원 분포에서 직접 샘플링이 어려운 경우 조건부 분포로 샘플링하여 효율적.
  • MCMC 구현이 간단.

단점:

  • 수렴 속도가 느림.
  • 샘플 간 상호 의존성이 높아 수렴까지 시간이 필요함.

4. 응용 사례

  • 베이지안 네트워크: 조건부 독립성을 이용한 샘플링.
  • 잠재 요인 모델(Latent Factor Models): 베이지안 잠재 디리클레 할당(LDA)에서 활용.
  • 베이지안 추론: 복잡한 사후 분포에서 샘플링.

5. 코드 예시 (Python)

import numpy as np

def gibbs_sampling(iterations, x_init, y_init, sample_cond_x, sample_cond_y):
    x_samples = []
    y_samples = []
    x, y = x_init, y_init

    for i in range(iterations):
        x = sample_cond_x(y)
        x_samples.append(x)
        
        y = sample_cond_y(x)
        y_samples.append(y)

    return x_samples, y_samples

def sample_cond_x(y):
    return np.random.normal(y, 1)  # P(x | y)

def sample_cond_y(x):
    return np.random.normal(x, 1)  # P(y | x)

iterations = 1000
x_samples, y_samples = gibbs_sampling(iterations, 0, 0, sample_cond_x, sample_cond_y)

print(x_samples[:10], y_samples[:10])

2. Stratified K-Fold 교차 검증

Stratified K-Fold분류(classification) 문제에서 주로 사용됩니다. 이 방법은 각 폴드에 데이터가 동일한 비율로 분포되도록 하여 클래스 불균형 문제를 해결하는 데 효과적입니다.

  • 과정:
    • 데이터를 K개의 폴드로 나누되, 각 폴드에 동일한 클래스 비율을 유지합니다.
    • 각 폴드에서 교차 검증을 반복하면서 훈련 및 테스트를 진행합니다.
  • 장점: 불균형한 데이터셋에서도 각 폴드에 클래스가 고르게 분포되도록 할 수 있어, 평가가 더 정확합니다.
  • 사용 사례: 클래스가 불균형한 분류 문제에서 사용됩니다.

Stratified K-Fold 예시 코드

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

# 모델과 데이터 준비
model = LogisticRegression()
X = your_features
y = your_labels

# Stratified K-Fold 적용
strat_k_fold = StratifiedKFold(n_splits=5)

# 교차 검증 실행
scores = cross_val_score(model, X, y, cv=strat_k_fold)

print(f"교차 검증 평균 점수: {scores.mean()}")
profile
CSE Junior

0개의 댓글