Generación de Variables Aleatorias · Tema 09

Elección de la función envolvente

Cómo elegir g fácil con las colas correctas y calibrar c = sup f/g: la diferencia entre rechazo exacto y sesgo o derroche.

01 · Punto de partida

El rechazo vive o muere por la envolvente

El Tema 8 dio el algoritmo; este tema da el oficio: elegir g. Una g parecida a f con c ≈ 1 da 90 % de aceptación; una g liviana de colas no mayoriza (c = ∞, método imposible); una g válida pero lejana da 5 % y el método es correcto pero inútil.

La regla de oro en una frase: g fácil de muestrear, mismo soporte que f y colas al menos tan pesadas. El resto es optimizar c.

  • ¿Qué tres condiciones debe cumplir g?
  • ¿Cómo se calcula c = sup f/g sin adivinar?
  • ¿Por qué las colas mandan más que el centro?
  • ¿Cuándo conviene una mezcla de envolventes?

02 · Definición

Tres requisitos y una fórmula de c

Sea r(x) = f(x)/g(x). La envolvente válida mínima es c* = sup r(x). Entonces c·g toca a f en al menos un punto y la tasa máxima con esa g es 1/c*.

◉

Soporte cubierto

Si f(x) > 0 entonces g(x) > 0. Un hueco de g con masa de f es sesgo garantizado, por más grande que sea c.

≫

Colas pesadas

g debe decaer igual o más lento que f. Propuesta liviana ⇒ r(x) → ∞ ⇒ c* = ∞ ⇒ no hay envolvente finita.

⚙

Muestreo barato

g debe generarse por inversa directa (uniforme, exponencial, Laplace, triangular). Una g “perfecta” pero costosa anula la ganancia.

Parejas clásicas objetivo–propuesta.
f objetivog propuestaPor qué funciona
Beta(a,b) en [0,1]U(0,1)Mismo soporte acotado; c = máx f
Gamma(2,1)Exp(μ < 1)Cola exp. más pesada; óptimo μ = 0,5
Normal(0,1)Laplace / Exp dobleColas exponenciales ⊃ gaussianas; c ≈ 1,32
CauchyNormalNo funciona: normal liviana, c* = ∞

03 · Anatomía

Cómo calibrar c sin adivinar

1. Derivar cuando se puede
Maximizar ln r(x) = ln f − ln g igualando a cero. Ejemplo guía: Gamma(2,1) vs Exp(μ) da x* = 1/(1−μ) y c(μ) = 1/[μ·e·(1−μ)].
2. Grilla + refinamiento
Evaluar r en grilla densa (log en colas), tomar el máximo y refinar con bisección/Newton local. Sirve para f definidas por código.
3. Optimizar el parámetro
Minimizar c(μ) sobre la familia. En el ejemplo, mín c en μ = 0,5 con c* ≈ 1,47 y tasa ≈ 0,68.
4. Verificar gráficamente
Graficar f vs c·g y r(x) vs c. Tocar en un punto = óptimo; flotar por encima en todos = c derrochador; cortar = inválido.

c óptimo c*

Toca en un punto

c·g besa a f en el modo o en colas. Máxima tasa posible con esa g. Cualquier c menor rompe; mayor derrocha.

c a ojo

Doble riesgo

“Un 20 % de margen” sobre un máximo mal estimado puede seguir cortando el pico real, o duplicar el costo si el margen sobra.

04 · Familias que conviene tener a mano

De la forma de f a la g candidata

soporte + colas→g candidata→c* y tasa
  1. 1
    Soporte acotado.

    Uniforme o triangular escalada. c = máx f/g directo. (Beta, triangular a medida)

  2. 2
    Soporte [0,∞).

    Exponencial con tasa menor que la cola de f. Optimizar μ. (Gamma, Weibull)

  3. 3
    Soporte (−∞,∞).

    Laplace (doble exponencial) o t de Student: colas pesadas garantizadas. (Normal)

  4. 4
    Forma multimodal.

    Una sola g lisa no alcanza: mezcla de envolventes, una por modo (puente al Tema 11).

05 · Representación en Python

Calibrar c por derivada y por grilla

Guía Gamma(2,1) con Exp(μ): f(x) = x·e^(−x). Fórmula c(μ) = 1/[μ·e·(1−μ)] válida para μ < 1; grilla para verificar sin fórmula.

Python en tu navegador. Cambiá μ y verificá que el mínimo de c está en 0,5.

import math

def f_gamma(x):
    return 0.0 if x < 0 else x * math.exp(-x)

def g_exp(x, mu):
    return 0.0 if x < 0 else mu * math.exp(-mu * x)

def c_formula(mu):
    return 1 / (mu * math.e * (1 - mu))  # válida si mu < 1

def c_grilla(mu, xmax=20.0, n=20001):
    best = 0.0
    for i in range(n):
        x = xmax * i / (n - 1)
        g = g_exp(x, mu)
        if g > 0:
            r = f_gamma(x) / g
            if r > best:
                best = r
    return best

for mu in [0.3, 0.5, 0.7, 0.9]:
    print(mu, "fórmula:", round(c_formula(mu), 3),
          "grilla:", round(c_grilla(mu), 3),
          "tasa:", round(1 / c_formula(mu), 3))

Mínimo en μ = 0,5 con c ≈ 1,47 y tasa ≈ 0,68. Con μ ≥ 1 la grilla crece sin techo: señal de c* = ∞.

06 · Exploración

Laboratorio: sintonizar μ para Gamma(2,1)

Movete μ ∈ [0,2 · 0,95]. La curva azul es f; la línea es c(μ)·g. Con μ = 0,5 la envolvente besa a f (óptima). Con μ → 1 la envolvente se dispara; con μ ≥ 1 no hay envolvente finita.

EXPERIMENTO 09

Envolvente Exp(μ) para Gamma(2,1)

c(μ) = 1 / [μ·e·(1−μ)]

Los resultados numéricos aparecen debajo.
c(μ) óptima1,472
Tasa 1/c0,679
Tasa muestral0,679
Aceptadas4 076

Con μ 0,5, c ≈ 1,47 y tasa ≈ 0,68: el óptimo.

Histograma en densidad de aceptadas vs f teórica. Probá μ = 0,9 (envolvente alta, tasa baja) y μ = 0,3.

Preguntas para explorar

  1. ¿Qué μ minimiza c y qué tasa da? Leelo en el panel con μ = 0,5.
  2. Subí a μ = 0,9. ¿c sube o baja? ¿La tasa mejora o empeora?
  3. ¿Por qué μ = 1,2 (fuera del control) sería inválido? Pensá en colas e^(−x) vs e^(−1,2x).
Ver respuestas sugeridas
  1. μ = 0,5, c ≈ 1,47, tasa ≈ 0,68.
  2. c sube (~4) y la tasa cae (~0,25): la envolvente flota muy por encima.
  3. La propuesta decae más rápido (cola liviana): f/g → ∞ y no hay c finita que la cubra.

07 · Comprensión

Confusiones frecuentes

«Cualquier g con el mismo soporte sirve»

Falta la condición de colas. Normal para Cauchy (o Exp(1,2) para Gamma(2,1)) comparte soporte pero r(x) → ∞: c* infinito.

«c es un margen de seguridad a ojo»

c es el supremo exacto de f/g, no un +20 %. El margen va después del supremo real, y se mide en tasa perdida.

«Optimizar μ no cambia mucho»

De μ = 0,9 (tasa 0,25) a μ = 0,5 (tasa 0,68) hay factor 2,7 en costo. En 10⁸ muestras es la diferencia entre horas y un día.

«Si el centro calza, las colas no importan»

Al revés: el centro se valida con poco N; las colas rompen la envolvente donde hay pocas muestras para verlo. Maximizar r en grilla logarítmica.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: óptimo a mano

Minimizá c(μ) = 1/[μ·e·(1−μ)] para μ ∈ (0,1). Derivá o barrré μ y verificá μ* = 0,5.

import math

best = (None, 1e18)
for i in range(1, 100):
    mu = i / 100
    c = 1 / (mu * math.e * (1 - mu))
    if c < best[1]:
        best = (mu, c)
print("mu* =", best[0], " c* =", round(best[1], 3))
Ver solución razonada

μ* = 0,5 por simetría μ(1−μ) máxima en 1/2. c* = 4/e ≈ 1,472. Tasa e/4 ≈ 0,68.

Ejercicio 2: detectar cola liviana

Evaluá r(x) = f/g en x = 0, 5, 10, 20 para Gamma(2,1) vs Exp(1,2). ¿Crece sin techo?

import math

def r(x, mu=1.2):
    f = x * math.exp(-x)
    g = mu * math.exp(-mu * x)
    return f / g

print([round(r(x), 1) for x in [0, 5, 10, 20]])
Ver solución

≈ [0 · 11,4 · 409 · 2e5]: crece exponencialmente. Diagnóstico de c* = ∞ sin necesidad de teoría.

Ejercicio 3: uniforme para Beta, c exacto

Beta(2,5) con U(0,1): hallá el máximo de f(x) = 30x(1−x)⁴ derivando (x* = 0,2) y compará con grilla.

Ver una posible respuesta
def f(x):
    return 30 * x * (1 - x) ** 4

xs = [i / 10000 for i in range(10001)]
print("grilla:", round(max(f(x) for x in xs), 4))
print("f(0.2):", round(f(0.2), 4))

Ambos ≈ 2,4576. Derivada: f′ = 0 ⇒ 1 − 5x = 0 ⇒ x* = 0,2. c* = f(0,2).

09 · Síntesis

Ideas para recordar

  • g: mismo soporte, muestreo barato, colas ≥ f.
  • c* = sup f/g; tasa = 1/c*. Toca en un punto = óptimo.
  • Calibrar por derivada o grilla log en colas, no a ojo.
  • Optimizar el parámetro (μ* = 0,5 en el ejemplo) multiplica la eficiencia.
  • Multimodal ⇒ mezcla de envolventes (Tema 11).

En el próximo tema cuantificaremos ese costo: la eficiencia de aceptación-rechazo.