Files
2nd/10_Wiki/Topics/AI_and_ML/HMM.md
T
Antigravity Agent f8b21af4be Wiki cleanup: error-doc removal, dedup merge, link normalization
10_Wiki/Topics 대규모 정리:
- 오류 캡처/미완성 stub 문서 227개 제거
- 교차폴더 중복 43클러스터 병합 (63파일 → redirect)
- 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건
- 카테고리 MOC 6개 신규 생성
- Graph 섹션 미해결 related-keyword 링크 10,058건 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:52:15 +09:00

5.1 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit tech_stack
wiki-2026-0508-hmm Hidden Markov Model (HMM) 10_Wiki/Topics verified self
HMM
hidden markov model
Viterbi
forward-backward
Baum-Welch
none A 0.95 applied
machine-learning
hmm
sequence
viterbi
baum-welch
speech
2026-05-10 pending
language framework
Python hmmlearn / pomegranate

Hidden Markov Model (HMM)

매 한 줄

"매 hidden state + observable emission 의 의 sequence model". 매 transition + emission probability. 매 Viterbi (MAP), forward-backward (filter), Baum-Welch (EM training). 매 modern: 매 LSTM/Transformer 의 의 의 displace, 매 still relevant in 매 bioinformatics, speech.

매 핵심

매 component

  • States: hidden.
  • Observations: emitted from state.
  • Transition matrix A: state → state.
  • Emission matrix B: state → obs.
  • Initial distribution π.

매 task

  • Evaluation: P(O|λ) — forward.
  • Decoding: best state sequence — Viterbi.
  • Learning: λ from O — Baum-Welch (EM).

매 응용

  1. Speech recognition (legacy, pre-DL).
  2. POS tagging.
  3. Bioinformatics (gene, protein domains).
  4. Finance (regime detection).
  5. Activity recognition.

💻 패턴

hmmlearn

from hmmlearn import hmm
import numpy as np

# 매 Gaussian emissions
model = hmm.GaussianHMM(n_components=3, covariance_type='full', n_iter=100)
model.fit(X_observations)

states = model.predict(X_test)  # 매 Viterbi
log_prob = model.score(X_test)  # 매 forward

Viterbi (manual)

def viterbi(obs, A, B, pi):
    """매 most likely state sequence."""
    n_states = len(pi)
    T = len(obs)
    delta = np.zeros((T, n_states))
    psi = np.zeros((T, n_states), dtype=int)
    
    delta[0] = pi * B[:, obs[0]]
    for t in range(1, T):
        for j in range(n_states):
            trans = delta[t-1] * A[:, j]
            psi[t, j] = trans.argmax()
            delta[t, j] = trans.max() * B[j, obs[t]]
    
    states = [delta[-1].argmax()]
    for t in range(T-1, 0, -1):
        states.insert(0, psi[t, states[0]])
    return states

Forward (P(O|λ))

def forward(obs, A, B, pi):
    n_states = len(pi)
    T = len(obs)
    alpha = np.zeros((T, n_states))
    alpha[0] = pi * B[:, obs[0]]
    for t in range(1, T):
        for j in range(n_states):
            alpha[t, j] = sum(alpha[t-1, i] * A[i, j] for i in range(n_states)) * B[j, obs[t]]
    return alpha[-1].sum()

Backward

def backward(obs, A, B):
    n_states = A.shape[0]
    T = len(obs)
    beta = np.ones((T, n_states))
    for t in range(T-2, -1, -1):
        for i in range(n_states):
            beta[t, i] = sum(A[i, j] * B[j, obs[t+1]] * beta[t+1, j] for j in range(n_states))
    return beta

Baum-Welch (EM)

def baum_welch(obs, n_states, max_iter=100):
    n_obs = len(obs)
    pi = np.random.dirichlet(np.ones(n_states))
    A = np.random.dirichlet(np.ones(n_states), size=n_states)
    n_symbols = max(obs) + 1
    B = np.random.dirichlet(np.ones(n_symbols), size=n_states)
    
    for _ in range(max_iter):
        alpha = compute_alpha(obs, A, B, pi)
        beta = compute_beta(obs, A, B)
        gamma = (alpha * beta) / (alpha * beta).sum(axis=1, keepdims=True)
        xi = compute_xi(obs, A, B, alpha, beta)
        
        # 매 M-step
        pi = gamma[0]
        A = xi.sum(axis=0) / gamma[:-1].sum(axis=0, keepdims=True).T
        for k in range(n_symbols):
            B[:, k] = gamma[obs == k].sum(axis=0) / gamma.sum(axis=0)
    
    return pi, A, B

POS tagging (toy)

states = ['noun', 'verb', 'adj']
words = ['cat', 'eats', 'red', 'apple']
# 매 P(state | word) via HMM

Gaussian Mixture HMM (continuous)

model = hmm.GMMHMM(n_components=4, n_mix=3, covariance_type='full')
model.fit(X)

Regime detection (finance)

returns = stock.pct_change().dropna()
model = hmm.GaussianHMM(n_components=2).fit(returns.values.reshape(-1, 1))
regimes = model.predict(returns.values.reshape(-1, 1))
# 매 0 = bull, 1 = bear (or vice versa — interpret)

매 결정 기준

상황 Use
Sequence + small data HMM
Speech (modern) DL
Bioinformatics Profile HMM
Regime detection Gaussian HMM
Long sequence RNN / Transformer

기본값: 매 small data sequence = HMM. 매 large data = DL. 매 bioinformatics 의 still HMM 의 standard.

🔗 Graph

🤖 LLM 활용

언제: 매 small-data sequence. 매 explainable. 언제 X: 매 modern ML 매 DL win.

안티패턴

  • HMM for image: 매 wrong domain.
  • No prior: 매 EM stuck.
  • Too many states: 매 overfit.

🧪 검증 / 중복

  • Verified (Rabiner 1989, hmmlearn docs).
  • 신뢰도 A.

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — Viterbi / forward-backward / Baum-Welch / hmmlearn code