计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
fit-hidden-markov-model【效率与协作】Ajustar modelos ocultos de Markov usando el algoritmo de Baum-Welch (EM) con selección de modelo, decodificación de Viterbi para secuencias de estados y probabilidades forward-backward. Usar cuando las observaciones son generadas por estados latentes no observables, se necesita segmentar una serie temporal en regímenes latentes (regímenes de mercado,…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Ajustar un modelo oculto de Markov (HMM) a datos de observación secuenciales usando el algoritmo de expectativa-maximización de Baum-Welch, decodificar la secuencia de estados ocultos más probable vía Viterbi, y seleccionar el número óptimo de estados ocultos mediante criterios de información.
| Entrada | Tipo | Descripción |
|---|---|---|
observations | secuencia/matriz | Secuencia de datos observados (univariante o multivariante) |
n_hidden_states | entero | Número de estados ocultos a ajustar (o un rango para selección de modelo) |
emission_type | cadena | Familia de distribución para emisiones: "gaussian", "discrete", "poisson", "multinomial" |
| Entrada | Tipo | Defecto | Descripción |
|---|---|---|---|
initial_params | dict | aleatorio/heurístico | Matriz de transición inicial, parámetros de emisión y probabilidades iniciales |
n_restarts | entero | 10 | Número de reinicios aleatorios para mitigar óptimos locales |
max_iterations | entero | 500 | Iteraciones EM máximas por reinicio |
convergence_tol | flotante | 1e-6 | Umbral de convergencia de log-verosimilitud para EM |
state_range | lista de enteros | [n_hidden_states] | Rango de conteos de estados para selección de modelo |
covariance_type | cadena | "full" | Para emisiones gaussianas: "full", "diagonal", "spherical" |
regularization | flotante | 1e-6 | Constante pequeña añadida a la diagonal de matrices de covarianza para prevenir singularidad |
1.1. Especificar el número de estados ocultos K (o un rango candidato para selección de modelo en el Paso 5).
1.2. Elegir la familia de distribución de emisión basándose en el tipo de datos:
1.3. Definir los componentes del modelo:
A de tamaño K x K: A[i,j] = P(z_t = j | z_{t-1} = i)theta_k para cada estado k: específicos de la distribución (ej., media y covarianza para gaussiana)pi: pi[k] = P(z_1 = k)1.4. Verificar que los datos de observación estén correctamente formateados: sin valores faltantes en la secuencia, dimensionalidad consistente y longitud suficiente relativa al número de parámetros.
Esperado: Una arquitectura HMM claramente especificada con K estados, una familia de emisión elegida y datos de observación limpios de longitud T >> K^2.
En caso de fallo: Si los datos contienen valores faltantes, imputar o eliminar los segmentos afectados. Si T es demasiado pequeño relativo a K, reducir K o adquirir más datos.
2.1. Generar parámetros iniciales para cada uno de los n_restarts reinicios:
2.2. Para el primer reinicio, usar la inicialización informada por K-means (generalmente el inicio más fuerte). Para reinicios posteriores, usar perturbaciones aleatorias.
2.3. Verificar que todos los parámetros iniciales sean válidos:
Esperado: n_restarts conjuntos de parámetros iniciales válidos, con al menos una inicialización basada en datos.
En caso de fallo: Si K-means falla en converger, usar inicialización puramente aleatoria con más reinicios. Si las matrices de covarianza son singulares, agregar la constante de regularización a la diagonal.
3.1. Paso-E (algoritmo Forward-Backward):
alpha[t,k] = P(o_1,...,o_t, z_t=k | modelo) usando la recursión:
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, modelo):
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, modelo):
gamma[t,k] = alpha[t,k] * beta[t,k] / P(O | modelo)xi[t,i,j] = P(z_t=i, z_{t+1}=j | O, modelo).3.2. Paso-M (Re-estimación de parámetros):
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. Calcular log-verosimilitud: log P(O | modelo) = log sum_k(alpha[T,k]). Usar el truco log-sum-exp para prevenir desbordamiento inferior.
3.4. Escalado: Usar variables forward-backward escaladas para prevenir desbordamiento numérico inferior en secuencias largas. Normalizar alpha en cada paso temporal y acumular factores de escalado logarítmicos.
3.5. Repetir Paso-E y Paso-M hasta que el cambio en log-verosimilitud esté por debajo de convergence_tol o se alcance max_iterations.
3.6. A través de todos los reinicios, mantener el conjunto de parámetros con la log-verosimilitud final más alta.
Esperado: Log-verosimilitud monótonamente no decreciente a través de las iteraciones, convergiendo dentro de max_iterations. Los parámetros finales son válidos (matrices estocásticas, covarianzas definidas positivas).
En caso de fallo: Si la log-verosimilitud decrece, hay un error en el Paso-E o Paso-M — verificar las fórmulas. Si la convergencia es muy lenta, intentar mejor inicialización o aumentar max_iterations. Si la covarianza se vuelve singular, aumentar la regularización.
4.1. Inicializar variables de Viterbi:
delta[1,k] = log(pi[k]) + log(b_k(o_1))psi[1,k] = 0 (sin predecesor)4.2. Recurrir hacia adelante para 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. Terminar:
z*_T = argmax_k(delta[T,k])max_k(delta[T,k])4.4. Retroceder para t = T-1,...,1:
z*_t = psi[t+1, z*_{t+1}]4.5. Generar la secuencia de estados decodificada z* = (z*_1, ..., z*_T) y su log-probabilidad.
4.6. Comparar la probabilidad de la ruta de Viterbi con la probabilidad total de la secuencia del algoritmo forward para evaluar cuán dominante es la mejor ruta.
Esperado: Una única secuencia de estados más probable de longitud T con cada entrada en {1,...,K}. La log-probabilidad de Viterbi debería ser menor o igual a la log-verosimilitud total.
En caso de fallo: Si la ruta de Viterbi tiene log-probabilidad de infinito negativo, alguna probabilidad de transición o emisión es cero donde no debería serlo. Agregar valores mínimos para prevenir log(0).
5.1. Para cada número candidato de estados ocultos K en state_range, ajustar el HMM completo (Pasos 2-4).
5.2. Calcular el número de parámetros libres p:
K * (K - 1) (cada fila es un símplex)d dimensiones: K * (d + d*(d+1)/2))K - 15.3. Calcular criterios de información:
BIC = -2 * log_verosimilitud + p * log(T)AIC = -2 * log_verosimilitud + 2 * pAICc = AIC + 2*p*(p+1) / (T - p - 1) (corrección para muestras pequeñas)5.4. Seleccionar el modelo con el BIC más bajo (preferido por consistencia) o AIC (preferido para predicción). Reportar ambos.
5.5. Tabular resultados: para cada K, mostrar log-verosimilitud, número de parámetros, BIC, AIC y estado de convergencia.
5.6. Si el K óptimo está en la frontera de state_range, extender el rango y re-ajustar.
Esperado: Un mínimo claro en BIC/AIC que identifique el número óptimo de estados ocultos. El modelo seleccionado debería haber convergido y tener significados de estado interpretables.
En caso de fallo: Si no existe un mínimo claro (BIC monótonamente decreciente), el modelo puede estar mal especificado — considerar una familia de emisión diferente. Si todos los modelos tienen log-verosimilitud pobre, los datos pueden no seguir una estructura HMM.
6.1. Dividir datos en conjuntos de entrenamiento y validación (ej., 80/20 o usar múltiples secuencias si están disponibles).
6.2. Ajustar el modelo con datos de entrenamiento. Calcular la log-verosimilitud en datos retenidos usando el algoritmo forward (no re-ajustar parámetros).
6.3. Decodificación posterior (alternativa a Viterbi):
z^_t = argmax_k(gamma[t,k])6.4. Comparar decodificación de Viterbi y posterior:
6.5. Evaluar la interpretabilidad de los estados:
A) sean razonables.6.6. Calcular la log-verosimilitud de datos retenidos por observación y comparar a través de órdenes de modelo para confirmar la selección de modelo del conjunto de entrenamiento.
Esperado: La log-verosimilitud de datos retenidos es razonablemente cercana a la log-verosimilitud de entrenamiento (sin sobreajuste severo). La decodificación de Viterbi y posterior coinciden en 90%+ de los pasos temporales. Los estados tienen distribuciones de emisión distintas e interpretables.
En caso de fallo: Si la verosimilitud retenida es mucho peor que la de entrenamiento, el modelo está sobreajustando — reducir K o aumentar la regularización. Si los estados no son interpretables, intentar diferentes inicializaciones o una familia de emisión diferente.
P(O) = sum_k(alpha[T,k]) = sum_k(pi[k] * b_k(o_1) * beta[1,k])O(K + d^2) parámetros. Usar BIC (no solo verosimilitud) para selección de modelo y validar con datos retenidos.