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.
| Condicional | Teoría Markov | Lectura |
|---|---|---|
| P(1 | 1) | 0,50 | El próximo dado el presente. |
| P(1 | 1, previo 1) | 0,50 | Igual: el 1 anterior no suma. |
| P(1 | 1, previo 0) | 0,50 | Igual: 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:
- 1Clima hoy → mañana.
Con S = {sol, lluvia} suele valer aprox.: el test cierra.
- 2Servidor modo actual.
Vale si la chance solo depende del modo, no de cuánto lleva en él.
- 3Racha autoalimentada.
Dos unos seguidos suben la chance: viola con S = {0, 1}.
- 4Desgaste.
Cuanto más tiempo en 0, más chance de fallar: el pasado pesa.
- 5Reparo: 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).
Test de sin memoria
m = 0 → coinciden · m > 0 → se separan
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
- Con m = 0, ¿las tres barras coinciden? ¿En qué valor?
- Subí m a 0,3. ¿Cuál sube y cuál baja? ¿La brecha tiende a cuánto (2m)?
- Si hay memoria, ¿qué estado ampliado la eliminaría?
Ver respuestas sugeridas
- Sí, en ≈ 0,5 (= 1 − b): el pasado no pesa.
- prev1 sube a ≈ 0,8 y prev0 baja a ≈ 0,2; brecha ≈ 0,6 = 2m.
- 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.