fit-hidden-markov-model
について
このスキルは、隠れマルコフモデル(HMM)を時系列データに適合させ、学習にはBaum-Welchアルゴリズム、状態系列の推論にはビタビ復号を使用します。市場の状態や音素などの潜在的なレジームへの系列の分割や、異なる数の隠れ状態を持つモデルの比較を目的としています。主な機能には、情報量基準によるモデル選択、および前向き・後ろ向き確率の計算が含まれます。
クイックインストール
Claude Code
推奨npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/fit-hidden-markov-modelこのコマンドをClaude Codeにコピー&ペーストしてスキルをインストールします
ドキュメント
擬隱馬可夫模型
以 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] = 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。若協方差成奇異,增正則。
步驟四:施 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 * 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]) - 此最大化正確解碼狀之期望數(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 -- 解隱層所依之轉移結構之前置
- Simulate Stochastic Process -- 可生合成 HMM 數據供測試並自已擬模型模以行後驗預測檢
GitHub リポジトリ
関連スキル
content-collections
メタこのスキルは、Content Collections(Markdown/MDXファイルを型安全なデータコレクションに変換するTypeScriptファーストのツール)の本番環境でテストされた設定を提供します。Zodバリデーションによる型安全性を実現し、ブログ、ドキュメントサイト、コンテンツ重視のVite + Reactアプリケーション構築時にご利用ください。Viteプラグインの設定、MDXコンパイルから、デプロイ最適化、スキーマバリデーションまで、すべてを網羅しています。
polymarket
メタこのスキルは、開発者がPolymarket予測市場プラットフォームを活用したアプリケーション構築を可能にします。API統合による取引や市場データの取得に加え、WebSocketを介したリアルタイムデータストリーミングにより、ライブ取引や市場活動を監視できます。取引戦略の実装や、ライブ市場更新を処理するツールの作成にご利用ください。
creating-opencode-plugins
メタこのスキルは、開発者がコマンド、ファイル、LSP操作など25種類以上のイベントタイプにフックするOpenCodeプラグインを作成することを支援します。JavaScript/TypeScriptモジュール向けに、プラグイン構造、イベントAPI仕様、および実装パターンを提供します。カスタムイベント駆動ロジックでOpenCode AIアシスタントのライフサイクルをインターセプト、監視、または拡張する必要がある場合にご利用ください。
sglang
メタSGLangは、高性能なLLMサービングフレームワークであり、RadixAttentionプレフィックスキャッシュを活用したJSON、正規表現、エージェントワークフロー向けの高速で構造化された生成を特長とします。特にプレフィックスが繰り返されるタスクにおいて、大幅に高速な推論を実現し、複雑な構造化出力やマルチターン対話に最適です。制約付きデコードが必要な場合や、広範なプレフィックス共有を伴うアプリケーションを構築する場合は、vLLMなどの代替案ではなくSGLangを選択してください。
