Hidden Markov Model (HMM)
Un modelo oculto de Markov (HMM) infiere una secuencia de estados ocultos a partir de observaciones ruidosas. Sus parámetros, el algoritmo de Viterbi y sus aplicaciones.
Un modelo oculto de Markov (HMM) es un modelo probabilístico de una secuencia en el que un sistema pasa de un estado a otro sin que estos se puedan observar directamente, y cada estado oculto genera una observación que sí puede observarse. A partir de una secuencia de observaciones, como tramas de audio o letras de ADN, un HMM calcula la probabilidad de cada secuencia de estados ocultos; por ejemplo, los fonemas que hay detrás del audio o las regiones génicas que hay detrás de las letras. «Markov» hace referencia a su supuesto central: el siguiente estado depende solo del estado actual. Leonard Baum y sus colegas desarrollaron la teoría a finales de la década de 1960, y los HMM impulsaron el reconocimiento del habla durante décadas. Al basarse por completo en probabilidades explícitas, siguen siendo una herramienta estándar en el análisis de series temporales y la bioinformática, además de un ejemplo clásico de IA estadística.
Componentes de un HMM#
Un HMM con N estados ocultos se define mediante tres conjuntos de probabilidades:
- Probabilidades iniciales (π): La probabilidad de empezar en cada estado oculto.
- Probabilidades de transición (A): Una matriz N × N cuya entrada
A[i, j]es la probabilidad de pasar del estado i al estado j en un paso, lo que convierte los estados ocultos en una cadena de Markov. - Probabilidades de emisión (B): La probabilidad de cada observación dado el estado actual. Las observaciones discretas utilizan una tabla, y las continuas, como las características acústicas, utilizan distribuciones como las mezclas gaussianas.
Dos supuestos mantienen el modelo manejable: cada estado depende únicamente del estado anterior y cada observación depende únicamente del estado actual. Desplegado en el tiempo, el modelo es una cadena de estados ocultos, cada uno de los cuales emite una observación:
Tres problemas clásicos de los HMM#
El tutorial de 1989 de Lawrence Rabiner, muy citado, organizó el uso de los HMM en torno a tres preguntas. Cada una tiene una solución de programación dinámica cuyo coste crece como N² × T para T observaciones, en lugar de como las Nᵀ secuencias de estados posibles:
- Evaluación: ¿Qué probabilidad tiene una secuencia de observaciones según un modelo dado? El algoritmo hacia delante suma las probabilidades de todos los recorridos ocultos; así, un reconocedor elige el modelo de palabras que mejor explica una emisión.
- Decodificación: ¿Qué secuencia de estados ocultos explica mejor las observaciones? El algoritmo de Viterbi, publicado por Andrew Viterbi en 1967 para decodificar códigos convolucionales, encuentra el recorrido más probable, y el algoritmo hacia delante y hacia atrás da la probabilidad de cada estado en cada paso temporal.
- Aprendizaje: ¿Qué parámetros se ajustan mejor a un conjunto de secuencias de observaciones? El algoritmo de Baum-Welch, un caso de maximización de la esperanza, estima π, A y B a partir de secuencias sin etiquetar. Si las secuencias de estados están etiquetadas, basta con contar las transiciones y las emisiones.
La decodificación de Viterbi se implementa en unas pocas líneas de NumPy. En este modelo, la actividad de una persona —caminar o correr— está oculta, un rastreador comunica una lectura de velocidad por trama y las actividades tienden a mantenerse de una trama a otra:
import numpy as np
states = ["walk", "run"]
start = np.array([0.8, 0.2]) # probabilidades del estado inicial
trans = np.array([[0.9, 0.1], [0.1, 0.9]]) # las actividades tienden a mantenerse entre tramas
emit = np.array([[0.7, 0.25, 0.05], [0.1, 0.3, 0.6]]) # P(velocidad | estado) para lento, medio y rápido
obs = [0, 0, 2, 0, 0, 1, 2, 2, 1, 2] # lecturas de velocidad por trama
# Viterbi: mejor log-probabilidad de alcanzar cada estado, más punteros de retroceso
logp = np.log(start) + np.log(emit[:, obs[0]])
back = []
for o in obs[1:]:
scores = logp[:, None] + np.log(trans) # filas: estado anterior; columnas: estado siguiente
back.append(scores.argmax(axis=0))
logp = scores.max(axis=0) + np.log(emit[:, o])
# Recorre hacia atrás la secuencia de estados más probable desde el mejor estado final
path = [int(logp.argmax())]
for pointers in reversed(back):
path.insert(0, int(pointers[path[0]]))
print("Speeds: ", " ".join(["slow", "medium", "fast"][o] for o in obs))
print("Decoded:", " ".join(states[s] for s in path))Decodifica walk walk walk walk walk run run run run run. La lectura rápida de la trama 3 se mantiene como «caminar», porque cambiar a correr y volver requeriría dos transiciones poco probables, y las lecturas medias de las tramas 6 y 9 pasan a ser «correr» debido a las tramas rápidas que las rodean. Un clasificador por trama que ignorase las transiciones habría etiquetado la trama 3 como carrera.
HMM frente a modelos relacionados#
- Filtro de Kalman: Ejecuta la misma recursión de predicción y actualización para estados continuos con dinámica lineal y ruido gaussiano. El algoritmo hacia delante del HMM es su equivalente para estados discretos.
- Redes bayesianas: Un HMM es la red bayesiana dinámica más sencilla, con una variable oculta y otra observada por paso temporal.
- Proceso de decisión de Markov (MDP): Añade acciones y recompensas a una cadena de Markov con estados observados; es el marco del aprendizaje por refuerzo.
- Redes neuronales recurrentes y transformadores: Aprenden dependencias no lineales a largo plazo a partir de grandes conjuntos de datos y han sustituido a los HMM en la mayoría de las tareas de habla y lenguaje. Los HMM necesitan muchos menos datos y sus probabilidades se pueden consultar directamente.
- Modelos de espacio de estados (SSM): Las capas de aprendizaje profundo, como Mamba, comparten la idea del espacio de estados de la teoría de control y actualizan un vector oculto continuo mediante una dinámica determinista aprendida.
Aplicaciones en el mundo real#
- Reconocimiento del habla: Desde la década de 1980 hasta principios de la de 2010, la mayoría de los reconocedores modelaban cada fonema como un HMM pequeño con emisiones de mezclas gaussianas. Después, las redes neuronales profundas se hicieron cargo del modelo de emisión en los sistemas híbridos y, más adelante, los modelos de extremo a extremo sustituyeron por completo a los HMM.
- Bioinformática: Los HMM de perfil describen familias de secuencias de proteínas o ADN relacionadas. HMMER los utiliza para buscar parientes lejanos en bases de datos de secuencias y es la base de la base de datos de familias de proteínas Pfam; además, los predictores de genes emplean HMM para etiquetar segmentos de un genoma como codificantes o no codificantes.
- Etiquetado de categorías gramaticales: Los primeros sistemas estadísticos de procesamiento del lenguaje natural etiquetaban las palabras como sustantivos, verbos y otras categorías gramaticales mediante la decodificación de Viterbi de secuencias de etiquetas.
- Reconocimiento de actividades: Las secuencias de posturas corporales o lecturas de sensores ponibles se decodifican como actividades, como estar de pie, caminar o caerse. La solución de Ultralytics para supervisar entrenamientos realiza el seguimiento de una secuencia de dos estados de este tipo: etiqueta a cada persona como «arriba» o «abajo» según el ángulo de una articulación en los puntos clave de la estimación de poses de YOLO26; por defecto, usa el codo y cambia de estado por encima de 145° y por debajo de 90°. Cuenta una repetición cada vez que pasa de arriba a abajo.










