Agent-almanac model-markov-chain
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/es/skills/model-markov-chain" ~/.claude/skills/pjt222-agent-almanac-model-markov-chain-4b6590 && rm -rf "$T"
i18n/es/skills/model-markov-chain/SKILL.mdModel Markov Chain
Construir, clasificar y analizar cadenas de Markov de tiempo discreto o continuo a partir de datos de transición crudos o especificaciones de dominio, produciendo distribuciones estacionarias, tiempos medios de primer paso y validación basada en simulación. Cubre flujos de trabajo DTMC y CTMC de principio a fin.
Cuándo Usar
- Necesitas modelar un sistema cuyo estado futuro depende solo de su estado actual (propiedad sin memoria)
- Tienes conteos o tasas de transición observados entre un conjunto finito de estados
- Quieres calcular probabilidades de estado estacionario a largo plazo para un proceso
- Necesitas determinar tiempos de golpe esperados o probabilidades de absorción
- Estás clasificando estados como transitorios, recurrentes o absorbentes para análisis estructural
- Quieres comparar modelos de Markov alternativos para el mismo sistema
- Estás construyendo una base para modelos más avanzados (modelos ocultos de Markov, MDPs de aprendizaje por refuerzo)
Entradas
Requerido
| Entrada | Tipo | Descripción |
|---|---|---|
| list/vector | Enumeración exhaustiva de todos los estados en la cadena |
| matrix, data frame, o edge list | Conteos de transición crudos, una matriz de probabilidad, o una matriz de tasas (para CTMC) |
| string | Ya sea (DTMC) o (CTMC) |
Opcional
| Entrada | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| vector | uniforme | Probabilidades del estado inicial |
| integer/float | 100 | Número de pasos (DTMC) o unidades de tiempo (CTMC) para simulación |
| float | 1e-10 | Tolerancia de convergencia para cálculos iterativos |
| list | auto-detección | Estados explícitamente marcados como absorbentes |
| list | índices de estado | Nombres legibles para cada estado |
| string | | Método de resolución: , , o |
Procedimiento
Paso 1: Definir espacio de estados y transiciones
1.1. Enumerar todos los estados distintos. Confirmar que la lista es exhaustiva y mutuamente excluyente.
1.2. Si se trabaja desde observaciones crudas, tabular conteos de transición en una matriz de conteos
n x n C donde C[i,j] es el número de transiciones observadas del estado i al estado j.
1.3. Para cadenas de tiempo continuo, recopilar tiempos de permanencia en cada estado junto con los destinos de transición.
1.4. Verificar que ningún estado falta de la enumeración comprobando que cada origen y destino observado aparece en el espacio de estados.
1.5. Documentar la fuente de datos, período de observación, y cualquier filtrado aplicado. Este registro de procedencia es esencial para reproducir el análisis y explicar anomalías.
Esperado: Un espacio de estados bien definido de tamaño
n y ya sea una matriz de conteos o una lista de tuplas (origen, destino, tasa/conteo) cubriendo todas las transiciones observadas. El espacio de estados debe ser suficientemente pequeño para operaciones matriciales (típicamente n < 10000 para métodos densos).
En caso de fallo: Si faltan estados, re-examinar los datos fuente y expandir la enumeración. Si el espacio de estados es demasiado grande para métodos matriciales, considerar agrupar estados raros en un estado agregado "otro" o cambiar a análisis basado en simulación. Si la matriz de conteos es extremadamente dispersa, verificar que el período de observación es suficientemente largo para capturar transiciones típicas.
Paso 2: Construir la matriz de transición o generador
2.1. Tiempo discreto (DTMC): Normalizar cada fila de la matriz de conteos para obtener la matriz de probabilidad de transición
P:
P[i,j] = C[i,j] / sum(C[i,])- Verificar que cada fila suma 1 (dentro de la tolerancia).
2.2. Tiempo continuo (CTMC): Construir la matriz de tasas (generador)
Q:
- Fuera de diagonal:
Q[i,j] = tasa de transición de i a j - Diagonal:
Q[i,i] = -sum(Q[i,j] para j != i) - Verificar que cada fila suma 0 (dentro de la tolerancia).
2.3. Manejar filas con conteo cero (estados nunca observados como orígenes) decidiendo una estrategia de suavizado: suavizado de Laplace, convención de absorción, o marcado para revisión.
2.4. Almacenar la matriz en un formato adecuado para cómputo posterior (denso para cadenas pequeñas, disperso para grandes).
Esperado: Una matriz estocástica válida
P (filas suman 1) o matriz generadora Q (filas suman 0) sin entradas negativas fuera de diagonal en P y sin entradas diagonales positivas en Q.
En caso de fallo: Si las sumas de filas se desvían más allá de la tolerancia, verificar corrupción de datos o problemas de punto flotante. Re-normalizar o re-examinar los datos fuente.
Paso 3: Clasificar estados
3.1. Calcular las clases de comunicación encontrando componentes fuertemente conectados del grafo dirigido inducido por la matriz de transición (solo aristas con probabilidad positiva).
3.2. Para cada clase de comunicación, determinar:
- Recurrente si la clase no tiene aristas salientes hacia otras clases.
- Transitoria si tiene aristas salientes.
- Absorbente si la clase consiste en un solo estado con
.P[i,i] = 1
3.3. Verificar periodicidad para cada clase recurrente calculando el MCD de todas las longitudes de ciclo alcanzables desde cualquier estado en la clase.
- Período = 1 significa aperiódico.
3.4. Determinar si la cadena es irreducible (una sola clase de comunicación) o reducible (múltiples clases).
3.5. Resumir: listar cada clase, su tipo (transitoria/recurrente), su período, y si existen estados absorbentes.
Esperado: Una clasificación completa: cada estado asignado a una clase de comunicación con etiquetas (transitoria, positivamente recurrente, nulamente recurrente, absorbente) y periodicidad.
En caso de fallo: Si el análisis del grafo es inconsistente, verificar que la matriz de transición no tiene entradas negativas y las filas suman correctamente. Para cadenas muy grandes, usar algoritmos de grafos iterativos en lugar de potencias de matriz completas.
Paso 4: Calcular la distribución estacionaria
4.1. Cadena irreducible aperiódica: Resolver
pi * P = pi sujeto a sum(pi) = 1.
- Reformular como
con la restricción de normalización.pi * (P - I) = 0 - Usar descomposición de eigenvalores:
es el eigenvector izquierdo depi
correspondiente al eigenvalor 1, normalizado para sumar 1.P
4.2. Cadena irreducible periódica: La distribución estacionaria todavía existe pero la cadena no converge a ella desde estados iniciales arbitrarios. Calcularla de la misma manera que 4.1.
4.3. Cadena reducible: Calcular la distribución estacionaria para cada clase recurrente independientemente. La distribución estacionaria general es una combinación convexa dependiendo de las probabilidades de absorción desde estados transitorios.
4.4. CTMC: Resolver
pi * Q = 0 con sum(pi) = 1.
4.5. Verificar: multiplicar el
pi calculado por P (o Q) y confirmar que el resultado es igual a pi dentro de la tolerancia.
4.6. Para cadenas reducibles, calcular las probabilidades de absorción desde cada estado transitorio a cada clase recurrente. Estas probabilidades, combinadas con las distribuciones estacionarias por clase, dan el comportamiento a largo plazo condicionado al estado inicial.
4.7. Registrar la brecha espectral (diferencia entre las magnitudes del mayor y segundo mayor eigenvalor). Esta cantidad gobierna la tasa de convergencia a la estacionariedad y es útil para determinar cuántos pasos de simulación se necesitan en el Paso 6.
Esperado: Un vector de probabilidad
pi de longitud n con todas las entradas no negativas, sumando 1, satisfaciendo las ecuaciones de balance dentro de la tolerancia. La brecha espectral debe ser positiva para cadenas irreducibles aperiódicas.
En caso de fallo: Si el solucionador de eigenvalores no converge, intentar el método iterativo de potencias (
pi_k+1 = pi_k * P hasta convergencia). Si múltiples eigenvalores igualan 1, la cadena es reducible -- manejar según el Paso 4.3. Si la brecha espectral es extremadamente pequeña, la cadena mezcla lentamente y requerirá simulaciones muy largas para validación.
Paso 5: Calcular tiempos medios de primer paso
5.1. Definir el tiempo medio de primer paso
m[i,j] como el número esperado de pasos para alcanzar el estado j partiendo del estado i.
5.2. Para una cadena irreducible, resolver el sistema de ecuaciones lineales:
para todom[i,j] = 1 + sum(P[i,k] * m[k,j] para k != j)i != j
(tiempo medio de recurrencia)m[j,j] = 1 / pi[j]
5.3. Para cadenas absorbentes, calcular probabilidades de absorción y tiempos esperados hasta la absorción:
- Particionar
en bloques transitorio (P
) y absorbente.Q_t - Matriz fundamental:
N = (I - Q_t)^{-1} - Pasos esperados hasta absorción:
(vector columna de unos)N * 1 - Probabilidades de absorción:
dondeN * R
es el bloque transitorio-a-absorbente.R
5.4. Para CTMC, reemplazar conteos de pasos con tiempos de permanencia esperados usando la matriz generadora.
5.5. Presentar resultados como una matriz o tabla de tiempos de primer paso por pares para pares de estados clave.
Esperado: Una matriz de tiempos medios de primer paso donde las entradas diagonales igualan los tiempos medios de recurrencia (
1/pi[j]) y las entradas fuera de diagonal son finitas para pares de estados comunicantes.
En caso de fallo: Si el sistema lineal es singular, la cadena tiene estados transitorios que no pueden alcanzar el objetivo. Reportar pares inalcanzables como infinito. Verificar la estructura de la cadena del Paso 3.
Paso 6: Validar con simulación
6.1. Simular
K trayectorias muestrales independientes de la cadena por T pasos cada una, partiendo de la distribución inicial.
6.2. Estimar la distribución estacionaria empíricamente contando frecuencias de ocupación de estados en todas las trayectorias después de descartar un período de quemado.
6.3. Comparar frecuencias simuladas con la distribución estacionaria analítica. Calcular la distancia de variación total o el estadístico chi-cuadrado.
6.4. Estimar tiempos medios de primer paso empíricamente registrando el primer tiempo de golpe para cada estado objetivo a través de réplicas.
6.5. Reportar métricas de concordancia:
- Desviación absoluta máxima entre probabilidades estacionarias analíticas y simuladas.
- Intervalos de confianza del 95% para tiempos de primer paso simulados vs. valores analíticos.
6.6. Si las discrepancias exceden la tolerancia, re-examinar los pasos de construcción de la matriz de transición y clasificación.
Esperado: Distribución estacionaria simulada dentro de 0.01 de distancia de variación total de la solución analítica (para ejecuciones suficientemente largas). Tiempos medios de primer paso simulados dentro del 10% de los valores analíticos.
En caso de fallo: Aumentar la longitud de simulación
T o el número de réplicas K. Si las discrepancias persisten, la solución analítica puede tener errores numéricos -- recalcular con mayor precisión.
Validación
- La matriz de transición
tiene todas las entradas no negativas y cada fila suma 1 (o las filas deP
suman 0 para CTMC)Q - La distribución estacionaria
es un vector de probabilidad válido que satisfacepipi * P = pi - Los tiempos medios de recurrencia igualan
para cada estado recurrente1/pi[j]j - Las frecuencias de estado simuladas convergen a la distribución estacionaria analítica
- La clasificación de estados es consistente: ningún estado recurrente tiene aristas saliendo de su clase de comunicación
- Todos los eigenvalores de
tienen magnitud a lo sumo 1, con exactamente un eigenvalor igual a 1 por clase recurrenteP - Para cadenas absorbentes: las probabilidades de absorción desde cada estado transitorio suman 1 en todas las clases absorbentes
- La matriz fundamental
tiene todas las entradas positivas (los conteos de visitas esperados son positivos)N = (I - Q_t)^{-1} - El balance detallado se cumple si y solo si la cadena es reversible:
para todopi[i] * P[i,j] = pi[j] * P[j,i]i,j
Errores Comunes
- Espacio de estados no exhaustivo: Los estados faltantes producen una matriz sub-estocástica (filas suman menos de 1). Siempre verificar las sumas de filas antes del análisis.
- Confundir DTMC y CTMC: Una matriz de tasas debe tener diagonal no positiva y filas sumando 0. Aplicar fórmulas de DTMC a una matriz de tasas produce sinsentido.
- Ignorar periodicidad: Una cadena periódica tiene una distribución estacionaria válida pero no converge a ella en el sentido usual. El análisis de tiempo de mezcla debe considerar el período.
- Inestabilidad numérica para cadenas grandes: La descomposición de eigenvalores de matrices densas grandes es costosa y puede perder precisión. Usar solucionadores dispersos o métodos iterativos para cadenas con más de unos cientos de estados.
- Transiciones de probabilidad cero: Los ceros estructurales en la matriz de transición pueden hacer la cadena reducible. Verificar irreducibilidad antes de calcular una distribución estacionaria única.
- Longitud de simulación insuficiente: Simulaciones cortas con mezcla pobre producen estimaciones sesgadas. Siempre calcular tamaño de muestra efectivo y verificar gráficos de traza.
- Asumir reversibilidad sin verificar: Muchos atajos analíticos (ej., balance detallado) aplican solo a cadenas reversibles. Verificar
antes de usar resultados dependientes de reversibilidad.pi[i] * P[i,j] = pi[j] * P[j,i] - Acumulación de punto flotante en método de potencias: Iterar
muchas veces acumula errores de redondeo. Re-normalizar periódicamentepi * P
para sumar 1 durante la iteración de potencias.pi
Habilidades Relacionadas
- Fit Hidden Markov Model -- extiende cadenas de Markov a modelos de estados latentes con emisiones observadas
- Simulate Stochastic Process -- marco general de simulación aplicable a trayectorias muestrales de cadenas de Markov y validación Monte Carlo