Método de Monte Carlo · Tema 23

Muestreo directo

Sortear de la distribución que te piden, sin intermediarios: la vía rápida cuando se puede.

01 · Punto de partida

Si podés sortear F, no inventes otra

Muestreo directo es sortear exactamente de la distribución objetivo: exponenciales con logaritmo, normales con Box-Muller o gauss, discretas con cortes. Sin pesos, sin correcciones, sin rechazos.

Es la referencia contra la que se miden importance sampling y rechazos: simple, insesgado y con varianza mínima para ese estimador.

  • ¿Tiene mi F inversa cerrada?
  • ¿Hay función lista en random?
  • ¿El directo es barato por réplica?
  • ¿Cuándo deja de alcanzar?

02 · Definición

Tres directos que cubren el 90%

📐

Inversa cerrada

Exponencial, uniforme, discreta: X = F⁻¹(U) con una línea.

🔔

Construida

Normal por Box-Muller o suma: dos U hacen una campana.

🐍

De librería

uniform, randint, choices, gauss, expovariate: directo ya probado.

Recetario directo.
F objetivoRecetaCódigo
U(a,b)a + (b−a)Urandom.uniform(a, b)
Exponencial(λ)−ln(1−U)/λrandom.expovariate(lam)
Normal(μ,σ)Box-Mullerrandom.gauss(mu, sigma)
Discreta con pesosCortes acumuladosrandom.choices(v, weights)
Bernoulli(p)U < prandom.random() < p

03 · Cuándo alcanza y cuándo no

F simple→Directo→Si no, IS
  1. 1
    Si hay inversa o librería.

    Directo: una línea por muestra, varianza base.

  2. 2
    Si F es rara o truncada.

    Directo con cortes o con normal truncada a mano.

  3. 3
    Si el evento es raro o f pica.

    El directo desperdicia: pasar a importance sampling (tema 24).

Directo gana

Medias y cuerpos

Estimating E[X], áreas centrales, integrales suaves: simple e imbatible.

Directo pierde

Colas raras

P(X > 5) con N = 1 000 da 0 casos: sin muestras no hay estimación.

04 · Ejemplos

Directos de todos los días

  1. 1
    Tiempo entre fallas Exp(0,5).

    Media 2: −ln(1−U)/0.5.

  2. 2
    Costo N(100,15).

    gauss(100, 15) truncado en 0.

  3. 3
    Demanda 30/40/30.

    Cortes 0,3/0,7 con un U.

05 · Representación en Python

Directo a mano y de librería

Python en tu navegador. La versión a mano enseña; la de librería produce.

import random
import math

def exp_manual(lam):
    return -math.log(1 - random.random()) / lam

N = 10000
lam = 0.5
m1 = sum(exp_manual(lam) for _ in range(N)) / N
m2 = sum(random.expovariate(lam) for _ in range(N)) / N
print("manual:", round(m1, 3), "librería:", round(m2, 3), "(teórico 2.0)")
import random

# Normal por Box-Muller a mano (una muestra)
import math
def normal_manual(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

print(round(sum(normal_manual(100, 15) for _ in range(5000)) / 5000, 2))

06 · Exploración

Laboratorio: la exponencial sale del logaritmo

Sorteamos Exp(λ) con −ln(1−U)/λ. El histograma debe copiar la curva teórica λe^(−λx) y la media pegarse a 1/λ.

EXPERIMENTO 23

Directo que se verifica solo

X = −ln(1−U)/λ

Los resultados numéricos aparecen debajo.
Media muestral—
Teórica 1/λ—
P(X > 5)—
Lectura—

Tocá «Sortear» para muestrear.

Barras: tu muestra. Curva blanca: teoría. Con λ chico la cola es larga; con λ grande se aprieta a 0.

Preguntas para explorar

  1. Con λ = 0,5, ¿la media ronda 2? ¿Y con λ = 2?
  2. ¿Por qué P(X > 5) con λ = 2 y N = 500 suele dar 0?
  3. ¿Qué harías si necesitaras esa cola rara?
Ver respuestas sugeridas
  1. Sí: 1/0,5 = 2 y 1/2 = 0,5. El directo es fiel.
  2. La real es e^(−10) ≈ 0,00005: con 500 no cae ni uno. Directo desperdicia.
  3. Importance sampling (tema 24): muestrear donde está la cola y ponderar.

07 · Comprensión

Confusiones frecuentes

«Directo es siempre lo mejor»

Es lo más simple, no lo más eficiente: en colas raras casi no muestrea lo que importa.

«gauss da exacto»

Da muestras exactas de la normal, no el valor exacto: el promedio sigue temblando 1/√N.

«Inversa aproximada vale»

Solo si el error numérico es menor que tu e. Cerca de u = 1 el logaritmo es delicado.

«Todo tiene inversa cerrada»

No: muchas F piden numérica, rechazo o MCMC. El directo cubre lo común, no todo.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: exponencial fiel

Con λ = 1 y N = 10 000, verificá media ~1.

import random

lam, N = 1.0, 10000
print(sum(random.expovariate(lam) for _ in range(N)) / N)
Ver solución razonada

~1,00 ± 0,01. El directo de librería es la referencia.

Ejercicio 2: normal truncada

Costos N(100,15) sin negativos: truncá en 0 y compará la media.

import random

N = 10000
cs = [max(0, random.gauss(100, 15)) for _ in range(N)]
print(sum(cs) / N)
Ver solución

~100,0: truncar en 0 casi no mueve la media porque P(<0) es minúscula.

Ejercicio 3: detectar el límite

Estimá P(Exp(1) > 8) con N = 5 000 directo. ¿Qué ves?

Ver una posible respuesta
import random

N = 5000
print(sum(1 for _ in range(N) if random.expovariate(1) > 8) / N)

Casi siempre 0 (real ≈ 0,0003). El directo no ve colas raras: pide importance sampling.

09 · Síntesis

Ideas para recordar

  • Directo = sortear de F con F⁻¹(U) o librería: promedio simple.
  • Cubre uniforme, exponencial, normal, discretas y Bernoulli.
  • Es la referencia: simple, insesgado, varianza base.
  • Falla en colas raras: sin muestras no hay estimación.
  • En producción, librería; a mano solo para aprender.

En el próximo tema sortearemos donde importa: Importance Sampling.