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-modelHidden-Markov-Modelle mit dem Baum-Welch-(EM-)Algorithmus mit Modellauswahl, Viterbi-Dekodierung fuer Zustandssequenzen und Forward-Backward- Wahrscheinlichkeiten anpassen. Verwenden wenn Beobachtungen von nicht beobachtbaren latenten Zustaenden erzeugt werden, eine Zeitreihe in latente Regime segmentiert werden muss (Marktregime, Sprach-Phoneme, biologisch…
Independent GitHub snapshot · Automated classification · Original documentation governs
Ein Hidden-Markov-Modell (HMM) an sequenzielle Beobachtungsdaten mit dem Baum-Welch-Expectation-Maximization-Algorithmus anpassen, die wahrscheinlichste verborgene Zustandssequenz ueber Viterbi dekodieren und die optimale Anzahl verborgener Zustaende durch Informationskriterien auswaehlen.
| Eingabe | Typ | Beschreibung |
|---|---|---|
observations | Sequenz/Matrix | Beobachtete Datensequenz (univariat oder multivariat) |
n_hidden_states | Integer | Anzahl anzupassender verborgener Zustaende (oder ein Bereich fuer Modellauswahl) |
emission_type | String | Verteilungsfamilie fuer Emissionen: "gaussian", "discrete", "poisson", "multinomial" |
| Eingabe | Typ | Standard | Beschreibung |
|---|---|---|---|
initial_params | Dict | zufaellig/heuristisch | Initiale Uebergangsmatrix, Emissionsparameter und Startwahrscheinlichkeiten |
n_restarts | Integer | 10 | Anzahl zufaelliger Neustarts zur Abschwung lokaler Optima |
max_iterations | Integer | 500 | Maximale EM-Iterationen pro Neustart |
convergence_tol | Float | 1e-6 | Log-Likelihood-Konvergenzschwelle fuer EM |
state_range | Liste von Ints | [n_hidden_states] | Bereich von Zustandsanzahlen fuer Modellauswahl |
covariance_type | String | "full" | Fuer Gauss-Emissionen: "full", "diagonal", "spherical" |
regularization | Float | 1e-6 | Kleine Konstante zur Diagonalen der Kovarianzmatrizen addiert um Singularitaet zu verhindern |
1.1. Die Anzahl verborgener Zustaende K angeben (oder einen Kandidatenbereich fuer Modellauswahl in Schritt 5).
1.2. Die Emissionsverteilungsfamilie basierend auf dem Datentyp waehlen:
1.3. Die Modellkomponenten definieren:
A der Groesse K x K: A[i,j] = P(z_t = j | z_{t-1} = i)theta_k fuer jeden Zustand k: verteilungsspezifisch (z.B. Mittelwert und Kovarianz fuer Gauss)pi: pi[k] = P(z_1 = k)1.4. Verifizieren, dass Beobachtungsdaten korrekt formatiert sind: keine fehlenden Werte in der Sequenz, konsistente Dimensionalitaet und ausreichende Laenge relativ zur Parameteranzahl.
Erwartet: Eine klar spezifizierte HMM-Architektur mit K Zustaenden, einer gewaehlten Emissionsfamilie und sauberen Beobachtungsdaten der Laenge T >> K^2.
Bei Fehler: Wenn Daten fehlende Werte enthalten, imputieren oder betroffene Segmente entfernen. Wenn T relativ zu K zu klein ist, K reduzieren oder mehr Daten beschaffen.
2.1. Initiale Parameter fuer jeden der n_restarts Neustarts erzeugen:
2.2. Fuer den ersten Neustart die K-Means-informierte Initialisierung verwenden (im Allgemeinen der staerkste Start). Fuer nachfolgende Neustarts zufaellige Stoerungen verwenden.
2.3. Verifizieren, dass alle initialen Parameter gueltig sind:
Erwartet: n_restarts Saetze gueltiger Initialparameter, mit mindestens einer datengetriebenen Initialisierung.
Bei Fehler: Wenn K-Means nicht konvergiert, rein zufaellige Initialisierung mit mehr Neustarts verwenden. Wenn Kovarianzmatrizen singulaer sind, die Regularisierungskonstante zur Diagonalen addieren.
3.1. E-Schritt (Forward-Backward-Algorithmus):
alpha[t,k] = P(o_1,...,o_t, z_t=k | Modell) mit der Rekursion berechnen:
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, Modell) berechnen:
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, Modell) berechnen:
gamma[t,k] = alpha[t,k] * beta[t,k] / P(O | Modell)xi[t,i,j] = P(z_t=i, z_{t+1}=j | O, Modell) berechnen.3.2. M-Schritt (Parameterneuschätzung):
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-Likelihood berechnen: log P(O | Modell) = log sum_k(alpha[T,k]). Den Log-Sum-Exp-Trick verwenden, um Unterlauf zu verhindern.
3.4. Skalierung: Skalierte Forward-Backward-Variablen verwenden, um numerischen Unterlauf fuer lange Sequenzen zu verhindern. alpha bei jedem Zeitschritt normalisieren und logarithmische Skalierungsfaktoren akkumulieren.
3.5. E-Schritt und M-Schritt wiederholen, bis die Log-Likelihood-Aenderung unter convergence_tol liegt oder max_iterations erreicht ist.
3.6. Ueber alle Neustarts den Parametersatz mit der hoechsten finalen Log-Likelihood behalten.
Erwartet: Monoton nicht-abnehmende Log-Likelihood ueber Iterationen, konvergierend innerhalb von max_iterations. Finale Parameter sind gueltig (stochastische Matrizen, positiv-definite Kovarianzen).
Bei Fehler: Wenn die Log-Likelihood abnimmt, liegt ein Fehler im E-Schritt oder M-Schritt vor -- Formeln verifizieren. Wenn die Konvergenz sehr langsam ist, bessere Initialisierung versuchen oder max_iterations erhoehen. Wenn die Kovarianz singulaer wird, Regularisierung erhoehen.
4.1. Viterbi-Variablen initialisieren:
delta[1,k] = log(pi[k]) + log(b_k(o_1))psi[1,k] = 0 (kein Vorgaenger)4.2. Vorwaerts rekursieren fuer 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. Terminieren:
z*_T = argmax_k(delta[T,k])max_k(delta[T,k])4.4. Rueckwaerts verfolgen fuer t = T-1,...,1:
z*_t = psi[t+1, z*_{t+1}]4.5. Die dekodierte Zustandssequenz z* = (z*_1, ..., z*_T) und ihre Log-Wahrscheinlichkeit ausgeben.
4.6. Die Viterbi-Pfadwahrscheinlichkeit mit der Gesamtsequenzwahrscheinlichkeit vom Forward-Algorithmus vergleichen, um zu beurteilen, wie dominant der beste Pfad ist.
Erwartet: Eine einzelne wahrscheinlichste Zustandssequenz der Laenge T mit jedem Eintrag in {1,...,K}. Die Viterbi-Log-Wahrscheinlichkeit sollte kleiner oder gleich der Gesamt-Log-Likelihood sein.
Bei Fehler: Wenn der Viterbi-Pfad eine Log-Wahrscheinlichkeit von negativ Unendlich hat, ist eine Uebergangs- oder Emissionswahrscheinlichkeit Null, wo sie es nicht sein sollte. Mindest-Werte hinzufuegen, um log(0) zu verhindern.
5.1. Fuer jede Kandidatenanzahl verborgener Zustaende K in state_range das vollstaendige HMM anpassen (Schritte 2-4).
5.2. Die Anzahl freier Parameter p berechnen:
K * (K - 1) (jede Zeile ist ein Simplex)d Dimensionen: K * (d + d*(d+1)/2))K - 15.3. Informationskriterien berechnen:
BIC = -2 * log_likelihood + p * log(T)AIC = -2 * log_likelihood + 2 * pAICc = AIC + 2*p*(p+1) / (T - p - 1) (Kleinstichproben-Korrektur)5.4. Das Modell mit dem niedrigsten BIC (bevorzugt fuer Konsistenz) oder AIC (bevorzugt fuer Vorhersage) auswaehlen. Beide berichten.
5.5. Ergebnisse tabellarisch darstellen: fuer jedes K Log-Likelihood, Parameteranzahl, BIC, AIC und Konvergenzstatus zeigen.
5.6. Wenn das optimale K am Rand des state_range liegt, den Bereich erweitern und neu anpassen.
Erwartet: Ein klares Minimum in BIC/AIC, das die optimale Anzahl verborgener Zustaende identifiziert. Das ausgewaehlte Modell sollte konvergiert sein und interpretierbare Zustandsbedeutungen haben.
Bei Fehler: Wenn kein klares Minimum existiert (monoton abnehmender BIC), kann das Modell fehlspezifiziert sein -- eine andere Emissionsfamilie in Betracht ziehen. Wenn alle Modelle schlechte Log-Likelihood haben, folgen die Daten moeglicherweise keiner HMM-Struktur.
6.1. Daten in Trainings- und Validierungsmengen aufteilen (z.B. 80/20 oder mehrere Sequenzen verwenden falls verfuegbar).
6.2. Das Modell auf Trainingsdaten anpassen. Log-Likelihood auf zurueckgehaltenen Daten mit dem Forward-Algorithmus berechnen (Parameter nicht neu anpassen).
6.3. Posterior-Dekodierung (Alternative zu Viterbi):
z^_t = argmax_k(gamma[t,k])6.4. Viterbi- und Posterior-Dekodierung vergleichen:
6.5. Zustandsinterpretierbarkeit bewerten:
A) angemessen sind.6.6. Zurueckgehaltene Log-Likelihood pro Beobachtung berechnen und ueber Modellordnungen vergleichen, um die Trainingsmengen-Modellauswahl zu bestaetigen.
Erwartet: Zurueckgehaltene Log-Likelihood ist angemessen nahe an der Trainings-Log-Likelihood (keine schwere Ueberanpassung). Viterbi- und Posterior-Dekodierung stimmen in 90%+ der Zeitschritte ueberein. Zustaende haben unterschiedliche, interpretierbare Emissionsverteilungen.
Bei Fehler: Wenn die zurueckgehaltene Likelihood viel schlechter als die Trainings-Likelihood ist, ueberpasst das Modell -- K reduzieren oder Regularisierung erhoehen. Wenn Zustaende nicht interpretierbar sind, andere Initialisierungen oder eine andere Emissionsfamilie versuchen.
P(O) = sum_k(alpha[T,k]) = sum_k(pi[k] * b_k(o_1) * beta[1,k])O(K + d^2) Parameter hinzu. BIC (nicht nur Likelihood) fuer Modellauswahl verwenden und auf zurueckgehaltenen Daten validieren.