executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
fit-hidden-markov-modelBaum-Welch(EM)アルゴリズムによる隠れマルコフモデルの適合、モデル選択、 状態系列のViterbiデコーディング、前向き-後ろ向き確率を行う。観測値が観測不能な 潜在状態から生成される時、時系列を潜在レジーム(市場レジーム、音声の音素、生物学的 配列)にセグメント化する必要がある時、系列確率を計算する時、最も可能性の高い隠れ状態 パスをデコーディングする時、または異なる隠れ状態数のモデルを比較する時に使用する。
Independent GitHub snapshot · Automated classification · Original documentation governs
Baum-Welch期待値最大化アルゴリズムを使用して逐次観測データに隠れマルコフモデル(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 | 整数のリスト | [n_hidden_states] | モデル選択のための状態数の範囲 |
covariance_type | 文字列 | "full" | ガウス放出用:"full"、"diagonal"、"spherical" |
regularization | float | 1e-6 | 特異性を防ぐため共分散行列の対角に加える小定数 |
1.1. 隠れ状態数K(またはステップ5のモデル選択のための候補範囲)を指定する。
1.2. データの型に基づいて放出分布族を選択する:
1.3. モデルの構成要素を定義する:
A(サイズK x K):A[i,j] = P(z_t = j | z_{t-1} = i)theta_k(各状態kについて):分布固有(例:ガウスでは平均と共分散)pi:pi[k] = P(z_1 = k)1.4. 観測データが適切にフォーマットされていることを確認する:系列に欠損値がない、次元が一貫している、パラメータ数に対して十分な長さがある。
期待結果: K個の状態、選択された放出族、T >> K^2の長さのクリーンな観測データを持つ明確に指定されたHMMアーキテクチャ。
失敗時: データに欠損値がある場合、補完するか影響を受けるセグメントを除去する。TがKに対して小さすぎる場合、Kを減らすかデータを追加取得する。
2.1. n_restarts回の再開のそれぞれについて初期パラメータを生成する:
2.2. 最初の再開ではK-meansに基づく初期化を使用する(一般に最も強い出発点)。以降の再開ではランダム摂動を使用する。
2.3. すべての初期パラメータが有効であることを確認する:
期待結果: 少なくとも1つのデータ駆動初期化を含む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. 対数尤度の変化がconvergence_tol未満になるかmax_iterationsに達するまでEステップとMステップを繰り返す。
3.6. すべての再開にわたって、最高の最終対数尤度を持つパラメータセットを保持する。
期待結果: 各再開での反復を通じて単調非減少の対数尤度、max_iterations以内の収束。最終パラメータが有効(確率行列、正定値共分散)。
失敗時: 対数尤度が減少する場合、EステップまたはMステップにバグがある -- 数式を検証する。収束が非常に遅い場合、より良い初期化を試すか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パス確率を前向きアルゴリズムからの総系列確率と比較して、最良パスがどの程度支配的かを評価する。
期待結果: 各エントリが{1,...,K}にある長さTの単一の最も可能性の高い状態系列。Viterbi対数確率は総対数尤度以下であるべき。
失敗時: Viterbiパスの対数確率が負の無限大の場合、ゼロであるべきでないところで遷移または放出確率がゼロになっている。log(0)を防ぐためフロア値を追加する。
5.1. state_rangeの各候補隠れ状態数Kについて、完全なHMM(ステップ2-4)を適合する。
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を使用し、ホールドアウトデータで検証する。