协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
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 …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
以 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. 依數據類型擇發射分布族:
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 重啟各生初始參數:
2.2. 首重啟用 K-means 知初始化(通常最強起)。後續重啟用隨機擾。
2.3. 驗所有初始參數有效:
預期: n_restarts 組有效初始參數,至少一數據導之初始化。
失敗時: 若 K-means 不收,以純隨機初始化與更多重啟用。若協方差矩陣奇異,加正則常於對角。
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] = 1beta[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。若協方差成奇異,增正則。
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)。
5.1. 對 state_range 中每候選隱狀數 K,擬全 HMM(步驟二至四)。
5.2. 算自由參數 p 之數:
K * (K - 1)(每行為單形)d 維全協方差之高斯:K * (d + d*(d+1)/2))K - 15.3. 算信息標準:
BIC = -2 * log_likelihood + p * log(T)AIC = -2 * log_likelihood + 2 * pAICc = 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])6.4. 比 Viterbi 與後驗解碼:
6.5. 評狀可解性:
A 之對角所隱之)狀駐時合理。6.6. 算每觀察之保留對數似然並跨模型階比以確訓練集之模型選擇。
預期: 保留對數似然合理近於訓練對數似然(無嚴重過擬)。Viterbi 與後驗解碼於 90%+ 之時步上同。狀有明可解之發射分布。
失敗時: 若保留似然遠劣於訓練,模型過擬——減 K 或增正則。若狀不可解,試異初始化或異發射族。
P(O) = sum_k(alpha[T,k]) = sum_k(pi[k] * b_k(o_1) * beta[1,k])O(K + d^2) 參數。於模型選擇用 BIC(非僅似然)並於保留數據驗。