Método de Monte Carlo · Tema 24

Importance Sampling

Muestrear donde importa y corregir con pesos: el truco para colas raras.

01 · Punto de partida

El directo no ve lo raro

Estimar P(N(0,1) > 3) ≈ 0,00135 con muestreo directo y N = 1 000 da casi siempre 0: ningún punto cae en la cola. La solución es sortear de una propuesta q centrada en la cola (N(3,1)) y ponderar cada punto por w = p/q para no sesgar.

Misma media, muchísima menos varianza: cada muestra cuenta.

  • ¿Dónde está lo que importa (cola, pico)?
  • ¿Qué q la visita seguido?
  • ¿Cómo corrijo con w = p/q?
  • ¿Cuánto cae la varianza?

02 · Definición

Sortear de q, promediar con w

🎯

Propuesta q

Distribución fácil que visita lo importante: N(3,1) para la cola > 3.

⚖️

Peso w

w = p(x)/q(x): corrige el cambio. Valores grandes donde q submuestrea.

📊

Estimador

Promedio de w·h: misma esperanza, varianza menor si q imita a |h|·p.

Directo frente a IS para P(N(0,1) > 3).
MétodoMuestras útiles con N = 2 000Error típico
Directo N(0,1)~3 en la cola~80% relativo
IS N(3,1)~1 000 en la cola~5% relativo

03 · Cómo elegir q

Zona→q→Pesos
  1. 1
    Apuntar a |h|·p.

    q debe ser grande donde el integrando aporta: la cola, el pico.

  2. 2
    Cubrir todo.

    q > 0 donde p·h > 0. Si q deja un hueco, el estimador sesga.

  3. 3
    Vigilar los pesos.

    Pesos disparados = q mala. El tamaño efectivo ESS = (Σw)²/Σw² lo delata.

ESS
Tamaño muestral efectivo: de N = 1 000 con pesos dispares quedan 50 útiles. Si ESS < N/3, cambiar q.
q óptima
q ∝ |h|·p: varianza mínima. Inalcanzable perfecta, pero guía el diseño.
Cola pesada en q
q con colas más gordas que p evita pesos infinitos. Ante la duda, q ancha.

04 · Ejemplos

Dónde IS brilla

  1. 1
    Cola normal.

    P(Z > 3) con q = N(3,1): de 0 casos a 1 000 útiles.

  2. 2
    Integral picuda.

    f con pico en 0,9: q triangular cargada ahí en vez de uniforme.

  3. 3
    Riesgo raro.

    Pérdida 1/1000: q con p inflada y peso corrector.

05 · Representación en Python

Directo vs IS, lado a lado

Python en tu navegador. El directo da 0 o tiembla; el IS se clava en 0,00135.

import random
import math

def gauss(mu=0, sigma=1):
    u1, u2 = random.random(), random.random()
    z = math.sqrt(-2*math.log(u1)) * math.cos(2*math.pi*u2)
    return mu + sigma*z

N = 5000
directo = sum(1 for _ in range(N) if gauss() > 3) / N

tot = 0
for _ in range(N):
    x = gauss(3, 1)  # propuesta
    w = math.exp(-x*x/2) / math.exp(-(x-3)**2/2)
    if x > 3:
        tot += w
print("directo:", directo, "(real 0.00135)")
print("IS:", round(tot / N, 5))

06 · Exploración

Laboratorio: cazar la cola > 3

Dos cazadores con igual N: gris tira de N(0,1) y casi no pisa la cola; verde tira de N(3,1) y vive en ella, ponderando. La línea amarilla es 0,00135.

EXPERIMENTO 24

Donde importa, con peso

P(Z > 3) ≈ 0,00135

Los resultados numéricos aparecen debajo.
Directo—
IS N(3,1)—
Casos directos—
Lectura—

Tocá «Cazar cola» para comparar.

Barras logarítmicas: el directo oscila entre 0 y el triple; el IS se pega al valor. Los puntos son muestras en la cola.

Preguntas para explorar

  1. Con N = 500, ¿el directo suele dar 0? ¿El IS?
  2. ¿Por qué el IS no sesga aunque sortee de otra distribución?
  3. ¿Qué pasaría con q = N(5, 0,1) (muy angosta y corrida)?
Ver respuestas sugeridas
  1. Sí: espera 0,7 casos. El IS da ~0,0013 ± 0,0003: caza siempre.
  2. El peso w = p/q compensa exactamente: E_q[w·h] = E_p[h].
  3. Pesos gigantes y ESS mínimo: peor que directo. q debe cubrir, no apuntar con láser.

07 · Comprensión

Confusiones frecuentes

«IS es otro método, otro resultado»

No: estima lo mismo con menos varianza. Si difieren sistemáticamente, hay bug en w.

«Los pesos se pueden ignorar»

Sin w hay sesgo: promediar muestras de q sin ponderar estima E_q, no E_p.

«q más picuda siempre mejor»

No: q muy angosta da pesos explosivos. Mejor ancha que cubra.

«IS elimina el error»

Lo reduce (a veces 100×), no lo elimina: sigue 1/√N con mejor σ.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: directo que falla

Estimá P(Z > 3) directo con N = 1 000 tres veces.

import random
import math

def gauss():
    return math.sqrt(-2*math.log(random.random())) * math.cos(2*math.pi*random.random())

for _ in range(3):
    print(sum(1 for _ in range(1000) if gauss() > 3) / 1000)
Ver solución razonada

Verás 0, 0, 0,002: el directo con N = 1 000 no resuelve 0,00135.

Ejercicio 2: IS que acierta

Repetí con q = N(3,1) y pesos.

import random
import math

def gauss(mu=0):
    return mu + math.sqrt(-2*math.log(random.random())) * math.cos(2*math.pi*random.random())

N = 2000
tot = 0
for _ in range(N):
    x = gauss(3)
    if x > 3:
        tot += math.exp(-x*x/2) / math.exp(-(x-3)**2/2)
print(tot / N)
Ver solución

~0,0013 ± 0,0001: estable donde el directo da 0.

Ejercicio 3: ESS a mano

Calculá el ESS de tus pesos IS.

Ver una posible respuesta
import random
import math

ws = []
for _ in range(2000):
    x = random.gauss(3, 1)
    ws.append(math.exp(-x*x/2) / math.exp(-(x-3)**2/2))
ess = sum(ws)**2 / sum(w*w for w in ws)
print(int(ess), "de 2000")

Verás ~700–900 útiles: sano. Con q mala caería a decenas.

09 · Síntesis

Ideas para recordar

  • IS: sortear de q donde importa, ponderar con w = p/q.
  • Insesgado si q cubre; varianza mínima si q ∝ |h|·p.
  • q ancha que cubra gana a q láser que falla.
  • Vigilar ESS: pesos disparados = q mala.
  • En colas raras, IS convierte 0 casos en miles útiles.

En el próximo tema sistematizaremos el ahorro: las técnicas de reducción de varianza.