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.
| Método | Muestras útiles con N = 2 000 | Error 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
- 1Apuntar a |h|·p.
q debe ser grande donde el integrando aporta: la cola, el pico.
- 2Cubrir todo.
q > 0 donde p·h > 0. Si q deja un hueco, el estimador sesga.
- 3Vigilar 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
- 1Cola normal.
P(Z > 3) con q = N(3,1): de 0 casos a 1 000 útiles.
- 2Integral picuda.
f con pico en 0,9: q triangular cargada ahí en vez de uniforme.
- 3Riesgo 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.
Donde importa, con peso
P(Z > 3) ≈ 0,00135
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
- Con N = 500, ¿el directo suele dar 0? ¿El IS?
- ¿Por qué el IS no sesga aunque sortee de otra distribución?
- ¿Qué pasaría con q = N(5, 0,1) (muy angosta y corrida)?
Ver respuestas sugeridas
- Sí: espera 0,7 casos. El IS da ~0,0013 ± 0,0003: caza siempre.
- El peso w = p/q compensa exactamente: E_q[w·h] = E_p[h].
- 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.