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.
| f objetivo | g propuesta | Por 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 doble | Colas exponenciales ⊃ gaussianas; c ≈ 1,32 |
| Cauchy | Normal | No 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
- 1Soporte acotado.
Uniforme o triangular escalada. c = máx f/g directo. (Beta, triangular a medida)
- 2Soporte [0,∞).
Exponencial con tasa menor que la cola de f. Optimizar μ. (Gamma, Weibull)
- 3Soporte (−∞,∞).
Laplace (doble exponencial) o t de Student: colas pesadas garantizadas. (Normal)
- 4Forma 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.
Envolvente Exp(μ) para Gamma(2,1)
c(μ) = 1 / [μ·e·(1−μ)]
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
- ¿Qué μ minimiza c y qué tasa da? Leelo en el panel con μ = 0,5.
- Subí a μ = 0,9. ¿c sube o baja? ¿La tasa mejora o empeora?
- ¿Por qué μ = 1,2 (fuera del control) sería inválido? Pensá en colas e^(−x) vs e^(−1,2x).
Ver respuestas sugeridas
- μ = 0,5, c ≈ 1,47, tasa ≈ 0,68.
- c sube (~4) y la tasa cae (~0,25): la envolvente flota muy por encima.
- 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.