Procesos Estocásticos y Cadenas de Markov · Tema 20

Propiedad de Markov

Sin memoria: P(futuro | presente, pasado) = P(futuro | presente). Cómo verificarla y qué la rompe.

01 · Punto de partida

¿El pasado aporta algo más?

La cadena está en 1 hoy. Para predecir mañana, ¿sirve saber si ayer fue 0 o 1? Si la respuesta es no, vale la propiedad de Markov: el presente alcanza.

Esta propiedad no se declama: se verifica comparando condicionales. Y cuando falla, la salida es agrandar el estado (Tema 2).

  • ¿P(Xₙ₊₁ | Xₙ) cambia si agrego Xₙ₋₁?
  • ¿Cómo se estima cada condicional desde una historia larga?
  • ¿Qué proceso con rachas viola Markov con S = {0, 1}?
  • ¿Cómo se repara: qué estado ampliado sí es Markov?

02 · Definición

La igualdad que define a Markov

Formal e informal a la vez:

=

Igualdad

P(futuro | presente, pasado) = P(futuro | presente). Dos condicionales, un valor.

#

Test

P(1 | 1, prev 1) ≈ P(1 | 1, prev 0) ≈ P(1 | 1). Si difieren, hay memoria.

⊕

Reparo

Si falla, ampliar S (contar racha, agregar ayer) hasta que el presente alcance.

En la cadena 2×2 del Tema 19, P(Xₙ₊₁ = 1 | Xₙ = 1) = 1 − b sin importar Xₙ₋₁. El laboratorio lo verifica con 20000 pasos.

Con P(0→1) = 0,3 y P(1→1) = 0,5, los tres condicionales coinciden.
CondicionalTeoría MarkovLectura
P(1 | 1)0,50El próximo dado el presente.
P(1 | 1, previo 1)0,50Igual: el 1 anterior no suma.
P(1 | 1, previo 0)0,50Igual: el 0 anterior no resta.

03 · Anatomía

Memoria cero, memoria real y estado

Tres casos ordenan el diagnóstico:

Markov (m = 0)
Los tres condicionales coinciden. El estado actual alcanza.
Con memoria (m > 0)
Difieren: la racha (dos iguales seguidos) cambia la chance. S = {0, 1} es insuficiente.
Estado ampliado
Guardar (actual, previo) o la racha devuelve Markov en un S más grande.
Orden
Cuántos pasos atrás importan: orden 1 = Markov clásico; orden 2 = depende de ayer.

Cumple Markov

Presente suficiente

Clima que solo mira hoy, servidor que solo mira el modo actual.

Viola Markov

El pasado pesa

Rachas que se autoalimentan, desgaste que acumula, turnos con agenda.

04 · Ejemplos

Cuándo vale y cuándo no

La propiedad depende del par (proceso, estado), no del sistema solo:

Estado S→comparar condicionales→Markov sí/no
  1. 1
    Clima hoy → mañana.

    Con S = {sol, lluvia} suele valer aprox.: el test cierra.

  2. 2
    Servidor modo actual.

    Vale si la chance solo depende del modo, no de cuánto lleva en él.

  3. 3
    Racha autoalimentada.

    Dos unos seguidos suben la chance: viola con S = {0, 1}.

  4. 4
    Desgaste.

    Cuanto más tiempo en 0, más chance de fallar: el pasado pesa.

  5. 5
    Reparo: S ampliado.

    (Actual, racha) o (actual, previo) devuelve la igualdad.

05 · Representación en Python

Estimar condicionales contando

En Python, la propiedad se verifica contando transiciones en una historia larga: casos favorables sobre casos posibles para cada condición.

Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Subí la memoria y mirá cómo se separan.

import random

def simular(N=20000, a=0.3, b=0.5, memoria=0.0, semilla=7):
    # memoria=0: Markov. memoria>0: racha 1,1 sube la chance en +memoria.
    random.seed(semilla)
    x, prev, hist = 0, 0, [0]
    for _ in range(N):
        q = (a if x == 0 else 1 - b)
        if x == 1:
            q += memoria if prev == 1 else -memoria
            q = min(0.95, max(0.05, q))
        prev, x = x, 1 if random.random() < q else 0
        hist.append(x)
    return hist

h = simular(memoria=0.0)
print(len(h), h[:12])

Con memoria = 0 el generador es la cadena 2×2 del Tema 19. Con 0,25 mete racha: a igual presente, distinto pasado.

Comparar los tres condicionales

El test numérico de la propiedad:

h = simular(memoria=0.0)

def cond(condicion):
    casos = [h[i+1] for i in range(len(h) - 1) if condicion(h, i)]
    return sum(casos) / len(casos)

print("P(1|1):", round(cond(lambda h, i: h[i] == 1), 3))
print("P(1|1,prev1):", round(cond(lambda h, i: h[i] == 1 and h[i-1] == 1 if i else False), 3))
print("P(1|1,prev0):", round(cond(lambda h, i: h[i] == 1 and h[i-1] == 0 if i else False), 3))

06 · Exploración

Laboratorio: tres barras que deben coincidir

Simulamos 20000 pasos con memoria m ajustable. Las barras estiman P(1|1), P(1|1,prev 1) y P(1|1,prev 0); la línea blanca es la teoría 1−b = 0,5. Con m = 0 las tres coinciden (Markov); con m > 0 se separan (memoria).

EXPERIMENTO 20

Test de sin memoria

m = 0 → coinciden · m > 0 → se separan

Los resultados numéricos aparecen debajo.
P(1|1)0,000
P(1|1,prev1)0,000
P(1|1,prev0)0,000
Brecha0,000

Con m 0,00, las tres rondan 0,500: sin memoria.

Cada barra lleva su conteo de casos: la estimación es sólida porque N = 20000 da miles de visitas al 1. La brecha es la distancia entre las dos barras extremas.

Preguntas para explorar

  1. Con m = 0, ¿las tres barras coinciden? ¿En qué valor?
  2. Subí m a 0,3. ¿Cuál sube y cuál baja? ¿La brecha tiende a cuánto (2m)?
  3. Si hay memoria, ¿qué estado ampliado la eliminaría?
Ver respuestas sugeridas
  1. Sí, en ≈ 0,5 (= 1 − b): el pasado no pesa.
  2. prev1 sube a ≈ 0,8 y prev0 baja a ≈ 0,2; brecha ≈ 0,6 = 2m.
  3. Guardar (actual, previo) o la racha: con ese S ampliado vuelve Markov.

07 · Comprensión

Confusiones frecuentes

«Markov dice que el pasado no existió»

No: dice que el pasado ya está resumido en el presente. El presente es el pasado comprimido.

«Si falla con S chico, no hay modelo»

Hay modelo con S grande. Fallar el test pide ampliar el estado, no abandonar.

«Dos condicionales iguales prueban Markov»

Sugieren, no prueban: hay que comparar en todos los estados y con muchos casos. Es test, no teorema.

«Sin memoria = independencia»

No: Xₙ₊₁ depende de Xₙ (y mucho). Lo independiente del pasado es dado el presente.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: leer la igualdad

Con b = 0,4, ¿qué valor común predicen los tres condicionales P(·|1)? Verificá la fórmula.

b = 0.4
print(1 - b)
Ver solución razonada

0,6: la fila 1 de P es [0,4 – 0,6] y ningún pasado la cambia.

Ejercicio 2: romper Markov a propósito

Sin ejecutar primero: con memoria = 0,3 y base 0,5, ¿qué valores esperás para prev1 y prev0? Comprobalo con el bloque Python.

h = simular(memoria=0.3)

def cond(condicion):
    casos = [h[i+1] for i in range(len(h) - 1) if condicion(h, i)]
    return sum(casos) / len(casos)

print(round(cond(lambda h, i: h[i] == 1 and h[i-1] == 1 if i else False), 3))
print(round(cond(lambda h, i: h[i] == 1 and h[i-1] == 0 if i else False), 3))
Ver solución

≈ 0,8 y 0,2: se separan 0,6 = 2m. Markov rota de forma medible.

Ejercicio 3: reparar con estado ampliado

Definí el estado Yₙ = (Xₙ, Xₙ₋₁) y mostrá que con memoria el próximo depende solo de Yₙ.

Ver una posible respuesta
# Y tiene 4 valores: 00, 01, 10, 11. La regla usa el par completo.
regla = {0: 0.3, (1, 0): 0.2, (1, 1): 0.8}
print(regla[(1, 1)], regla[(1, 0)])
print("Y resume:", "P depende del par, no de más atrás")

Con Y = (actual, previo) la regla es función solo de Y: vuelve Markov en S de 4 estados.

09 · Síntesis

Ideas para recordar

  • Markov: P(futuro | presente, pasado) = P(futuro | presente).
  • Se verifica comparando condicionales con muchos casos.
  • Si difieren, hay memoria: el estado es insuficiente.
  • El reparo es ampliar S (previo, racha) hasta que cierre.
  • En Python: simular con/m sinon memoria y contar transiciones.

En el próximo tema detallaremos los estados: el vocabulario de dónde puede estar la cadena.