WhatsApp

  

Algoritmo de Cadenas de Markov con Álgebra Lineal: Conceptos, Ejemplos en Python y Mejores Prácticas

Aprende a modelar, analizar y simular cadenas de Markov usando álgebra lineal. Incluye teoría, ejemplos completos en Python, comparativas, troubleshooting y buenas prácticas.

Algoritmo de Cadenas de Markov con Álgebra Lineal

1. Introducción

Una cadena de Markov es un proceso estocástico discreto en el tiempo donde la probabilidad de pasar a un estado futuro depende únicamente del estado presente (propiedad de Markov). Cuando se combina con álgebra lineal, la representación matricial permite análisis rápido de propiedades como la distribución estacionaria, tiempos de absorción y convergencia.

2. Fundamentos Matemáticos

2.1. Matriz de transición

Para una cadena con n estados, la matriz de transición P es una matriz n × n donde P[i][j] = Pr(X_{t+1}=j | X_t=i). Cada fila suma 1:

\sum_{j=1}^{n} P_{ij}=1 \quad \forall i

2.2. Distribución de probabilidad del estado

El vector fila π representa la probabilidad de estar en cada estado en el tiempo t. La evolución se calcula como:

\pi^{(t+1)} = \pi^{(t)} P

2.3. Distribución estacionaria

Una distribución π* es estacionaria si satisface:

\pi^* = \pi^* P \quad \text{y} \quad \sum_i \pi^*_i = 1

Esto equivale a encontrar el vector propio asociado al valor propio 1 de P.

3. Comparativa de Representaciones

Representación Implícita (Simulación)

  • Genera trayectorias mediante muestreo aleatorio.
  • Ideal para Monte Carlo y análisis empírico.
  • Requiere gran número de iteraciones para convergencia.

Representación Matricial (Álgebra Lineal)

  • Permite cálculos exactos usando potencias de P o descomposición espectral.
  • Escala bien con n moderado (hasta ~10⁴ usando librerías sparsas).
  • Facilita el análisis de estados absorbentes y tiempos de mezcla.

4. Ejemplos Prácticos en Python

4.1. Instalación de dependencias

pip install numpy scipy matplotlib

4.2. Cadena simple de 3 estados

import numpy as np
# Matriz de transición P (filas = estado actual, columnas = siguiente estado)
P = np.array([
    [0.7, 0.2, 0.1],  # Estado 0
    [0.3, 0.4, 0.3],  # Estado 1
    [0.2, 0.5, 0.3]   # Estado 2
])
# Distribución inicial (comenzamos en el estado 0)
pi = np.array([1.0, 0.0, 0.0])
# Evolución de 10 pasos
for t in range(10):
    pi = pi @ P  # Multiplicación fila × matriz
    print(f"Paso {t+1}: {pi}")

Obsérvese cómo la distribución converge rápidamente a la distribución estacionaria.

4.3. Cálculo de la distribución estacionaria mediante eigenvectors

from scipy.linalg import eig
# Valor propio 1 y su vector propio izquierdo
w, v = eig(P.T)  # transpuesta para obtener vectores fila
idx = np.argmin(np.abs(w - 1))  # índice del valor propio más cercano a 1
pi_star = np.real(v[:, idx])
pi_star /= pi_star.sum()  # normalizar
print("Distribución estacionaria:", pi_star)

4.4. Cadena absorbente (modelo de Gambler's Ruin)

import numpy as np
import matplotlib.pyplot as plt
# Parámetros
N = 5  # estados 0..N (0 y N son absorbentes)
P = np.zeros((N+1, N+1))
for i in range(1, N):
    P[i, i-1] = 0.5  # pierde 1 unidad
    P[i, i+1] = 0.5  # gana 1 unidad
P[0,0] = 1.0
P[N,N] = 1.0
# Probabilidad de absorción en N empezando en i
Q = P[1:N, 1:N]                # submatriz transitoria
R = P[1:N, [0, N]]             # transiciones a estados absorbentes
I = np.eye(Q.shape[0])
N_mat = np.linalg.inv(I - Q)   # matriz fundamental
B = N_mat @ R                  # probabilidades de absorción
print("Probabilidad de llegar a N desde cada estado transitorio:")
print(B[:,1])
# Visualización del proceso
state = 2
traj = [state]
while state not in (0, N):
    state = np.random.choice(N+1, p=P[state])
    traj.append(state)
plt.plot(traj, marker='o')
plt.title('Trayectoria de Gambler\'s Ruin')
plt.xlabel('Paso')
plt.ylabel('Estado')
plt.grid(True)
plt.show()

Este ejemplo muestra cómo la matriz fundamental N = (I‑Q)⁻¹ permite obtener tiempos de absorción y probabilidades de absorción sin simulaciones.

5. Buenas Prácticas y Optimización

  • Usar matrices esparcidas (scipy.sparse) cuando n > 10⁴ para reducir consumo de memoria.
  • Normalizar filas después de cualquier operación que modifique P para garantizar que siga siendo estocástica.
  • Validar ergodicidad (irreducibilidad + aperiodicidad) antes de buscar distribución estacionaria; de lo contrario, la cadena puede tener múltiples distribuciones límite.
  • Evitar bucles infinitos en simulaciones verificando np.isclose(pi_next, pi_current) con tolerancia adecuada.
  • Parallelizar la potencia de matrices usando numpy.linalg.matrix_power en combinación con multiprocessing para grandes exponentes.

6. Resolución de Problemas Comunes (Troubleshooting)

6.1. Filas que no suman 1

Si la suma de una fila difiere de 1, la cadena no es válida. Normalice:

P[i] = P[i] / P[i].sum()

6.2. Valor propio 1 no encontrado

En cadenas no ergódicas, el valor propio 1 puede ser múltiple. En tal caso, seleccione el vector propio correspondiente a la clase recurrente de interés.

6.3. Convergencia lenta

Cadena con alta periodicidad o casi reducible puede requerir cientos de iteraciones. Considere "lazy" version: P_lazy = 0.5 * (I + P) para acelerar la mezcla.

7. Comparación con Modelos Alternativos

Cadena de Markov (Markov Chain, MC)
  • Estados discretos y observables.
  • Transiciones dependientes solo del estado actual.
  • Ideal para procesos de decisión secuencial y análisis de sistemas de colas.
Modelo de Markov Oculto (Hidden Markov Model, HMM)
  • Los estados son ocultos; las observaciones son probabilísticas.
  • Usado en reconocimiento de voz, bioinformática, y análisis de series temporales.
  • Requiere algoritmos de inferencia (Viterbi, Baum‑Welch).

Si tu problema necesita inferir estados no observables, migra a HMM; de lo contrario, una MC simple es más eficiente.

8. Escalabilidad y Rendimiento

  • Para n ≤ 10³, numpy.linalg.eig es suficiente (
  • Para n entre 10³‑10⁵, use scipy.sparse.linalg.eigs con which='LM' y k=1 para el valor propio dominante.
  • En entornos distribuidos (Spark, Dask) convierta P a DataFrame esparcido y aplique multiplicaciones de bloques.

9. Conclusión

Las cadenas de Markov combinadas con álgebra lineal forman una herramienta poderosa para modelar procesos estocásticos. La representación matricial brinda precisión y velocidad, mientras que la simulación permite validar hipótesis en datos reales. Siguiendo las buenas prácticas presentadas, puedes construir modelos robustos, escalables y listos para producción.



Algoritmo de Cadenas de Markov con Álgebra Lineal: Conceptos, Ejemplos en Python y Mejores Prácticas
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 13 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Algoritmo de Matrices Estocásticas en Python: Conceptos, Implementación y Casos Prácticos
Guía completa sobre matrices estocásticas, su teoría, algoritmo de generación y verificación, y ejemplos reales en Python con NumPy y SciPy.