# Fit Hidden Markov Model

> Fit hidden Markov models using the Baum-Welch (EM) algorithm with model selection, Viterbi decoding for state sequences, and forward-backward probabilities. Use when observations are generated by unobservable latent states, you need to segment a time series into latent regimes (market regimes, speech phonemes, biological sequences), compute sequence probabilities, decode the most likely hidden state path, or compare models with different numbers of hidden states.

- Skill: `pjt222/fit-hidden-markov-model-7` (Agent Skill)
- Install (CLI): `npx skillmds@latest add pjt222/fit-hidden-markov-model-7`
- Raw SKILL.md: https://api.skillmd.com/api/skills/pjt222/fit-hidden-markov-model-7/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: MIT
- Author: pjt222 (https://skillmd.com/u/pjt222)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/pjt222/fit-hidden-markov-model-7

---


# 擬隱馬可夫模型

以 Baum-Welch 期望最大化（EM）算法擬隱馬可夫模型（HMM）於序觀察數據、以 Viterbi 解最可能之隱狀序、並藉信息標準擇最優之隱狀數。

## 適用時機

- 察一序發射而生之潛狀不可直接察
- 疑數據由有限之機制間切換之系統生
- 需分時序為潛相（如市場機制、語音音素、生物序列註釋）
- 欲於生成模型下算已察序之概率
- 於所予觀察下需最可能之隱狀序（解碼）
- 為最佳之複雜-擬合權衡比異隱狀數之模型

## 輸入

### 必要

| 輸入 | 類型 | 說明 |
|---|---|---|
| `observations` | 序/矩陣 | 已察數據序（單元或多元） |
| `n_hidden_states` | 整數 | 待擬之隱狀數（或模型選擇之範圍） |
| `emission_type` | 字串 | 發射之分布族：`"gaussian"`、`"discrete"`、`"poisson"`、`"multinomial"` |

### 選擇性

| 輸入 | 類型 | 預設 | 說明 |
|---|---|---|---|
| `initial_params` | dict | 隨機/啟發 | 初始轉移矩陣、發射參數與起始概率 |
| `n_restarts` | 整數 | 10 | 隨機重啟數以緩局部最優 |
| `max_iterations` | 整數 | 500 | 每重啟之最大 EM 迭代數 |
| `convergence_tol` | float | 1e-6 | EM 之對數似然收斂閾 |
| `state_range` | int 清單 | `[n_hidden_states]` | 模型選擇之狀數範圍 |
| `covariance_type` | 字串 | `"full"` | 高斯發射：`"full"`、`"diagonal"`、`"spherical"` |
| `regularization` | float | 1e-6 | 加於協方差矩陣對角以防奇異之小常數 |

## 步驟

### 步驟一：定隱狀與觀察模型

1.1. 指隱狀數 `K`（或步驟五模型選擇之候選範圍）。

1.2. 依數據類型擇發射分布族：
   - 連續數據：高斯（單元或多元）
   - 計數數據：Poisson 或負二項
   - 類別數據：離散/多項

1.3. 定模型組件：
   - **轉移矩陣** `A`，大小 `K x K`：`A[i,j] = P(z_t = j | z_{t-1} = i)`
   - 每狀 `k` 之**發射參數** `theta_k`：分布特定（如高斯之均值與協方差）
   - **初始狀分布** `pi`：`pi[k] = P(z_1 = k)`

1.4. 驗觀察數據正格：序中無缺值、維數一致、長度足於參數數。

**預期：** 清指之 HMM 架構，含 `K` 狀、擇之發射族、淨之觀察數據長 `T >> K^2`。

**失敗時：** 若數據含缺值，補值或移影響之段。若 `T` 相對 `K` 過小，減 `K` 或取更多數據。

### 步驟二：初始化參數

2.1. 為 `n_restarts` 重啟各生初始參數：
   - **轉移矩陣**：隨機隨機矩陣（各行自 Dirichlet 分布抽）或微擾之均勻矩陣。
   - **發射參數**：於觀察上用 K-means 聚類以初始化均值；為高斯發射算聚類方差。
   - **初始分布**：均勻或與 K-means 聚類大小成比例。

2.2. 首重啟用 K-means 知初始化（通常最強起）。後續重啟用隨機擾。

2.3. 驗所有初始參數有效：
   - 轉移矩陣行和為 1 且所有項為正。
   - 發射參數於有效域（如協方差矩陣為正定）。
   - 初始分布和為 1。

**預期：** `n_restarts` 組有效初始參數，至少一數據導之初始化。

**失敗時：** 若 K-means 不收，以純隨機初始化與更多重啟用。若協方差矩陣奇異，加正則常於對角。

### 步驟三：行 Baum-Welch EM 估參數

3.1. **E 步（前向-後向算法）：**
   - 以遞推算前向概率 `alpha[t,k]` = P(o_1,...,o_t, z_t=k | model)：
     - `alpha[1,k] = pi[k] * b_k(o_1)`
     - `alpha[t,k] = sum_j(alpha[t-1,j] * A[j,k]) * b_k(o_t)`
   - 算後向概率 `beta[t,k]` = P(o_{t+1},...,o_T | z_t=k, model)：
     - `beta[T,k] = 1`
     - `beta[t,k] = sum_j(A[k,j] * b_j(o_{t+1}) * beta[t+1,j])`
   - 算狀後驗 `gamma[t,k]` = P(z_t=k | O, model)：
     - `gamma[t,k] = alpha[t,k] * beta[t,k] / P(O | model)`
   - 算轉移後驗 `xi[t,i,j]` = P(z_t=i, z_{t+1}=j | O, model)。

3.2. **M 步（參數重估）：**
   - 更轉移矩陣：`A[i,j] = sum_t(xi[t,i,j]) / sum_t(gamma[t,i])`
   - 以加權充分統計更發射參數：
     - 高斯均值：`mu_k = sum_t(gamma[t,k] * o_t) / sum_t(gamma[t,k])`
     - 高斯協方差：加權散布矩陣加正則
     - 離散：`b_k(v) = sum_t(gamma[t,k] * I(o_t=v)) / sum_t(gamma[t,k])`
   - 更初始分布：`pi[k] = gamma[1,k]`

3.3. 算對數似然：`log P(O | model) = log sum_k(alpha[T,k])`。用 log-sum-exp 伎以防下溢。

3.4. **縮放：** 為長序用縮之前向-後向變以防數值下溢。於每時步歸一 `alpha` 並累對數縮放因子。

3.5. 重 E 步與 M 步至對數似然變低於 `convergence_tol` 或至 `max_iterations`。

3.6. 跨所有重啟，留末對數似然最高之參數組。

**預期：** 跨迭代之單調非降對數似然，於 `max_iterations` 內收。終參有效（隨機矩陣、正定協方差）。

**失敗時：** 若對數似然降，E 步或 M 步有 bug——驗公式。若收很慢，試更佳初始化或增 `max_iterations`。若協方差成奇異，增正則。

### 步驟四：施 Viterbi 解最可能狀序

4.1. 初始化 Viterbi 變：
   - `delta[1,k] = log(pi[k]) + log(b_k(o_1))`
   - `psi[1,k] = 0`（無先）

4.2. 對 `t = 2,...,T` 遞：
   - `delta[t,k] = max_j(delta[t-1,j] + log(A[j,k])) + log(b_k(o_t))`
   - `psi[t,k] = argmax_j(delta[t-1,j] + log(A[j,k]))`

4.3. 終：
   - `z*_T = argmax_k(delta[T,k])`
   - 最佳路對數概率：`max_k(delta[T,k])`

4.4. 對 `t = T-1,...,1` 回追：
   - `z*_t = psi[t+1, z*_{t+1}]`

4.5. 出解碼狀序 `z* = (z*_1, ..., z*_T)` 及其對數概率。

4.6. 比 Viterbi 路概率與自前向算法之總序概率以評最佳路之主宰度。

**預期：** 單一最可能狀序長 `T`，每項於 `{1,...,K}`。Viterbi 對數概率當 <= 總對數似然。

**失敗時：** 若 Viterbi 路對數概率為負無窮，某轉移或發射概率於不當為零處為零。加底值以防 log(0)。

### 步驟五：行模型選擇（跨模型階之 BIC/AIC）

5.1. 對 `state_range` 中每候選隱狀數 `K`，擬全 HMM（步驟二至四）。

5.2. 算自由參數 `p` 之數：
   - 轉移矩陣：`K * (K - 1)`（每行為單形）
   - 發射參數：依族（如 `d` 維全協方差之高斯：`K * (d + d*(d+1)/2)`）
   - 初始分布：`K - 1`

5.3. 算信息標準：
   - `BIC = -2 * log_likelihood + p * log(T)`
   - `AIC = -2 * log_likelihood + 2 * p`
   - `AICc = AIC + 2*p*(p+1) / (T - p - 1)`（小樣本修正）

5.4. 擇 BIC 最低（偏一致性）或 AIC 最低（偏預測）之模型。報二者。

5.5. 表結果：對每 `K`，示對數似然、參數數、BIC、AIC、收斂狀態。

5.6. 若最優 `K` 於 `state_range` 之界，擴範圍並重擬。

**預期：** BIC/AIC 中之明最小值識最優隱狀數。所擇模型當已收且狀有可解之意。

**失敗時：** 若無明最小（BIC 單調降），模型或誤配——考慮異發射族。若所有模型之對數似然皆差，數據或不循 HMM 結構。

### 步驟六：以保留數據與後驗解碼驗

6.1. 分數據為訓練與驗證集（如 80/20，若可得多序則用之）。

6.2. 於訓練數據擬模型。以前向算法於保留數據算對數似然（勿重擬參數）。

6.3. **後驗解碼**（Viterbi 之替）：
   - 於每時步，指後驗概率最高之狀：`z^_t = argmax_k(gamma[t,k])`
   - 此最大化正確解碼狀之期望數（vs Viterbi 最大化聯合路概率）。

6.4. 比 Viterbi 與後驗解碼：
   - 算二解碼序之一致率。
   - 不一致之區示模糊之狀指。

6.5. 評狀可解性：
   - 察各狀之發射參數（均值、方差、離散分布）。
   - 驗狀對應域語境中有意義之機制。
   - 察（`A` 之對角所隱之）狀駐時合理。

6.6. 算每觀察之保留對數似然並跨模型階比以確訓練集之模型選擇。

**預期：** 保留對數似然合理近於訓練對數似然（無嚴重過擬）。Viterbi 與後驗解碼於 90%+ 之時步上同。狀有明可解之發射分布。

**失敗時：** 若保留似然遠劣於訓練，模型過擬——減 `K` 或增正則。若狀不可解，試異初始化或異發射族。

## 驗證

- 各重啟之 Baum-Welch 迭代上之對數似然單調非降
- 轉移矩陣為行隨機（行和為 1，所有項非負）
- 發射參數於有效域（正定協方差、有效概率分布）
- Viterbi 路對數概率不超總序對數概率
- 於所擇模型階，BIC/AIC 曲線示明最小
- 保留對數似然確模型於訓練集外之通化
- 前向與後向概率算合：`P(O) = sum_k(alpha[T,k]) = sum_k(pi[k] * b_k(o_1) * beta[1,k])`

## 常見陷阱

- **EM 之局部最優**：Baum-Welch 算法收於局部最大，非必全局。恒用多隨機重啟並擇最佳。
- **數值下溢**：前向-後向概率隨序長指數縮。用對數空間算或縮變以防下溢至零。
- **狀過多之過擬**：每額外隱狀加 `O(K + d^2)` 參數。於模型選擇用 BIC（非僅似然）並於保留數據驗。
- **標籤切換**：隱狀僅於置換下可識。跨重啟比模型時，以發射參數配狀，非以索引。
- **退化狀**：狀或崩而僅釋單一觀察（高斯近零方差）。於協方差矩陣正則化防此。
- **混 Viterbi 與後驗解碼**：Viterbi 予單一最佳聯合路；後驗解碼予每時步之最佳邊緣狀。其答異問題且可顯著不一致。
- **忽狀駐時**：標準 HMM 所隱之幾何駐時分布或於有長機制期之數據擬差。若駐時非幾何，考慮隱半 Markov 模型。

## 相關技能

- [Model Markov Chain](../model-markov-chain/SKILL.md) -- 解隱層所依之轉移結構之前置
- [Simulate Stochastic Process](../simulate-stochastic-process/SKILL.md) -- 可生合成 HMM 數據供測試並自已擬模型模以行後驗預測檢

